Tapestry中带有<t:loop>组件的编码器</t:loop>

时间:2012-06-22 06:59:01

标签: tapestry

我有一个页面显示某个客户端的详细信息。我正在使用t:loop来显示一些数据。在t:loop我正在传递sourcevalue。到目前为止一切顺利,我的页面工作正常。但是当我尝试提交页面时,它会突然给我一个例外。

  

“无法从类型java.lang.String中找到强制类型   [addressUsageValue]可用强制:..........“

以下是示例代码

<t:loop source="addressUsageInfo" value="addressUsageValue">
                  <tr>
                              <td>${addressUsageValue?.usage}</td>
                              <td>${addressUsageValue?.address}</td>
                              <td>${addressUsageValue?.postCode}</td>
                              <td>${addressUsageValue?.city}</td>
                              <td>${addressUsageValue?.country}</td>
                  </tr>
</t:loop>

我做了一些调查并找到以下参考文献。

http://tapestry.apache.org/5.3.3/apidocs/org/apache/tapestry5/corelib/components/Loop.html https://issues.apache.org/jira/browse/TAP5-609

所以我为Loop创建了编码器。下面是示例代码。在下面的toClient()方法中,我随机返回了任何值,在toValue()方法中,我返回null。

private final ValueEncoder<DtoAddressUsageInfo> addressUssageEncoder = 
    new ValueEncoder<DtoAddressUsageInfo>() {

    public String toClient(DtoAddressUsageInfo value) {
          return String.valueOf(value.getUsage());
    }

    public DtoAddressUsageInfo toValue(String clientValue) {
          return null;
    }

};

现在我的代码工作正常,我可以提交表单。

我的怀疑来了

首先 - 我无法理解为什么在使用循环时需要编码器?如果需要提交表格,那么为什么它不是强制性参数??

第二 - 我刚刚实现了没有任何逻辑的编码器。我无法理解在哪里使用toValue()和toClient()方法以及目的是什么?

第三 - 当我提交页面时为什么需要编码器?

2 个答案:

答案 0 :(得分:7)

formStateencoder参数解决了以下问题:提交表单时,如何确保表单中的值转到它们所针对的对象?

如果您正在迭代的集合在表单呈现和表单提交之间没有变化,那么最简单的解决方案是设置formState="iteration"(很好地解释in the docs)。

但是,如果集合可以在渲染和提交之间进行更改,则必须对哪个循环迭代是哪个对象的信息进行编码。这是通过ValueEncoder完成的(再次,在its documentation中很好地解释)。例如,常见的实现可以在呈现时将数据库ID编码为表单(toClient()),并在提交表单时将实体从数据库加载回来(toValue())。

所有这些也在Loop component documentation that you found中得到了解释。

答案 1 :(得分:1)

亨宁的回答也帮助了我。只有在我的循环中尝试为行设置复选框时,my循环的值才会变为null。编码器工作,数据很好。该复选框使用setter设置,并在每行迭代时使用getter检索。实际的布尔值存在于数据对象周围的包装器中。循环给出了这些包装器对象的列表。 “onClick”事件提交表单。但是每次迭代我的包装器对象(循环值)将始终为null。我添加了formstate =“iteration”,现在复选框保持状态。

<t:loop t:source="treeNodeList" value="treeNode" 
t:encoder="treeNodeEncoder" formState="iteration">
    <tr style="text-align:center;">
        <td class="table-checkbox" id="data-table-1st-col">
        <input t:type="checkbox" value="currentSelectedTreeNode" 
        onclick="this.form.submit();"/>

    ....

        </td>
    </tr>
</t:loop>