• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:Java struts プルダウン)

Javaでプルダウンの値が同じになる問題

このQ&Aのポイント
  • Javaでプルダウンを作成していますが、submitを掛けると全ての行のプルダウンの値が同じになってしまいます。
  • 具体的には、100円、200円という値があり、submitを掛けると全ての行が200円になります。
  • <logic:iterate>タグと<select>タグを使用してプルダウンを生成しています。selectDataはStringの配列で、DropDownListにはlabelとvalueのプロパティを持ったBeanを格納しています。

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

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

HTMLになおすと <select name="selectData" style="margin-left:10px;"> <option value=""></otption> ・ ・ ・ <option value=""></otption> </select> <select name="selectData" style="margin-left:10px;"> <option value=""></otption> ・ ・ ・ <option value=""></otption> </select> ・ ・ ・ <select name="selectData" style="margin-left:10px;"> <option value=""></otption> ・ ・ ・ <option value=""></otption> </select> となります。 つまりselectタグのnameが全て同じになってしまい、最後のselectで選択されたものになってしまいます。 これを回避するには JSP ---- <logic:iterate id="element" name="ActionForm" property="GridList" indexId="idx"> <html:select name="ActionForm" property='<%=selectData[" + idx + "]"&>' style="margin-left:10px;"> <html:optionsCollection name="element" property="DropDownList" label="label" value="value" /> </html:select> </logic:iterate> ActionForm --- private String[] selectData; // 初期化をここでする。 public String getSelectData(int index, String data) { this.selectData[index] = data; } public void setSelectData(int index) { return this.selectData[index]; } ActionFormでこのようなゲッター、セッターを作成します。

ShimantoGa
質問者

お礼

回答ありがとうございます。 試してみましたが、色々と問題点があります。 JSP--------------------------------------- <logic:iterate id="element" name="ActionForm" property="GridList" indexId="idx"> <html:select name="ActionForm" property='<%= "selectData[" + idx + "]" %>' style="margin-left:10px;"> <html:optionsCollection name="element" property="DropDownList" label="label" value="value" /> </html:select> </logic:iterate> ActionForm------------------------------------ private String[] selectData; public String getSelectData(int index) { return this.selectData[index]; } public void setSelectData(int index, String selectData) { this. selectData[index] = selectData; } 以上で実行すると以下のエラーが発生します。 javax.servlet.ServletException: org.apache.jasper.JasperException: An exception occurred processing JSP page org.apache.struts.chain.ComposableRequestProcessor.process org.apache.jasper.JasperException: An exception occurred processing JSP org.apache.jasper.servlet.JspServletWrapper.handleJspException java.lang.ArrayIndexOutOfBoundsException 理解できる範囲では、Indexの範囲外と言われています。 ご提示いただいたものより何箇所か修正しているのですが、この書き方であっていますでしょうか?

その他の回答 (2)

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

>submitで初期化されることはなくなったのですが、行追加した時点で初期化されてしまいます。 これはどういうことですか? 今までに出ている仕様で行の追加というのがないのですが・・・^^; クライアント側で行を動的に追加できるということですか? そうだとして以下は説明します。 submitして行を追加する場合 Action側で String[] selectData = new String[form.getSelectData().length + 2]; for( int i = 0; i < form.getSelectAllData().length; i++ ) { selectData[i] = form.getSelectAllData(i); } form.setSelectAllData(selectData); submitせずに行を追加する場合(JavaScriptなど) ActionFormで public void setSelctData(int index, String data) { if( this.selectData.length() <= index ) { String[] newData = new String[index + 1]; for( int i = 0; i < this.selectData.length(); i++ ) { newData[i] = this.selectData[i]; } this.selectData = newData; } this.selectData[index] = data; }

ShimantoGa
質問者

お礼

>今までに出ている仕様で行の追加というのがないのですが・・・^^; 大変失礼しました、私の説明不足です。 上記の処理にて動作させることが出来ました。 ありがとうございました。

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

private String[] selectData; // 初期化をここでする。 private String[] selectData = {"", "", "", ""}; こんな感じで初期化してください。

ShimantoGa
質問者

お礼

ありがとうございます!! >private String[] selectData = {"", ""}; 以上の処理で問題の一部は解決できました。 しかし、この初期化方法では動的に行数が増えるものに対して対応できません。 上記では二行目までは正常に表示されますが、三行目からは java.lang.ArrayIndexOutOfBoundsException となってしまいます。 どのように対処すればよいでしょうか?

ShimantoGa
質問者

補足

失礼しました。 下記の、配列の要素数を動的に増やすことはできました。 Action-------------------------- String[] Array = new String[SelectData.length + 1]; ActionForm.setSelectData(Array); しかし、現在以下の問題が発生しています。 ActionForm---------------------- public void setSelectData(int index, String SelectData) { this. SelectData[index] = SelectData; } public String[] getSelectData() { return this.SelectData; } public void setSelectAllData(String[] SelectData) { //配列数を動的に増やす時に必要? this.SelectData= SelectData; } としていますが。 submitで初期化されることはなくなったのですが、行追加した時点で初期化されてしまいます。 100円 200円 ↓ 100円//一番先頭の要素に初期化される? 100円

関連するQ&A

専門家に質問してみよう