- PR -

arrayタイプのデータを区切って表示

投稿者投稿内容
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2006-12-26 18:11
「<3>の時は[3]を見る」の「見る」という表現がイマイチわからないのですが・・・。
要するに logic:iterate の動作が期待通りにいかない、もう少し具体的に言うと「indexid で指定した変数が offset で指定した値から始まることを期待しているけど 0 から始まってしまう」ということを問題としているのでしょうか?
もし違ったとしても、こういった形で何が問題としているのか具体的に説明するとわかりやすいですよ
すると、提示するサンプルコードももっとシンプルにできますよね

であれば logic:iterate についてどういう動作を期待すべきなのか確認するため、ドキュメントをご覧になってはいかがでしょう。

[ メッセージ編集済み 編集者: インギ 編集日時 2006-12-26 18:24 ]
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2006-12-26 18:13
ドキュメントはここらへんかな?
http://struts.apache.org/1.2.9/userGuide/struts-logic.html#iterate
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2006-12-26 18:21
logic:iterate タグの仕様はよく知らないのですが、ソースを見てみました。
ここらへんですね。
http://svn.apache.org/viewvc/struts/struts1/tags/STRUTS_1_2_9/src/share/org/apache/struts/taglib/logic/IterateTag.java?view=markup

まず、indexid をセットしているところを確認すると、
コード:
           if (indexId != null) {

pageContext.setAttribute(indexId, new Integer(getIndex()));
}

]
getIndex() から取得した値で初期化していることがわかります。
getIndex() メソッドをみると
コード:
   /**

* <p>Return the zero-relative index of the current iteration through the
* loop. If you specify an <code>offset</code>, the first iteration
* through the loop will have that value; otherwise, the first iteration
* will return zero.</p>
*
* <p>This property is read-only, and gives nested custom tags access to
* this information. Therefore, it is <strong>only</strong> valid in
* between calls to <code>doStartTag()</code> and <code>doEndTag()</code>.
* </p>
*/
public int getIndex() {
if (started)
return (offsetValue + lengthCount - 1);
else
return (0);
}


とあります。
確かに オフセットを指定している場合はそこから値が始まりそうな気がしますね。
なんででしょう??

Struts のサンプルアプリケーションに indexid と offset を使った例はないでしょうか?
あればそれを参考にすると良いかもしれませんね。

[ メッセージ編集済み 編集者: インギ 編集日時 2006-12-26 18:30 ]
Jaune
会議室デビュー日: 2006/12/02
投稿数: 16
投稿日時: 2006-12-26 22:54
<logic:iterate id="csvRow" collection='<%= array %>' offset="kai" length="3" indexId="x">

ではなく

<logic:iterate id="csvRow" collection='<%= array %>' offset="<%= kai %>" length="3" indexId="x">

でだめでしょうか?試していないので成否は解りかねますが・・・
Kazuki
ぬし
会議室デビュー日: 2004/10/13
投稿数: 298
投稿日時: 2006-12-27 08:08
引用:

初心者マークさんの書き込み (2006-12-26 17:49) より:
kai,j,iを宣言すれば、そのまま動きます。



ということなので試してみたが動かず。
strutsでしたかorz

出勤時間なので続きはまた。
にぃにぃ
ベテラン
会議室デビュー日: 2006/10/19
投稿数: 70
投稿日時: 2006-12-27 14:10
>Struts のサンプルアプリケーションに indexid と offset を使った例はないでしょう>か?
>あればそれを参考にすると良いかもしれませんね。

動的にoffsetの変数が変更するものがサンプルにも見つからず困っています。
Smz
会議室デビュー日: 2006/11/22
投稿数: 9
投稿日時: 2006-12-27 14:18
これでいけます。
iterateタグのクラスで
ページコンテキストからkaiが取得できてないのが原因ですかね。(恐らく
なのでoffsetに与える引数をちょっと弄りました。

<%
java.util.ArrayList array = new java.util.ArrayList();
array.add("ひ");
array.add("ふ");
array.add("み");
array.add("よ");
array.add("いつ");
array.add("む");
array.add("なな");
array.add("や");
array.add("ここ");
array.add("と");
Integer kai = new Integer(0);
int j = 0;
int i = 0;
while(j < (array.size() / 3)){%>
<logic:iterate id="csvRow" collection='<%= array %>' offset="<%= kai.toString() %>" length="3" indexId="x">
<%= kai %>[<%= x %>]<bean:write name="csvRow" /><br>
<% i++; %>
</logic:iterate>
<br>
<% j++;
kai = i;
} %>

手っ取り早くならkaiをIntegerクラスのインスタンスとすればoffsetにkai.toString値入れられますよね。

因みにoffsetの処理アルゴリズムはこんな風になってました。(offsetはStringクラスです。)
struts:IterateTag.javaのdoStartTagメソッドより抜粋
if (offset == null) {
offsetValue = 0;
} else {
try {
offsetValue = Integer.parseInt(offset);
} catch (NumberFormatException e) {
Integer offsetObject = (Integer) TagUtils.getInstance().lookup(pageContext, offset, null);
if (offsetObject == null) {
offsetValue = 0;
} else {
offsetValue = offsetObject.intValue();
}
}
}
if (offsetValue < 0) {
offsetValue = 0;
}

追記:このままではarrayの10番目に入っている文字「array.add("と");」は出力されませんので、変更必要かと思われます。(whileの判定条件)

[ メッセージ編集済み 編集者: Smz 編集日時 2006-12-27 14:24 ]
Smz
会議室デビュー日: 2006/11/22
投稿数: 9
投稿日時: 2006-12-27 16:21
kai をIntegerのインスタンスにするまでもなかったです。(^^

Integer.toString(kai)でいいですね。

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