6

我有一个页面显示某些客户的详细信息。我t:loop用来显示一些数据。在t:loop我只是路过sourcevalue。到目前为止一切顺利,我的页面运行良好。但是当我尝试提交页面时,它突然给了我异常。

“找不到从类型 java.lang.String 到类型 [addressUsageValue] 的强制转换可用的强制转换:…………。”</p>

下面是示例代码

<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() 方法的使用位置以及目的是什么?

第三——当我提交页面时,为什么表单需要编码器?

4

2 回答 2

7

formState和参数解决了以下encoder问题:提交表单时,如何确保表单中的值到达它们所要使用的对象?

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

但是,如果集合可以在渲染和提交之间发生变化,您将不得不对关于哪个循环迭代是哪个对象的信息进行编码。这是通过 a 完成的(同样,在其文档ValueEncoder中很好地解释了)。例如,一个常见的实现可以在呈现时将数据库 ID 编码到表单 ( ) 中,并在提交表单时从数据库中加载实体 ( )。toClient()toValue()

所有这些在您找到的 Loop 组件文档中也得到了很好的解释。

于 2012-06-22T08:57:46.863 回答
2

亨宁的回答也帮助了我。仅当尝试为循环中的一行设置复选框时,我的循环的值才会变为 null。编码器工作正常,数据正常。该复选框使用 setter 设置,并在每次迭代、每行时使用 getter 检索。实际的布尔值存在于数据对象周围的包装器中。给循环一个这些包装对象的列表。''onClick' 事件提交表单。但是每次迭代我的包装对象(循环值)总是为空。我添加了 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>
于 2013-12-02T15:41:30.260 回答