- PR -

繰り返し入力フィールドと表示のみのフィールドの混在方法

投稿者投稿内容
マリン
常連さん
会議室デビュー日: 2006/05/28
投稿数: 41
投稿日時: 2007-06-05 00:40
カートシステムのように商品一覧とそれぞれの発注数量等が一括入力・更新できるページを作成しようとしています。イメージとしては以下のような感じです。
コード:

コード 名称  価格 …その他商品明細情報… 数量    備考
0001 商品1  100             数量入力欄 備考入力欄
0002 商品2  200             数量入力欄 備考入力欄
 …
                              【更新】


まず、こちらのサイトで紹介されているようにActionFormにはコードと数量、備考を保持するインナークラスのList型プロパティを準備しておいて、Actionクラス内ではHibernateを使用してデータベースから商品明細pojoのListを取得後、そのList内の各pojoからコード・数量・備考を取り出してActionFormの初期Listを構築してjspに渡すようにしました。
そこで問題になるのが、前掲のサイトのサンプルではc:forEachを使って入力欄のみを繰り返し表示させていますが、上記イメージのように入力項目ではない情報も表示させたい場合はどのようにすればよいのでしょうか?
jspにはpojoのListも渡してはみたものの、フォームListの繰り返しの中で同じインデックスを使用してpojoのListから情報を表示する記述がわかりません。
他のソースと統一感を持たせるためにc:forEachではなく、logic:iterateを使っていますが以下のような感じです。
コード:

<table>
<tr><td>コード</td><td>名称</td><td>価格</td>…<td>数量</td><td>備考</td><tr>
<logic:iterate id="detail" name="ListForm" property="detailList" indexId="i">
<tr>
<td>
<html:hidden name="detail" property="code" indexed="true"/>
${detail.code}
</td>
<td><%-- ここにpojoのListから同じインデックスのpojoを取り出し、nameプロパティを表示したい --%></td>
<td><%-- 同様にpriceプロパティ --%></td>

<td><html:text name="detail" property="amount" indexed="true"/></td>
<td><html:text name="detail" property="note" indexed="true"/></td>
</tr>
</logic:iterate>
</table>


表示のみの項目もActionForm内のインナークラスにプロパティとして用意しておいて、ActionFormの初期List構築時にそれらもまとめてpojoからコピーしてやればとりあえずはできると思いますが、入力項目ではないものをActionFormに持たせることに違和感…というか無駄を感じます。何か方法がありましたら教えてください。

環境を書き忘れていたので追記します。
JDK1.5.0_11 + Tomcat5.5.23 + Struts1.2.9です。

[ メッセージ編集済み 編集者: マリン 編集日時 2007-06-05 02:04 ]
朝日奈ありす
大ベテラン
会議室デビュー日: 2007/05/02
投稿数: 189
お住まい・勤務地: 最北の地
投稿日時: 2007-06-05 20:10
javaファイル
request.setAttribute("KEY", "VALUE");

jspファイル
<bean:writer name="KEY"/>

表示
VALUE

というヒントだけでもあげてみる
マリン
常連さん
会議室デビュー日: 2006/05/28
投稿数: 41
投稿日時: 2007-06-06 01:14
引用:

杏さんの書き込み (2007-06-05 20:10) より:
javaファイル
request.setAttribute("KEY", "VALUE");

jspファイル
<bean:writer name="KEY"/>

表示
VALUE

というヒントだけでもあげてみる



ご回答ありがとうございます。Actionクラス側で
 request.setAttribute("list", getHibernateTemplate().find()で抽出したpojoのList)
というようにし、jsp側では
 ${list[i].name}
というようにEL式形式で記述すれば表示ができることは確認しております(最初の投稿時にこの辺の経過も詳しく書いておくべきでした)。
ただ、商品名等はHTMLエンコードが必要な文字も含まれる可能性があるのでEL式形式ではなく、ヒントをいただいたbean:writeタグで表示させたいのですが、html:textタグにおけるindexed属性のようなものもないようでしたし、name属性やproperty属性にどういった記述をすればインデックスを使って参照させられるのかがわかりませんでした。

お手数をおかけして申し訳ございませんがもう少しヒントをいただけるとうれしいです。よろしくお願いいたします。
朝日奈ありす
大ベテラン
会議室デビュー日: 2007/05/02
投稿数: 189
お住まい・勤務地: 最北の地
投稿日時: 2007-06-06 07:52
引用:

<logic:iterate id="detail" name="ListForm" property="detailList" indexId="i">


という記述をみたのできづいてるとおもったのですが気づかなかったみたいですね。

<logic:iterate id="detail" name="ListForm" property="detailList" indexId="i">

id … iterate タグネスト内で strutsタグの name 属性に指定できる。
つまり
<bean:writer name="detail"/>
という記述ができるのです。
マリン
常連さん
会議室デビュー日: 2006/05/28
投稿数: 41
投稿日時: 2007-06-06 11:21
引用:

