T5的优点:
事件处理器返回的类型
页面池,不用用户使用同一个页面实例,所以在页面间传递参数时要加@Persist标注进行保存,具体会存放在session里面
这样有一个问题,如果用户太多,而这些数据都存放在server端的话,会占用大量的空间,所以在可以不用这存储的时候就不要用,也可以考虑用值传递的方式,
@InjectPage Another another
.
.
another.set×××();
在调用这个方法的时候会实例化Another这个类,会把参数传递过去,而Another在接收的时候用onPassivate()方法,然后跳转,另一个实例调用onActivate()方法实现把数据返回到客户端。
实际在调用的过程中,会去检查Another这个实例是否有onPassivate()这个方法,如果有就进行参数操作,然后返回到Pool里面,如果没有这个方法的话,直接返回到pool里面。
用户在请求的时候,就直接到pool里面去取,再通过onActivate()方法返回值到客户端。
定义组件的方式:
注意在调用的时候,在java里面,
@component component={"page=Another"}
private PageLink linkid
这里的"linkid"名称一定要跟前面定义的那个id的名称一样
全局数据(Application state object ASO)同样存在session里面,如果session过期,当再次请求时,会再次创建,但始终保持一个实例,有且仅有一个实例
@ApplicateState
private User user;
当用户第一次请求这个对象时,就会创建User对象的实例,如果后面调用这个对象实例,返回的都是同一个实例,也就是说在任何地方所作的修改都会反应在这个对象里面。后面即使再次声明,返回的都是同一个对象如:
@ApplicateState
private User myuser;
实际上在调用的时候,myuser跟上面定义的user是同一个对象的。
<t:if t:test="userExist">
<p> The name is :${user.firstname}</p>
</t:if>
在上面片断中,"userExist"是全局变量,检查user是否存在。它有命名约定,user+Exist两部分组成。而在java文件中不需要声明这样一个变量的。它会自动去检查全局变量里面是否存在user这个对象,是否初始化了。但是在这个时候它是不会去初始化这个user对象的,也就是说他只是检查,不会去作实例化的操作。
数据源最好以service的方式存在而不是以ASO的方式存在,因为他会占用session空间
我们在查看详情的时候,一般用ActionLink,它在当前页面写事件处理方法,然后把得到的值传给详情页面,返回详情,此处详情页面需要设一个@Persist的变量来接收传递的值,这样不方便,可以用PageLink,把值传递过去,当前页面也不用写处理方法,详情页面要写一个onActivate(Long id)方法接收参数
Tapestry值处理方式,一是prop,二是literal
默认以prop方式,它会在page里面寻找get,set方法来得到值
而literal方式会列出后台跟的值把它当作字符串来处理