技术开发 频道

Tapestry4应用之For组件

【IT168 技术文档】

    For组件和Foreach组件一样是循环组件,从T4开始Foreach组件不再 建议使用了。当我们在Form组件中使用For组件的时候,For组件会在Form组件第一次解析的时候,将其source参数所绑定的数据集合以某种规则而转化为一个字符串,放在Form表单的一个hidden的域中,当Form组件发生二次解析的时候,For组件根据隐藏在Form表单hidden域中字符串找回source参数所绑定的数据集合,从而避免Form组件在第一次解析和第二次解析的时候,由于source参数所绑定的数据集合不一致而造成的StaleLink异常。

    如果source参数的数据是一个基本数据类型或者数据能被序列化T4将能自动的把对象转化成一个字符串,如果不能被序列化将报一个带有“Could not find a strategy instance for class”的ApplicationRuntimeException。

    解决方法如下:

    1、只存储数据对象的主键

    可以定义一个包含主键的属性给keyExpression参数

    2、让存储数据的类可以序列化

    T4将自动的转换序列化的数据成字符串然后存储在form中

    3、按照自己的方式定义类到字符串的转换方式。需要自己实现SqueezeAdaptor方法,然后在WEB-INF/hivemodule.xml中注册你的squeeze adaptor

    4、使用For组件的volatile 参数,这个参数默认值为false,如果为true则表示在For组件第一次解析的时候不需要

    将source参数所绑定的数据转化成字符串并隐藏在hidden域中。

    官方建议的使用1、2这两种解决办法。

0
相关文章