- PR -

<logic:iterate>を用いた一覧表示について

1
投稿者投稿内容
UriTa
会議室デビュー日: 2004/10/13
投稿数: 3
投稿日時: 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 ]
aa
ぬし
会議室デビュー日: 2004/01/08
投稿数: 299
投稿日時: 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つのクラスです。
コード:
public class Fruits {
    private String name;

    public String getName() {
      ...
    }

    public void setName(String name) {
      ...
    }
}


これを格納しているListがあるとします。
コード:
List fruitsList = new LinkedList();

fruitsList.add(apple);
fruitsList.add(banana);
fruitsList.add(orange);


で、Actionで request.setAttribute("FruitsList", fruitsList); という感じですね。

Actionで request.setAttribute("FruitsList",fruitsFile.getList()); ならば、
コード:
public class FruitsFile {

    public List getList() {
        return fruitsList;
    }


という感じでしょうか。
UriTa
会議室デビュー日: 2004/10/13
投稿数: 3
投稿日時: 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は表示されません。
どうぞよろしくお願いします。
UriTa
会議室デビュー日: 2004/10/13
投稿数: 3
投稿日時: 2004-10-14 10:33
自己レスです。
解決いたしました。
原因は下記の事項によるものでした。
1)aaさんご指摘の点:Listはimplementsする。
2)javaの文法上の問題:文字列オブジェクトを比較する際equals()等を用いる。
3)List内容に対するゲッターメソッド:1)に関連。FruitsListに設定。

aaさん、閲覧いただいた皆様、ご協力ありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)