プロが教える店舗&オフィスのセキュリティ対策術

JSPに日付、資産名、社員番号、社員名、備考とボタンを各行に配置したテーブルがあります。
ここから資産名をServletに渡して、それを基に別のJSPに別のテーブルを表示させるコードを考えています。

現状のコードは以下(抜き出し)
【JSP】
<table>
<tr>
<td>状態</td>
<td>社員番号</td>
<td>社員名</td>
<td>機種</td>
<td>備考</td>
<td></td>
</tr>

<%
List list = (List)request.getAttribute("list");
int Cnt;
for(Cnt=0; Cnt<list.size(); Cnt++){
Account account = (Account)list.get(Cnt);
%>

<tr>
<!-- Beansに格納したSQLの実行結果を呼び出す -->
<td><%=account.getLendingReturnFlag() %></td>
<td><%=account.getEmployeeCode() %></td>
<td><%=account.getEmployeeName() %></td>
<td><%=account.getMaker() %>

<%=account.getMachineType() %></td>
<td><%=account.getRemarks() %></td>
<td>
<!-- 資産NoをServletに渡すために、hiddenに"No_カウンタ"という名前をつけて格納 -->
<input type="hidden" name="No_" + "<%=Cnt%>" value="<%=account.getAssetNo()%>">

<!-- 資産Noと同じ行のボタンを判別するため、"id_カウンタ"という名前をつけて資産Noを格納 -->
<!-- 現状ではボタンに資産Noが表示されていますが、これは後から「資産詳細」に直す予定 -->
<input id="<%=Cnt%>" name="id_" + "<%=Cnt%>" type="submit" value="<%=account.getAssetNo()%>">
</td>
</tr>

<%
}
%>

</table>

<!-- 現在表示している一覧が何行あるかを"Cnt_sum"という名前をつけて格納 -->
<input type="hidden" name="Cnt_sum" value="<%=Cnt%>">
</form>
<FORM>
<input type="button" value="戻る" onClick="history.back()"></div>
</FORM>


【Servlet】
package history;

import java.io.*;
import java.sql.*;

import javax.servlet.*;
import javax.servlet.http.*;
import db.*;

import java.util.*;

public class HistoryDetailServ extends HttpServlet {
private static final long serialVersionUID = 444896L;
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {

 //エンコードを指定
response.setContentType("text/html; charset=Windows-31J");
request.setCharacterEncoding("Windows-31J");

//前画面でテーブルが何行だったかを呼び出す
int Cnt_sum = Integer.parseInt(request.getParameter("Cnt_sum"));
 //上記のテストコード
System.out.println(Cnt_sum);

String pc_id = "";
String No = "";
String id = "";

 //テーブルの行数分、繰り返しを行うfor文
for(int Cnt=1; Cnt<=Cnt_sum; Cnt++){
 //"No_カウンタ"という名前で格納されている値を呼び出す(資産No)
No = request.getParameter("No_" + Cnt);

 for(int Cnt_2=1; Cnt_2<=Cnt_sum; Cnt_2++){
 //"id_カウンタ"という名前で格納されている値を呼び出す(資産No)
id = request.getParameter("id_" + Cnt_2);

 //上記のテストコード
System.out.println(No);
System.out.println(id);

 //上記2つの値が等しいときに処理を行うif文
if(No==id){
 //SQLの取得に使用する変数に、Noを格納
pc_id = No;
 //上記のテストコード
System.out.println(pc_id);
}
 }
}

//DB接続
ServletContext sc = getServletContext();
DbControl db_Con = new DbControl(sc);

try{


となっています。

テスト用のコードの実行結果(コンソールに出力しました)を見ると、テーブルが何行だったかを示すCnt_sumは正しくServletに渡っているようですが、残る3つはnullが返ってきてしまいました。

for文のあたりからが怪しいのは判るのですが、値を取得するコードに間違いがあるのか、for文そのものに問題があるのか・・・など考えたまま数時間経っても解決しなかったので質問させていただきます。

A 回答 (1件)

No+カウンタ


<input type="hidden" name="No_" + "<%=Cnt%>" value="<%=account.getAssetNo()%>">
ってあるけど、name属性が「"No_" + "<%=Cnt%>"」ってなってるよ。
属性に「+」って使えたっけ?

id+カウンタ
<input id="<%=Cnt%>" name="id_" + "<%=Cnt%>" type="submit" value="<%=account.getAssetNo()%>">
これってtypeがsubmitになってるよ。
だからないんじゃない?

その他
<FORM>
<input type="button" value="戻る" onClick="history.back()"></div>
</FORM>
<div>の開始タグがないのに閉じタグがあるよ。
    • good
    • 1
この回答へのお礼

お礼が遅くなって申し訳ありません;

name属性に「+」は使えないんですか?
なるほど、それでServlet側でprintoutすると「name_null」と表示されていたんですね。

id+カウンタで回している側は仕様としてボタンを配置しているので、直接ボタンに値を入れようかと思ったのですが・・・渡すのには不都合がある・・・んですかね。

最後の<div>の開始タグは抜粋した位置より前にありました。
切る位置が悪かったようで、ご迷惑おかけしました;

結局値を2つ渡すのは諦めて、
<button type="submit" value=="<%=account.getAssetNo()%>">資産詳細</button>
として各ボタンそれぞれに値を入れてsubmitし、Servletで改めてAssetNoを基にほかのデータを取得することにしました。

今回は上記の形で作成し、土日など空いた日を使って最初の内容での実現方法も続けたいと思います。

長いコードになってしまったにも関わらず、細かく目を通していただきありがとうございました。

お礼日時:2009/07/24 23:00

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A