- - PR -
繰り返し入力フィールドと表示のみのフィールドの混在方法
1|2|3
次のページへ»
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2007-06-05 00:40
カートシステムのように商品一覧とそれぞれの発注数量等が一括入力・更新できるページを作成しようとしています。イメージとしては以下のような感じです。
まず、こちらのサイトで紹介されているようにActionFormにはコードと数量、備考を保持するインナークラスのList型プロパティを準備しておいて、Actionクラス内ではHibernateを使用してデータベースから商品明細pojoのListを取得後、そのList内の各pojoからコード・数量・備考を取り出してActionFormの初期Listを構築してjspに渡すようにしました。 そこで問題になるのが、前掲のサイトのサンプルではc:forEachを使って入力欄のみを繰り返し表示させていますが、上記イメージのように入力項目ではない情報も表示させたい場合はどのようにすればよいのでしょうか? jspにはpojoのListも渡してはみたものの、フォームListの繰り返しの中で同じインデックスを使用してpojoのListから情報を表示する記述がわかりません。 他のソースと統一感を持たせるためにc:forEachではなく、logic:iterateを使っていますが以下のような感じです。
表示のみの項目もActionForm内のインナークラスにプロパティとして用意しておいて、ActionFormの初期List構築時にそれらもまとめてpojoからコピーしてやればとりあえずはできると思いますが、入力項目ではないものをActionFormに持たせることに違和感…というか無駄を感じます。何か方法がありましたら教えてください。 環境を書き忘れていたので追記します。 JDK1.5.0_11 + Tomcat5.5.23 + Struts1.2.9です。 [ メッセージ編集済み 編集者: マリン 編集日時 2007-06-05 02:04 ] | ||||||||
|
投稿日時: 2007-06-05 20:10
javaファイル
request.setAttribute("KEY", "VALUE"); jspファイル <bean:writer name="KEY"/> 表示 VALUE というヒントだけでもあげてみる | ||||||||
|
投稿日時: 2007-06-06 01:14
ご回答ありがとうございます。Actionクラス側で request.setAttribute("list", getHibernateTemplate().find()で抽出したpojoのList) というようにし、jsp側では ${list[i].name} というようにEL式形式で記述すれば表示ができることは確認しております(最初の投稿時にこの辺の経過も詳しく書いておくべきでした)。 ただ、商品名等はHTMLエンコードが必要な文字も含まれる可能性があるのでEL式形式ではなく、ヒントをいただいたbean:writeタグで表示させたいのですが、html:textタグにおけるindexed属性のようなものもないようでしたし、name属性やproperty属性にどういった記述をすればインデックスを使って参照させられるのかがわかりませんでした。 お手数をおかけして申し訳ございませんがもう少しヒントをいただけるとうれしいです。よろしくお願いいたします。 | ||||||||
|
投稿日時: 2007-06-06 07:52
という記述をみたのできづいてるとおもったのですが気づかなかったみたいですね。 <logic:iterate id="detail" name="ListForm" property="detailList" indexId="i"> id … iterate タグネスト内で strutsタグの name 属性に指定できる。 つまり <bean:writer name="detail"/> という記述ができるのです。 | ||||||||
|
投稿日時: 2007-06-06 11:21
すみませんがおっしゃっている内容がよくわかりません。 ![]() 商品明細情報を表現するクラスはコード、名称、価格、…、数量、備考まで全て網羅したプロパティがあります。一方、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-06-06 12:45
ここまでとは…
logic:iterator は 開始と終了を任意にできるのだが それすら知らないのかな? 検索ででてくるのにヾ( ´ー`)=З | ||||||||
|
投稿日時: 2007-06-06 13:40
offset属性やlength属性は知っていましたがlogic:iterateはループ構造で使うという固定観念のようなものがあったのでコレクションから特定の要素を取り出すためだけに使うという発想がありませんでした。以下のようにして表示できるようになりましたが、杏様の想定されている解決方法と合っていますでしょうか?
| ||||||||
|
投稿日時: 2007-06-06 14:33
このコードが動くとして、結果は想定通りにならないでしょう。 ・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] ・ ・ ・ =========================== |
1|2|3
次のページへ»