- PR -

同一のlogic:iterateで複数のbean:write、から取り出す。

1
投稿者投稿内容
れんれん
常連さん
会議室デビュー日: 2005/07/25
投稿数: 44
投稿日時: 2005-08-01 19:12
こんばんは。

<logic:iterate>と<write:bean>の使い方で、いまいちわからないところがあります。
iterateで取り出す配列を複数にしたいので、
このようにwriteにpropertyを設定しないと、いけないので試しているところです。

たとえば、以下は普通に作動します。これはどの本にも書いてあるやり方です。

<logic:iterate id="Ad" name="SpbomDetailBean" property="dtlkmk">
 <tr>
  <td><font size="2"><b><bean:write name="Ad"/></b></font>
  </td>
 </tr>
</logic:iterate>

しかし、今わたしが呼んでいる本だと次のようにしても、成功しています。

<logic:iterate id="Ad" name="SpbomDetailBean" >
 <tr>
  <td><font size="2"><b><bean:write name="Ad"      
     property="dtlkmk" /></b></font>
  </td>
 </tr>
</logic:iterate>

しかしこれでは、私はエラーになります。
なぜなのでしょうか?
masa
大ベテラン
会議室デビュー日: 2005/05/11
投稿数: 108
投稿日時: 2005-08-01 23:22
こんばんは。

引用:

<logic:iterate id="Ad" name="SpbomDetailBean" >
 <tr>
  <td><font size="2"><b><bean:write name="Ad"      
     property="dtlkmk" /></b></font>
  </td>
 </tr>
</logic:iterate>

しかしこれでは、私はエラーになります。
なぜなのでしょうか?



SpbomDetailBeanがコレクションじゃないからっぽいですね。
れんれん
常連さん
会議室デビュー日: 2005/07/25
投稿数: 44
投稿日時: 2005-08-02 16:29
どうもご返答ありがとうございます。
配列では出来ないということですが、Java初心者すぎてコレクションが説明見てもよくわからないのです。
で、簡単な例文を探すと、大抵コレクションのaddメソッドの()の中に、labelvaluebeanというのが出てきます。

(アクションクラス)
LinkedList list = new LinkedList();
 list.add(new LabelValueBean("ナンバー","1"));

req.setAttribute("list",list);

(JSP画像)
<logic:iterate id="Kaiten1" name="list">
 <tr>
  <td align="right" bgcolor="#ffffff" ><font size="2"><b><bean:write name="Kaiten1" property="label" /></b></font></td>
  <td align="right" bgcolor="#ffffff" ><font size="2"><bean:write name="Kaiten1" property="value" /></font></td>
 /tr>
</logic:iterate>

これで2列の表は問題ないのですが、それ以上増える3列4列といった長い表には対応し切れません。
また、他の本では、アクションの中で、List型のarraylistをつくって、そこにaddでbeanを入れてしまっています。そしてその中のpropertyをwriteで書くということをやっているっぽいのです。
試しにやってみたのですが、エラーにはなりませんが、[Ljava.lang.String;@95a253といった文字が出てしまって実質エラーになってしまいます。

(ABean)
private String[] dtlkmk = {"sa","さす","","","df","","dfd",""};
private String[] dtlhyj = {"dsf","あい","かい","dffd","","ds","",""};

//getter,setterメソッド
public String[] getDtlhyj() {
return dtlhyj;
}
/**
* @param dtlhyj dtlhyj を設定。
*/
public void setDtlhyj(String[] dtlhyj) {
this.dtlhyj = dtlhyj;
}
/**
* @return dtlkmk を戻します。
*/
public String[] getDtlkmk() {
return dtlkmk;
}
/**
* @param dtlkmk dtlkmk を設定。
*/
public void setDtlkmk(String[] dtlkmk) {
this.dtlkmk = dtlkmk;


(アクションクラス)
ABean bean = new SpbomDetailBean();

List list1 = new ArrayList();
 for(int i = 0; i <= 10; i++){
 list1.add(i, bean);
 };

req.setAttribute("list1",list1);

(JSP画像)
<logic:iterate id="Kaiten1" name="list1">
 <tr>
  <td align="right" bgcolor="#ffffff" ><font size="2"><b><bean:write name="Kaiten1" property="dtlkmk" /></b></font></td>
  <td align="right" bgcolor="#ffffff" ><font size="2"><bean:write name="Kaiten1" property="dtlhyj" /></font></td>
 /tr>
</logic:iterate>

どのようにすれば、iterateが成功するのかどなたかお分かりの方お願いします。
YOU@IT
ぬし
会議室デビュー日: 2002/03/29
投稿数: 284
お住まい・勤務地: 大阪
投稿日時: 2005-08-02 16:40
[Ljava.lang.String;@95a253 は、Stringの配列を表す文字列です。
(System.out.println(new String[1]); 等として確認してみて下さい)

今は、String配列の中身が表示されず、Stringh配列そのものが表示されてしまっています。

れんれんさんが扱おうとしているデータ構造を考えてください。

コード:
list1 : List {
  bean : ABean {
    dtlkmk : String[]{"sa","さす","","","df","","dfd",""}
    dtlhyj : String[]{"dsf","あい","かい","dffd","","ds","",""}
  }
  bean : ABean {
    dtlkmk : String[]{"sa","さす","","","df","","dfd",""}
    dtlhyj : String[]{"dsf","あい","かい","dffd","","ds","",""}
  }
  :
  bean : ABean {
    dtlkmk : String[]{"sa","さす","","","df","","dfd",""}
    dtlhyj : String[]{"dsf","あい","かい","dffd","","ds","",""}
  }
}
※注:Javaのコードではなく、擬似コードです。



のように、Listの中にABeanがあって、ABeanの中にString配列がありますよね。
と言う事は、Listをループする処理と、String配列をループする処理の2つの
ループが必要になるはずです。


れんれん
常連さん
会議室デビュー日: 2005/07/25
投稿数: 44
投稿日時: 2005-08-02 19:23
どうもたびたびありがとうございます。

うーん。滅茶苦茶難しいんですね。
そもそもリストに入れるとiterateが配列一個一個を取り出せなくなるのは、予想外でした。
確かに、リスト自体をループしても意味ないですよね。

私はただ、<td><bean:write></td>の数を増やして、横に長い表を作りたいだけなのですが、もっと分かりやすい方法はないのでしょうか?

LabelValueBeanを2つでなく複数にするようにするのが一番早いような気がしてきました。
れんれん
常連さん
会議室デビュー日: 2005/07/25
投稿数: 44
投稿日時: 2005-08-02 21:07
お手数をおかけしました。なんてことはなく、こんな感じでLabelValueBeanのパワーアップができました。
どうもありがとうございました。

public class SLabelValueBean {
private String label = null;
private String value = null;
private String super = null;

public SLabelValueBean(String label, String value,String super){
this.label=label;
this.value=value;
this.super=super;
}

public String getSuper() {
return super;
}
public void setSuper(String super) {
this.super = super;
}

public String getLabel() {
return label;
}
public void setLabel(String label) {
this.label = label;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
}

1

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