如何迭代和索引OGNL / Struts2中的列表列表?

时间:2012-04-11 14:12:02

标签: struts2 ognl

我有一个像这样的个人资料:

public List<List<String>> getAvailablePassengersJS()

我希望为外部List中的每个元素创建一个表,并为内部List中的前五个位置中的每一个创建一列。 我试过用这个:

<s:iterator value="ssn.docked.AvailablePassengersJS" var="line">
<tr>
    <td><s:property value="line[0]"/></td>
    <td><s:property value="line[1]"/></td>
    <td><s:property value="line[2]"/></td>
    <td><s:property value="line[3]"/></td>
    <td><s:property value="line[4]"/></td>
</tr>
</s:iterator>

但是,输出是100多行完全空白的列:

<tr>
    <td></td>
    <td></td>
    <td></td>
    <td></td>
    <td></td>
</tr>

我知道数据已正确填充。当我这样做时:

<s:iterator value="ssn.docked.AvailablePassengersJS" var="line">
<tr>
    <td><s:property/></td>
</tr>
</s:iterator>

我得到100多行,如下所示:

<tr>
    <td>[2236, Middle, Onbenbosin Bawed, true, You can book Tritho Fonand]</td>
</tr>

当我这样做时:

<s:iterator value="ssn.docked.AvailablePassengersJS" var="line">
<tr>
    <td><s:property value="line"/></td>
</tr>
</s:iterator>

我得到一个例外:

java.lang.ClassCastException: java.util.ArrayList incompatible with java.lang.String

所以我知道“line”解析为ArrayList。 Everything I've read about OGNL似乎暗示我应该能够通过[]表示法索引数组。我尝试了更多{},#等组合,我不会给你带来负担也无济于事。 任何人都可以解释为什么这不起作用以及我需要做些什么来使它工作?

更新

尝试下面的Quaternion建议我使用了这段代码:

<s:iterator value="ssn.docked.AvailablePassengersJS" var="line">
<tr id="availPass<s:property value="#line[0]"/>">
    <td><s:property value="#line[1]"/></td>
    <td><s:property value="#line[2]"/></td>
    <td><s:checkbox key="#line[3]" value="false" theme="simple"/>&nbsp;Book</td>
</tr>
</s:iterator>

主要是有效。不幸的是,复选框失败了:

<tr id="availPass151570">
    <td>Low</td>
    <td>Andadicko Ostan</td>
    <td><input type="checkbox" name="#line[3]" value="true" id="#line_3_"/><input type="hidden" id="__checkbox_#line_3_" name="__checkbox_#line[3]" value="true" />&nbsp;Book</td>
</tr>

如果我不使用密钥,则id或value的组合也不起作用。 如果我只是名字和身份:

<td><s:checkbox name="#line[3]" id="#line[3]" value="false" theme="simple"/>&nbsp;Book</td>

如果不解决它:

<td><input type="checkbox" name="Book" value="true" id="#line3"/><input type="hidden" id="__checkbox_#line3" name="__checkbox_Book" value="true" /></td>

如果我只使用名字:

<td><s:checkbox name="#line[3]" value="false" theme="simple"/>&nbsp;Book</td>

它也不起作用:

<td><input type="checkbox" name="#line[3]" value="true" id="#line_3_"/><input type="hidden" id="__checkbox_#line_3_" name="__checkbox_#line[3]" value="true" />&nbsp;Book</td>

如果我只使用id,我会收到一些内部错误:

    <td><s:checkbox id="#line[3]" value="false" theme="simple"/>&nbsp;Book</td>
    <td><input type="checkbox" name="<!-- FREEMARKER ERROR MESSAGE STARTS HERE -->...
Expression parameters.name is undefined on line 23, column 32 in template/simple/checkbox.ftl.
The problematic instruction:
----------
==> ${parameters.name?html} [on line 23, column 30 in template/simple/checkbox.ftl]

为什么复选框的参数需要与属性不同的语法?

2 个答案:

答案 0 :(得分:1)

private List<List<String>> listOfLists;

public List<List<String>> getListOfLists() {
    return listOfLists;
}

public void setListOfLists(List<List<String>> listOfLists) {
    this.listOfLists = listOfLists;
}




    <s:iterator var="list" value="%{listOfLists}">
        <s:iterator var="list" value="#list" status="stat">
              <s:property value="#list[#stat.index]"/> //by index.
        </s:iterator><br/>
    </s:iterator>

答案 1 :(得分:0)

这是一个老问题,但对于其他人,您需要使用%{listname[index]}"作为复选框,例如

<input type="checkbox" name="%{#line_3_[1]}" value="true" id="%{#line_3_[1]}"/>