- - PR -
StrutsのActionForm内のネスとしたListの値の送信方法
1
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2007-05-10 17:49
いつも参考にさせていただいております。
現在StrutsのActionForm内でArrayListを作成し、さらに そのListの中にArrayListを作り、JSPのlogic:iterateタグを 二重ループにして表示させています。 下記のような処理を実装したところ、画面への表示は 正常に行えるようになったのですが、JSPからActionを呼び出したときに、 子クラスのGroupTypeがうまく取得できません。 試しにParentForm内に子クラスのGroupTypeクラスとgetGroup(int iIndex) メソッドを書いてみたのですがwork[0]のGroupTypeのみは取得できたのですが、 (当たり前ですが)work[1]以降のGroupTypeが取得できません。 Strut超初心者のため、考えられる方法がかなり乏しいのですが、 どなたか良い方法をご存知であればご教授頂ければと思います。 (この方法に拘るつもりはありません。単に親:子が1:Nのデータを 表示・取得することが目的です) 長い説明になってしまい、申し訳ございませんがよろしくお願いいたします。 ※Getter/Setter等は省略させて頂きます。 /***************** ** 親ActionForm ******************/ public class ParentForm extends ActionForm { private List work = new ArrayList(); public ChildForm getWork(int iIndex) { while (this.work.size() <= iIndex){ this.work.add(new ChildForm()); } return (ChildForm)this.work.get(iIndex); } public Object[] getWork() { return work.toArray(); } public int getWorkSize() { return this.work.size(); } } /***************** ** 子クラス ******************/ public class ChildForm{ private String AAA; private String BBB; private List group = new ArrayList(); public GroupType getGroup(int iIndex) { while (this.group.size() <= iIndex) { this.group.add(new GroupType()); } return (GroupType)this.group.get(iIndex); } public Object[] getGroup() { return group.toArray(); } public int getGroupSize() { return this.group.size(); } public class GroupType{ private String XXX; private String YYY; private String ZZZ; } } //*******JSP ******* // <logic:iterate id="work" name="ParentForm" property="work" indexId="idx"> <html:text name='work' indexed="true" property="AAA"/> <html:text name='work' indexed="true" property="BBB"/> <logic:iterate id="group" name="work" property="group" indexId="id"> <html:text name='group' property="XXX" indexed="true"/> <html:text name="group" property="YYY" indexed="true"/> <html:text name="group" property="ZZZ" indexed="true"/> </logic:iterate> </logic:iterate> //*******実際に作成されているHTML ******* // <input type="text" name="work[0].AAA" value="AAAAAAAAA"> <input type="text" name="work[0].BBB" value="BBBBBBBBB"> <input type="text" name="group[0].XXX" value="らり" > <input type="text" name="group[0].YYY" value="るれ" > <input type="text" name="group[0].ZZZ" value="ろ" > <input type="text" name="group[1].XXX" value="あい" > <input type="text" name="group[1].YYY" value="うえ" > <input type="text" name="group[1].ZZZ" value="お" > <input type="text" name="work[1].AAA" value="CCCCCCCCC"> <input type="text" name="work[1].BBB" value="DDDDDDDDD"> <input type="text" name="group[0].XXX" value="ま" > <input type="text" name="group[0].YYY" value="み" > <input type="text" name="group[0].ZZZ" value="む" > <input type="text" name="group[1].XXX" value="め" > <input type="text" name="group[1].YYY" value="も" > <input type="text" name="group[1].ZZZ" value="は" > <input type="text" name="group[2].XXX" value="ひ" > <input type="text" name="group[2].YYY" value="ふ" > <input type="text" name="group[2].ZZZ" value="へ" > //*******Action (値セット時)******* // for( int i=0; i < Sample.getWorkSize(); i++ ) { dForm.getWork(i).setAAA( 値 ); dForm.getWork(i).setBBB( 値 ); for(int y=0; y< Length.getWork(i).getGroupSize(); y++) { dForm.getWork(i).getGroup(y).setXXX(値); dForm.getWork(i).getGroup(y).setYYY(値); dForm.getWork(i).getGroup(y).setZZZ(値); } } | ||||||||||||
|
投稿日時: 2007-05-10 20:44
ClassCastException とかいう例外でてない??
| ||||||||||||
|
投稿日時: 2007-05-10 23:10
今、手元にソースが無いので正確なエラーの種類はわからないのですが、 現状のソースではエラーが発生します。 やはり、JSPからListの中のListの値はActionFormでセット出来ない ものなのでしょうか。 可能か不可能かということもわからないので、既に数日悩んでいる状況です。。 | ||||||||||||
|
投稿日時: 2007-05-12 00:40
セッター、ゲッターが型変換してるのが原因のひとつ
| ||||||||||||
|
投稿日時: 2007-05-12 13:17
ピンポイントで答えを貰えているのに…。 デバッグの基本はエラーメッセージを見ること。 だから、「エラーが出た」という類の質問ではエラーのスタックトレースを全文添付すること。 していない場合は大抵つけろと指摘される。 例外の種類を見ればどの方向性の問題なのかわかる。 今の場合はClassCastExceptionってのが発生していると思われる。 これは、
といった場合に発生する。 このあたりの動作原理が理解できればどこをどう直せばよいのかわかる。 という寸法。 | ||||||||||||
|
投稿日時: 2007-05-12 17:45
/**
* import/package割愛 **/ public class Form extends Action Form { public class Chilled { private String primary; private String secondary; public void setPrimary(String primary) { this.primary = primary; } public void setSecondary(String secondary) { this.secondary = secondary; } public String getPrimary() { return primary; } public String setSecondary() { return secondary; } } List<Child> list = new ArrayList<Child>(0); public void setList(List<Child> list) { this.list = list; } public List<Child> getList() { return list; } } えさをあげてみよう。 |
1