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

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

Java struts プルダウン

JAVAでプルダウンを作成しています。 しかしプルダウンの値を設定し、submitを掛けると全ての行のプルダウンの値が同じになってしまいます。 100円 200円 でsubmitを掛けると 200円 200円 になってしまう。 <logic:iterate id="element" name="ActionForm" property="GridList" indexId="idx"> <html:select name="ActionForm" property="selectData" style="margin-left:10px;"> <html:optionsCollection name="element" property="DropDownList" label="label" value="value" /> </html:select> </logic:iterate> selectDataはStringの配列です。 DropDownListにはlabelとvalueのプロパティを持ったBeanを格納しています。 selectDataには「100-150-1日」というハイフン区切りのデータが格納されます。 どこが問題かわかりませんでしょうか。

  • Java
  • 回答数3
  • ありがとう数4

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

  • ベストアンサー
  • 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

  • 【struts】 ActionFormで別のActionFormの配列を定義時

    皆様お疲れ様です。 現在strutsのコーディングをしているのですが躓いている箇所がございましてお力をお借りしたいと思い、質問させていただきます。 ActionForm_Aの中にActionForm_Bの配列型を宣言しています。 //その他変数色々あってその下 private ActionForm_B[] af_b; getter/setterとしては public ActionForm_B[] getActionForm_B() { return af_b; } public void setActionForm_B(final ActionForm_B[] setAfb) { this.af_b = setAfb; } です。jspで表示するのは出来ますが、取得する際に 「javax.servlet.ServletException:BeanUtils.populate」 が表示されてActionForm_Bの配列型が取得出来ません。 indexedもやっていますし、IterateのindexIdも指定しています。 <logic:iterate id ="af_b" name="af_a" property="af_b" scope="request" indexId="index"> <html:hidden name="af_b" property="name1" indexed="true"/> <html:hidden name="af_b" property="name2" indexed="true"/> </logic:iterate> 表示されているhidden部のhtmlは <input type="hidden" name="af_b[0].name1" value="鬼瓦権座武朗"> となっています。 これを表示している画面からsubmitしますと javax.servlet.ServletException: BeanUtils.populate と表示され落ちてしまいます。 これらの情報からなにか気付いた事、ご指摘等がありましたら是非ご意見を頂きたいと思います。 よろしくお願いします。

    • ベストアンサー
    • Java
  • checkboxのvalue値を動的にしたい

    strutsタグのcheckboxのvalue値を動的に変更したいのですがうまく出来ません。 iterateでループし、チェックボックスが複数個(状況によって個数が変化する)できます。 このときvalue値を動的にして、submitしたときにどこのチェックボックスがチェックされたかを知りたい為に動的にしたいと考えています。 見当違いなやり方かもしれません。 どうぞ、ご教授下さい。宜しくお願いいたします <nest:iterate id="selectdata" name="selectAll" indexId="idx"> <tr> <td> <html:checkbox name="selectdata" property="checkBox" value=" ここの値を動的にしたい " /> </td> <td> <bean:write name="selectdata" property="user_id" /> </td> </tr> </nest:iterate> できればbean:writeのuser_idを入れることが出来るのならそれが一番良いのですが・・・ strutsタグのネストは出来ないのでしょうか?

    • ベストアンサー
    • Java
  • Strutsの質問

    今回質問させて頂きたいのは、iterateを使用してたくさんcheckboxを作成し、そのchexboxにチェックされているものをフォームにあるボタンを押した時に、アクション側でそのチェックされている情報を取得したいことです。 現在私が作成しているコードは以下の通りです。 <logic:iterate property="InfoList" IndexId="index" type="jp.co.checkInfo"> <html:checkbox property="targetFlg" indexed="true" value="true" /> </logic/iterate> infoListはチェックボックスのプロパティ(targetFlg)をもつArrayList型(本当は他の情報ももっていてフォームでそれを使用するのですが、今は省略しています)で、typeはプロパティの場所を示しています。 このコードはmultiboxを使用する方法ではうまくいったのですが、checkboxのやり方がうまくいかないのです。 このコードにおいて特にiterate中の「IndexId="index"」やcheckboxの「indexed="true" value="true"」はこだわりはありませんが、他のものは使用して実行させたいのです。 ちなみに現状で実行すると、チェックされている個所がnullpointerでエラー(java.lang.NullPointerException: No indexed value for InfoList[選択している個所])として報告されます。 質問の内容がわかりにくいかもしれません。 その時はご指摘ください。 では、回答よろしくお願いします。

  • <logic:iterate>のデータ表示に関して

    <logic:iterate>を使ってデータの表示を行っています。 データは2つあり、1つは、コードで、もう1つは名称です。 その2つのデータをselectのoptionとして表示したいのですが、 下記ソースにするとoptionのvalueの値がうまく入ってくれず、文字列(<bean:write~)になってしまいます。 うまくデータをいれるにはどうすればよいのでしょうか?? <html:select property="name"> <logic:iterate id="list" name="nameList"> <html:option value="<bean:write name='list' property='code' />"><bean:write name="list" property="name" /></html:option> </logic:iterate> </html:select>

  • Strutsのindexedについてです

    <html:form action="syuu.do" method="post"> <logic:notEmpty name="page3form" property="csvkaku"> <logic:iterate id="kadai9ken" name="page3form" property="csvkaku"> <html:submit property="dispatch1" indexed="true" >修正</html:submit><br><html:submit property="dispatch2" indexed="true">削除</html:submit> </logic:iterate> </logic:notEmpty> このソースで削除ボタンを押すと削除処理Beanに値を保持遷移し(sakujo.java) 修正ボタンを押すと修正画面に値をBeanに保持し遷移する(senni.jsp) に各遷移していくシステムなのですが なぜか、画面表示時に修正ボタン削除ボタンどちらを押しても削除処理をしてしまうのです peropertyは、コンフィグのほうのparameterでしっかり遷移先は書いてあります。 どうしてでしょうか?

  • Strutsでの質問

    Strutsでの質問 いつもお世話になっております。 <html:optionsCollection>使った際の実装のさせ方がわからない為、困っております。 birthday.jsp //省略 生年月日 <html:select property="year" > <html:optionsCollection name="UserCheckForm" property="year_map" value="key" label="value" /> </html:select>年 <html:select property="month" > <html:optionsCollection name="UserCheckForm" property="month_map" value="key" label="value" /> </html:select>月 <html:select property="days" > <html:optionsCollection name="UserCheckForm" property="days_map" value="key" label="value" /> </html:select>日<br/><br/> ActionForm、Actionではどのように定義しておけばいいのでしょうか? ActionFormでは //省略 LinkedHashMap<String, String> year_map = new LinkedHashMap<String, String>(); year_map.put("01", "1970"); year_map.put("02", "1971"); year_map.put("03", "1972"); year_map.put("04", "1973"); year_map.put("05", "1974"); year_map.put("06", "1975"); year_map.put("07", "1976"); year_map.put("08", "1977"); LinkedHashMap<String, String> month_map = new LinkedHashMap<String, String>(); month_map.put("01", "01"); month_map.put("02", "02"); month_map.put("03", "03"); LinkedHashMap<String, String> days_map = new LinkedHashMap<String, String>(); days_map.put("01", "01"); days_map.put("02", "02"); days_map.put("03", "03"); でもこれっておかしいですよね・・・。 ActionFormにはsetterとgetterを実装しなければいけないのに。 setterはこんな感じになるんでしょうか。 public void setYear_map(){ year_map.put("key","value"); } でもこれだと動的にキー名と値が入らず、1個分しか出来ないですよね…。 どうしたらいいかわからないのでどなたか教えて頂ければ幸いです。 また結構なサイトみてますが、イマイチわかりません。 参考URLをご提示の場合はどのへんを参考にすればいいか 教えて頂ければと思います。 申し訳ありませんが、宜しくお願い致します。

    • ベストアンサー
    • Java
  • struts iterateタグ内のデータ取得方法

    DynaActionFormと、iterateタグを用いて、 複数レコードのデータをTEXTフィールドに設定しています(下記参照)。 入力画面(input.jsp)の次に実行されるActionクラスで、 Textフィールドに表示した配列の項目(sckForm[0].sck_no)の値を取得したいのですが、 記述方法がわからず困っています。 どなたかご存知の方がいらっしゃいましたら、教えてください。 (ソース) ■struts-config.xml <form-beans> <form-bean name="sckForm" type="org.apache.struts.action.DynaActionForm"> <form-property name="sck_no" type="java.lang.String" /> <form-property name="sck_nm" type="java.lang.String" /> </form-bean> ■入力画面(input.jsp) <html:form action="/sck_result.do"> <logic:iterate id="sckForm" name="sck.search" scope="application" indexId="index"> <html:text name="sckForm" property="sck_no" indexed="true"/> <html:text name="sckForm" property="sck_nm" indexed="true"/> </logic:iterate> <html:submit property="submit" value="CSV出力" ></html:submit> </html:form> 実際のHTMLは、下記のように変換されています。 <form name="sckForm" method="post" action="/sample/sck/sck_result.do"> <input type="text" name="sckForm[0].sck_no" value="2005-01-002"> <input type="text" name="sckForm[0].sck_nm" value="A"> <input type="text" name="sckForm[1].sck_no" value="2005-01-003"> <input type="text" name="sckForm[1].sck_nm" value="B"> <input type="submit" name="submit" value="CSV出力"> </form>

  • Struts の logic タグの使い方?

    Action でセッションにオブジェクトのリストを登録し、その後、Show.jsp 側でセッションにオブジェクトのリストがある場合は、そのリストを表示するプログラムを作ろうとしています。 実行すると スコープ request にBean ActionFormForSearchResult がありません とエラーになってしまいます。 ActionFormForSearchResult は、オブジェクトのリストを表すオブジェクトで Action が呼び出されたときにセッションに登録します。 jsp の記述は、次のような感じです。 <logic:iterate id="element" name="ActionFormForSearchResult" scope="request"> ><bean:write name="element" property="intCorporationCode" /> </logic:iterate> よろしくお願いします。

    • ベストアンサー
    • Java
  • struts で bean:parameter の指定方法でつまづいています

    いつもお世話になっております。 DBから取得したデータをiterateを使用してボタン表示を行い、ボタンを押されたときのデータを取得しようとしているのですが、 なんともうまくいきません。 1つ前のjavaで、 request.setAttribute("category",cmArray); として定義してあります。 cmArrayはmodelをArrayListに入れたものです。 実際のソースは <logic:iterate id="hyouji" name="category" scope="request"> <html:submit property="submit"><bean:write name="hyouji" property="category_name" /></html:submit> <bean:write name='hyouji' property='category' /> <--デバック用で期待した値がでます。 <bean:write name='hyouji' property='category_sub' /> <--デバック用で期待した値がでます。 <bean:parameter id="strCategory" name="hyouji.category" value="no-name" /> <bean:parameter id="strCategory_sub" name="category_sub" value="no-name2" /> <% System.out.println(strCategory); System.out.println(strCategory_sub); %> </logic:iterate> bean:parameterのnameの所を色々変えて試しているのですが、printlnの所ではvalueに指定した文字が 出てしまう状態です。 タグライブラリを使用せずに、スクリプトレットを使用すれば出来るようになった(OKWaveで解決)のですが、 できればタグライブラリで出来たらと思います。 どなたか分かる方がいましたら、ご教授下さい。

  • Struts 1 で、複数件のフィールドを更新する方法を教えてください。

    <head> <title>登録画面</title> </head> <body> <html:form action="/RegisterData"> ヘッダ:<html:text property="strHeader" /><br> <table border="0"> <logic:iterate id="objRecord" name="BIKO_FORM" property="objBikoList" indexId="intIndex"> <tr> <td>項目<%=(intIndex+1)%></td> <td><html:text name="objRecord" property="strBiko" indexed="true"/></td> </tr> </logic:iterate> <tr> <td colspan="2"><html:submit value="記録する" /></td> </tr> </table> </html:form> </body> このような JSP で、html:text に入力された値を再表示するプログラムを作ろうとしています。 表示は、 <head> <title>登録成功画面</title> </head> <body> <bean:write name="BIKO_FORM" property="strHeader" /> <table border="0"> <logic:iterate id="objRecord" name="BIKO_FORM" property="objBikoList" indexId="intIndex"> <tr> <td>項目<%=(intIndex+1)%>:<bean:write name="objRecord" property="strBiko" /></td> </tr> </logic:iterate> </table> </body> このような感じです。 ActionForm のプロパティは、 private String strHeader; private List<BikoFormDetail> objBikoList; です。 特にセッションに再登録したり、値を変更したりはしないのですが、うまく動作しないのです。iterater で表示した、html:text への画面からの入力値を参照することは、無理なのでしょうか?

    • ベストアンサー
    • Java

専門家に質問してみよう