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

Mah*_*ria 5 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>
Run Code Online (Sandbox Code Playgroud)

我做了一些调查,找到下面的参考.

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;
    }

};
Run Code Online (Sandbox Code Playgroud)

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

我怀疑来了

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

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

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

Hen*_*ing 7

formStateencoder参数解决以下问题:当提交表单时,你如何确保从表单中的值去他们的目的的对象?

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

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

所有这些也在您找到循环组件文档中得到了解释.