[mayaa-user:757] List<Bean>要素のListフィールドへのアクセス方法(多重ループ)

Sachiko Suzuki [E-MAIL ADDRESS DELETED]
2009年 3月 6日 (金) 14:17:08 JST


鈴木と申します。

SAStruts+Mayaaの環境において、
2次元配列のデータを使用してテーブルを操作する方法について質問させてください。

リクエストスコープ上のデータは以下の様になっています。

List<CategoryBean>
 ⇒ CategoryBean
    ・categoryName(String)
    ・colspan(int)
    ・rowspan(int)
    ・categoryShowFlg(int)
    ・lowerCategoryName(String)
    ・eachDetailInfoList(List<DetailInfoBean>)

      ⇒ DetailInfoBean
         ・detailName(String)
         ・style(String)

CategoryBeanのListの要素にDetailInfoBeanのリストが存在します。

基本的にはCategoryBeanのdetailNameが行に、DetailInfoBeanが列に相当し
列、行共に可変です。
lowerCategoryNameは出力する場合と、そうではない場合とあり
それに合わせてセルの結合を行なっています。
(categoryNameが大分類、lowerCategoryNameが中分類というイメージです)

--作成したいテーブルのHTML--

<table>
	<tbody>
		<tr>
			<td colspan="2" nowrap>categoryName</td>
			<td>detailName</td>
			<td>detailName</td>
			<td>detailName</td>
		</tr>
		<tr>
			<td rowspan="2" nowrap>categoryName</td>
			<td nowrap >lowerCategoryName</td>
			<td>detailName</td>
			<td>detailName</td>
			<td>detailName</td>
		</tr>
		<tr>
			<td nowrap>lowerCategoryName</td>
			<td>detailName</td>
			<td>detailName</td>
			<td>detailName</td>
		</tr>
		<tr>
			<td colspan="2" nowrap>categoryName</td>
			<td>detailName</td>
			<td>detailName</td>
			<td>detailName</td>
		</tr>
	</tbody>
</table>

以下の様にして実行しました。

--HTML--

<table>
	<tbody id="categoryLoop">
		<tr>
			<td class="topt" id="topcatergory" colspan="0" rowspan="0">
				<span id="toptd">
					<span id="topname">testtop</span>
				</span>
			</td>

			<td class="style25" id="visible">
				<span id="td">
					<span id="middlecatergory">testmiddle</span>
				</span>
			</td>
	
			<td id="detailLoop">
				<div class="style30">
					<span id="color">
						<span id="act">aaaa</span>
					</span>
				</div>
			</td>
		</tr>
	</tbody>
</table>


--mayaa--

<m:for m:id="categoryLoop" m:init="${ var i=0 }"
		m:test="${ i &lt; actionForm.categoryBeanList.size() }" m:after="${ i++ }">
	<m:exec script="${ var categoryRow = actionForm.categoryBeanList.get(i);}"/>
	<m:doBody />
</m:for>

<m:if m:id="topcatergory" test="${ categoryRow.categoryShowFlg == 1 }" />
<m:element m:id="toptd" name="td" >
	<m:attribute name="colspan" value="${  categoryRow.colspan }" />
	<m:attribute name="rowspan" value="${  categoryRow.rowspan }" />
	<m:attribute name="class" value="style_a" />
</m:element>
<m:write m:id="topname" value="${ categoryRow.categoryName }" />


<m:if m:id="visible" test="${ categoryRow.colspan == 0 }" />
<m:echo m:id="topcatergory">
	<m:attribute name="colspan" value="${  categoryRow.colspan }" />
	<m:attribute name="rowspan" value="${  categoryRow.rowspan }" />
</m:echo>
<m:element m:id="td" name="td" >
	<m:attribute name="class" value="style_b" />
</m:element>
<m:write m:id="middlecatergory" value="${ categoryRow.lowerCategoryName }" />
	
<m:for m:id="detailLoop" m:init="${ var i=0 }"
		m:test="${ i &lt; categoryRow.eachDetailInfoList.size() }" m:after="${ i++ }">
	<m:exec script="${ var detail = categoryRow.eachDetailInfoList.get(i);}"/>
</m:for>
<m:echo m:id="color">
	<m:attribute name="class" value="${ detail.style }" />
</m:echo>
<m:write m:id="act" value="${ detail.actString }" />	


上記を実行すると

TypeError: Cannot call method "size" of undefined in script=
i < categoryRow.eachDetailInfoList.size()

となってしまいます。
[mayaa-user:509] <m:forEach>を使った2重ループ
http://ml.seasar.org/archives/mayaa-user/2007-May/000510.html
を参考にさせて頂き、<m:for m:id="detailLoop" ・・・の部分を<m:forEachに変えましたが
どうやらeachDetailInfoListにアクセス出来ないようです。

mayaaを使うようになって、まだ日が浅いので見当違いの方法になっているかもしれませんが
ご教授頂ければ助かります。

よろしくお願いします。


mayaa-user メーリングリストの案内