• ベストアンサー

logic:iterate でのcheckboxの値取得

struts1.3にてDBから2レコード値を取得するとします。 取得の方法はActionクラスでsetAttributeして jsp側ではlogic:iterateで取得しています そこにcheakboxを置きたいと考えています □ 1 名前 年齢 性別 □ 2 名前 年齢 性別 「詳細ボタン」 まず、チェックボックスにチェックされた事をどう判定するのか? 次に、チェックを付けて「詳細ボタン」を押下した後、チェックボックスとDBから取得した値の詳細をどう関連付けるかが分かりません。 教えて下さい。。。

質問者が選んだベストアンサー

  • ベストアンサー
  • sh_hirose
  • ベストアンサー率66% (56/84)
回答No.3

いまいち処理の流れがわからないんだけど・・・。 1.DBからmembership_numberが特定の文字列の一覧を取得する。 2.JSPで1で取得したレコードの一覧を表示する。 3.JSPのチェックボックスにチェックされたレコードのIDを取得する。 これでいいのかな? 1.JSPに遷移する前にDBから取得したレコードをBeanに入れてリクエスト等に入れます。 FirstAction.java public ActionForward execute( ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) {    ・    ・ String sql = "SELECT * FROM item WHERE membership_number = ?"; Connection conn = DriverManager.getConnection("jdbc:odbc:Sample", "aa", "aa" ); Statement st = conn.prepareStatement(sql); st.setString(1, membership_number); ResultSet rs = st.executeQuery(); List<SampleBean> list = new ArrayList<SampleBean>(); while( rs.next() ) { SampleBean bean = new SampleBean(); bean.setId(rs.getString("id")); bean.setName(rs.getString("name")); bean.setAge(rs.getInt("age")); bean.setSex(rs.getString("sex")); list.add(bean); } SampleForm sForm = new SampleForm(); sForm.setChildren(list);    ・    ・ request.setAttribute("form", sForm); return mapping.findForward("success"); } 2.JSPに1でセッションに入れた値を表示します。 JSPはNo.1を参考に・・・。 3.JSPでチェックボックスにチェックを入れた後、submitした先のアクション SecondAction.java public ActionForward execute( ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) { List<String> checks = ((SampleForm)form).getChecks(); for( int i = 0; i < checks.size(); i++ ) { String id = checks.get(i); if( id != null && !check.equals("") ) { // ここで表示されるものがチェックボックスにチェックされたもの System.out.println("id=" + id); } } return mapping.findForward("success"); } ちなみにSQLを使うときで、SQLインジェクション対策のためPreparedStatementを使いましょう。 String aaa = request.getParameter("aaa"); String sql = "SELECT id, name FROM item WHERE id = '" + aaa + "'" というSQLを使用する際にaaaの部分がユーザが入力したものを使用する場合(idはユーザが自由に設定できるとする)、「';DELETE FROM item WHERE 1=1 OR id ='」と入力されたらitemテーブルの中身がすべて削除されてしまいます。

toetou
質問者

お礼

返事遅くなりました。 回答ありがとうございます。 無事にチェックボックスの判定が可能になりました。 しかし、すべてのチェックボックスにチェックがないときに同画面上でエラー出したいと考えているのですが、次のactionクラスでチェックボックスがない時に if(checks.size()==0){ //(2)ActionMessageオブジェクトの生成 ActionMessage am_error = new ActionMessage("チェックボックスを選択してください", "msg"); //(3)ActionMessageオブジェクトの登録 ams_error.add(ActionMessages.GLOBAL_MESSAGE, am_error); //(4)ActionMessagesオブジェクトをエラーメッセージとして登録 saveErrors(request, ams_error); return mapping.findForward("g06001"); で同画面に戻ると <logic:iterate id="bean" property="children" name="form" scope="request" indexId="index">の formがないためエラーになってしまいます。 何かいい方法はありませんか?

toetou
質問者

補足

質問に答えていなかったため答えます。 1.DBからmembership_numberが特定の文字列の一覧を取得する。 2.JSPで1で取得したレコードの一覧を表示する。 3.JSPのチェックボックスにチェックされたレコードのIDを取得する。 であっています。

その他の回答 (4)

  • sh_hirose
  • ベストアンサー率66% (56/84)
回答No.5

追記です。 もし、チェックボックス以外がある場合(html:text等)、セッションに設定するのはエラーチェックしたアクションでも行ってください。 そうしないと入力された内容が空になってしまいます。

  • sh_hirose
  • ベストアンサー率66% (56/84)
回答No.4

requestに設定していますが、sessionに設定しておけばいいと思います。 request.setAttribute("form", sForm);       ↓ request.getSession(true).setAttribute("form", sForm);

  • sh_hirose
  • ベストアンサー率66% (56/84)
回答No.2

No.1です。 <bean:define id="id" property="id" name="bean" /> を <bean:define id="id" property="id" name="bean" type="java.lang.String"/> にしてみてください。 ダメなら <html:multibox value="<%=id%>" property='<%="check[" + index + "]"%>' name="form" scope="request" />&nbsp; を <html:multibox value="<%=id%>" property='<%="check[" + Integer.toString(index) + "]"%>' name="form" scope="request" />&nbsp; にしてみてください。

toetou
質問者

お礼

<bean:define id="id" property="id" name="bean" type="java.lang.String"/> でgetCheckでidを取得できました。 ですが、レコード数が変更されるためDBのcountを数えて それと同じになるまでgetcheckをループさせているのですが、 String sql1="SELECT count(*) FROM item WHERE membership_number = '" + membership_number + "'"; ResultSet rs = stmt.executeQuery(sql); int cnt=0; String id=null; while (rs1.next()) { cnt = rs1.getInt(1); } System.out.println("cnt="+cnt); for(int i=0;i<cnt;i++){ id =g06Form.getCheck(i); System.out.println("id="+id); } チェックが複数個あった場合、最後のidしか取得できないため どうすればいいでしょうか?

  • sh_hirose
  • ベストアンサー率66% (56/84)
回答No.1

SampleBean.java private String id = ""; private String name = ""; private int age = 0; private String sex = ""; public String getId() { return this.id; } public void setId(String id) { this.id = id; } ・ ・ SampleForm.java private List<String> checks = new ArrayList<String>(); priavte List<SampleBean> children = new ArrayList<SampleBean>(); public List<String> getChecks() { return this.checks; } public String getCheck(int index) { return this.checks.size <= index ? "" : this.checks.get(index); } public void setChecks(List<String> checks) { this.checks = checks; } public void setCheck(int index, String check) { while( this.checks.size <= index) { this.checks.add(""); } this.checks.set(index, check); } public List<SampleBean> getChildren() { return this.children; } public void setChildren(List<SampleBean> children) { this.children = children; } SampleAction.java public ActionForward execute( ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) { SampleForm sForm = new SampleForm(); List<SampleBean> list = new ArrayList<SampleBean>(); SampleBean bean = new SampleBean(); bean.setId("1"); bean.setName("山田太郎"); bean.setAge(20); bean.setSex("男"); list.add(bean); bean = new SampleBean(); bean.setId("2"); bean.setName("山田花子"); bean.setAge(20); bean.setSex("女"); list.add(bean); sForm.setChildren(list); request.setAttribute("form", sForm); return mapping.findForward("success"); } JSP <logic:iterate id="bean" property="children" name="form" scope="request" indexId="index"> <bean:define id="id" property="id" name="bean" /> <html:multibox value="<%=id%>" property='<%="check[" + index + "]"%>' name="form" scope="request" />&nbsp; <bean:write property="id" name="bean"/>&nbsp; <bean:write property="name" name="bean"/>&nbsp; <bean:write property="age" name="bean"/>&nbsp; <bean:write property="sex" name="bean"/><br> </logic:iterate> HTML □ 1 山田太郎 20 男 □ 2 山田花子 20 女 >チェックボックスにチェックされた事をどう判定するのか? これでsubmitすればSampleFormのchecksにchildrenにaddした順に値が入ります。 チェックボックスにチェックを入れるとid(1,2,・・・)が入り、チェックを入れないと空文字列が入ります。 >チェックを付けて「詳細ボタン」を押下した後、チェックボックスとDBから取得した値の詳細をどう関連付けるかが分かりません。 checksとchildrenは対になっています。 つまりchecks.get(0)が空文字列なら山田太郎にチェックは入っていません。 checks.get(1)が"2"なら山田花子にチェックが入っています。

toetou
質問者

お礼

ありがとうございます。 >struts1.3にてDBから2レコード値を取得するとします。 レコード数が変化するため、回答のソースを参考に少し変更しました。 ですが、エラーが出てしまいました。 org.apache.jasper.JasperException: JSPのクラスをコンパイルできません: JSPファイル: /pages/g06/G06_003.jsp の中の58行目でエラーが発生しました The method setValue(String) in the type MultiboxTag is not applicable for the arguments (Object) 55: <bean:define id="id" property="id" name="bean" /> 56: </TD> 57: <TD> 58: <html:multibox value="<%=id%>" property='<%="check[" + index + "]"%>' name="form" />&nbsp; 59: </TD> 60: <TD> 61: <bean:write property="id" name="bean"/>&nbsp;

関連するQ&A