杏さんの書き込み (2007-06-06 07:52) より:
<logic:iterate id="detail" name="ListForm" property="detailList" indexId="i">

id … iterate タグネスト内で strutsタグの name 属性に指定できる。
つまり
<bean:writer name="detail"/>
という記述ができるのです。



すみませんがおっしゃっている内容がよくわかりません。
商品明細情報を表現するクラスはコード、名称、価格、…、数量、備考まで全て網羅したプロパティがあります。一方、ActionForm内の繰り返し入力フィールド用インナークラスは入力・更新に関わるコード、数量、備考のプロパティだけ(理由は最初の投稿の最後の方で述べている通り)になっています。

logic:iterateのループ内ではコレクションから取り出された各要素がid属性で指定された変数名にセットされることはわかるのですが、上記の例の通りループ対象になっているのはActionFormのコレクションであってrequest.setAttribute("list", …)でjspに渡してある商品明細情報pojoのListではありません。つまりループ内ではListFormのdetailListから各要素が取り出されてセットされている"detail"(入力・更新関連プロパティのみ)と、ループとは関係なく存在する"list"(商品明細情報pojoのList)が存在していることになると思います。

ここでActionFormのコレクションはActionクラス内でpojoのListから構築しているため、両方のListは同じインデックスで同じ商品情報を保持している前提になるので、indexId属性で指定してある変数を使用して${list[i].name}というようなEL式形式であれば表示させることはできたものの、bean:writeでこれと同じ参照をさせる方法がわからなかったのですが…私は何か勘違いしていますでしょうか?
朝日奈ありす
大ベテラン
会議室デビュー日: 2007/05/02
投稿数: 189
お住まい・勤務地: 最北の地
投稿日時: 2007-06-06 12:45
ここまでとは…
logic:iterator は 開始と終了を任意にできるのだが
それすら知らないのかな?
検索ででてくるのにヾ( ´ー`)=З
マリン
常連さん
会議室デビュー日: 2006/05/28
投稿数: 41
投稿日時: 2007-06-06 13:40
引用:

杏さんの書き込み (2007-06-06 12:45) より:
logic:iterator は 開始と終了を任意にできるのだが
それすら知らないのかな?



offset属性やlength属性は知っていましたがlogic:iterateはループ構造で使うという固定観念のようなものがあったのでコレクションから特定の要素を取り出すためだけに使うという発想がありませんでした。以下のようにして表示できるようになりましたが、杏様の想定されている解決方法と合っていますでしょうか?
コード:
<table>
    <tr><th>コード</th><th>名称</th><th>価格</th>…<th>数量</th><th>備考</th><tr>
    <logic:iterate id="detail" name="ListForm" property="detailList" indexId="i">
        <%-- listからi番目の要素をpojoに取得 --%>
        <logic:iterate id="pojo" name="list" offset="${i}"/>
        <tr>
            <td>
                <html:hidden name="detail" property="code" indexed="true"/>
                ${detail.code}
            </td>
            <td><bean:write name="pojo" property="name"/></td>
            <td><bean:write name="pojo" property="price"/></td>
            …
            <td><html:text name="detail" property="amount" indexed="true"/></td>
            <td><html:text name="detail" property="note" indexed="true"/></td>
        </tr>
    </logic:iterate>
</table>


マーサ
ベテラン
会議室デビュー日: 2004/11/26
投稿数: 87
投稿日時: 2007-06-06 14:33
引用:

マリンさんの書き込み (2007-06-06 13:40) より:

コード:
<table>
    <tr><th>コード</th><th>名称</th><th>価格</th>…<th>数量</th><th>備考</th><tr>
    <logic:iterate id="detail" name="ListForm" property="detailList" indexId="i">
        <%-- listからi番目の要素をpojoに取得 --%>
        <logic:iterate id="pojo" name="list" offset="${i}"/>
        <tr>
            <td>
                <html:hidden name="detail" property="code" indexed="true"/>
                ${detail.code}
            </td>
            <td><bean:write name="pojo" property="name"/></td>
            <td><bean:write name="pojo" property="price"/></td>
            …
            <td><html:text name="detail" property="amount" indexed="true"/></td>
            <td><html:text name="detail" property="note" indexed="true"/></td>
        </tr>
    </logic:iterate>
</table>



このコードが動くとして、結果は想定通りにならないでしょう。

・detailとpojoって、別物(detailにpojoが格納されているのではない)?
・同じ配列数が存在する(リンクが取れている)?

上記コードの結果は以下の様になりますよ?
#コードを忠実にイメージした物ではない。
===========================
detail[0]
 pojo[0]
 pojo[1]
 pojo[2]
 ・
 ・
 ・
detail[1]
 pojo[1]
 pojo[2]
 pojo[3]
 ・
 ・
 ・
detail[2]
 pojo[2]
 pojo[3]
 pojo[4]
 ・
 ・
 ・
===========================

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