- - PR -
<logic:iterate>を用いた一覧表示について
1
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2004-10-13 15:19
みなさん、はじめまして。
<logic:iterate>タグを用いたList内容一覧表示に関して質問させてください。 Strutsの勉強として、MSDEと連携し、 リストボックス検索画面(A.jsp)から検索結果を一覧表示する画面(B.jsp) を製造中ですが、画面(B.jsp)内の <logic:iterate>〜</logic:iterate>部分が生成されません。 エラーは出ていませんので、タグで指定したBeanは、存在すると考えています。 また、リストボックス検索画面上で選択されたキーをsessionに格納し、表示されることを確認してますので、キーを検索処理に受け渡すことはできていると考えています。 javaも併行して勉強中ですので、Listへの格納の仕方が問題なのかもしれませんが、 生成されない原因をご存知の方、ご教授ください。 現状を下記に抜粋します。 *struts-config.xml *B.jsp *ListSelectedAction.java *ListSelectedForm.java *FruitsFile.java *InfoList.java ------------------------------------------------------------------------------ [struts-config.xml] <form-beans> <form-bean name="ListForm" type="test.form.ListForm"/> <form-bean name="ListSelectedForm" type="test.form.ListSelectedForm"/> </form-beans> <action-mappings> <action path="/listView" type="test.action.ShowListAction" scope="request" validate="false"> <forward name="success" path="/A.jsp" /> </action> <action path="/listSelected" type="test.action.ListSelectedAction" name="ListForm" scope="request"> <forward name="success" path="/B.jsp"/> </action> <action path="/Ichiran" type="test.action.ForwardAction" name="ListSelectedForm" scope="request"> </action> </action-mappings> ------------------------------------------------------------------------------- [B.jsp] <%@ page contentType = "text/html; charset=Shift_JIS" %> <%@ taglib uri="/tags/struts-bean" prefix="bean" %> <%@ taglib uri="/tags/struts-html" prefix="html" %> <%@ taglib uri="/tags/struts-logic" prefix="logic" %> <html:html locale="true"> <head> <title>タイトル</title> <html:base/> </head> <body bgcolor="white"> <%-- sessionに格納したキーを表示--%> <table border="0"> <tr><td>term</td> <td><bean:write name="InfoList" property="term" filter="true" /> </td></tr> <tr><td>place</td> <td><bean:write name="InfoList" property="place" filter="true" /> </td></tr> </table> <%-- 検索結果の一覧表示 --%> <logic:iterate id="FruitsList" name="FruitsList" scope="request"> <html:form action="/Ichiran" focus="title"> <table bgcolor="#ccffff" border="1" cellspacing="0" cellpading="1" width="95%"> <tr><%-- 名前 --%> <td width="10%">名前<bean:write name="FruitsList" property="fruitsName"/></td> </td> </tr> </table> </html:form> </logic:iterate> </body> </html:html> ------------------------------------------------------------------------------- [ListSelectedAction.java] public class ListSelectedAction extends Action{ public ActionForward execute( ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) { //オブジェクト定義 ListForm listform = (ListForm)form; //パラメータ取得 String term = listform.getTerm(); String place = listform.getPlace(); InfoList info = new InfoList(); info.setTerm(term); info.setPlace(place); //セッションデータ設定 HttpSession session = request.getSession(); session.setAttribute("InfoList",info); //リスト項目を取得する FruitsFile fruitsFile= new FruitsFile(); fruitsFile.setList(term,place); request.setAttribute("FruitsList",fruitsFile.getList()); //アクションフォワードを返す return mapping.findForward("success"); } } ------------------------------------------------------------------------------- [ListSelectedForm.java] public class ListSelectedForm extends ActionForm{ private List list; //コンストラクタ public ListSelectedForm(){ } //一覧情報 public List getList() { return list; } public void setList(List list) { this.list = list; } } ------------------------------------------------------------------------------- [FruitsFile.java] public class FruitsFile { private String fruitsID; //ID private String fruitsName; //名前 private String fruitsType; //種類 private List list = new LinkedList(); //コンストラクタ public FruitsFile(){ } //一覧情報を保存する public void setList(String term, String place){ FruitsList fruitsList = new FruitsList(); //セット String[] fruitsID = fruitsList.getFruitsID(term,place); int i=0; String[] fruitsName = new String[fruitsID.length]; String[] fruitsType = new String[fruitsID.length]; while(i <= fruitsID.length-1 ){ if(fruitsID[i] != null){ fruitsName[i] = fruitsList.getName(fruitsID[i]); fruitsType[i] = fruitsList.getFruitsName(fruitsID[i]); this.setFruitsID(fruitsID[i]); this.setFruitsName(fruitsName[i]); this.setFruitsType(fruitsType[i]); this.list.add(this); i++; }else{ break; } } } public List getList() { return list; } public void setFruitsID(String fruitsID) { this.fruitsID = fruitsID; } public void setFruitsName(String fruitsName) { this.fruitsName = fruitsName; } public void setFruitsType(String fruitsType) { this.fruitsType = fruitsType; } *setListにて、importしたクラス(FruitsList:DBからデータを取得するメソッドを含むクラス)を呼び出してますが、この中身を掲載するとあまりに長くなりますので、割愛させていただきます。setListの動きについては、問題ないことを確認済みです。 ------------------------------------------------------------------------------- [InfoList.java] public class InfoList { private String term; private String place; //コンストラクタ public InfoList() { } //期間 public void setTerm(String term) { this.term = term; } public String getTerm() { return term; } //場所 public void setPlace(String place) { this.place = place; } public String getPlace() { return place; } } ------------------------------------------------------------------------------- どんな些細なことでも、お気づきの点について、ご意見を伺えますと幸いです。 なお環境はjakarta-struts-1.2.2、tomcat-5.0.27を用いています。 よろしくお願いします。 [ メッセージ編集済み 編集者: UriTa 編集日時 2004-10-13 15:22 ] [ メッセージ編集済み 編集者: UriTa 編集日時 2004-10-13 15:23 ] | ||||||||||||
|
投稿日時: 2004-10-13 21:56
Actionの中で request.setAttribute("FruitsList",fruitsFile.getList()); としてListをセットしていますが、この List には FruitsList が1つだけしか入っていませんよね。
もし FruitsList が Listをimplements しているのならいいのですが、そうでないならば 単なるオブジェクトが1つ入っているだけとなります。 ちょっとUriTaさんの作られているクラスの設計がよく分からないのですが、 <logic:iterator>の一般的な使い方をご説明しますと、 FruitsというBeanがあるとします。これは単純に1つのフルーツに1つのクラスです。
これを格納しているListがあるとします。
で、Actionで request.setAttribute("FruitsList", fruitsList); という感じですね。 Actionで request.setAttribute("FruitsList",fruitsFile.getList()); ならば、
という感じでしょうか。 | ||||||||||||
|
投稿日時: 2004-10-14 02:09
aaさん、返信ありがとうございました。
>Actionの中で request.setAttribute("FruitsList",fruitsFile.getList()); として>Listをセットしていますが、この List には FruitsList が1つだけしか入っていませ>んよね。 >もし FruitsList が Listをimplements しているのならいいのですが、そうでないなら>ば 単なるオブジェクトが1つ入っているだけとなります。 Listの捉え方(implementsすること)が全くわかっておりませんでした。 別途FruitsInfoというクラスを作成して、Listの内容(オブジェクト)を格納し、 Listに設定するように変更いたしました。 ------------------------------------------------------------------------------- ([FruitsFile.java]変更箇所) public void setList(String term, String place){ (略) while(i <= fruitsID.length-1 ){ if(fruitsID[i] != null){ fruitsName[i] = fruitsList.getName(fruitsID[i]); fruitsType[i] = fruitsList.getFruitsName(fruitsID[i]); FruitsInfo info = new FruitsInfo(); info.setFruitsID(fruitsID[i]); info.setFruitsName(fruitsName[i]); info.setFruitsType(fruitsType[i]); this.list.add(this); i++; }else{ break; } } ------------------------------------------------------------------------------- 上記に加え、javaの文法的に誤っていた箇所等の修正を行った結果、 デバッグにより、検索結果のデータがListに格納できるところまでは確認できました。 しかし肝心の<logic:iterate>にてList内容を表示することができません。 sessionスコープへの設定も試しましたが、InfoListは表示されるものの、FruitsListは表示されません。 どうぞよろしくお願いします。 | ||||||||||||
|
投稿日時: 2004-10-14 10:33
自己レスです。
解決いたしました。 原因は下記の事項によるものでした。 1)aaさんご指摘の点:Listはimplementsする。 2)javaの文法上の問題:文字列オブジェクトを比較する際equals()等を用いる。 3)List内容に対するゲッターメソッド:1)に関連。FruitsListに設定。 aaさん、閲覧いただいた皆様、ご協力ありがとうございました。 |
1