Tapestry属性生命周期(关于persist)

Tapestry属性可能拥有持久化状态,在各个请求周期之间保存用户指定的Tapestry属性。 当应用程序的某一部分请求一个页面时候,将会获得一个 页面实例和用户先前存入持久化页面属性中的值。当页面的属性比如抽象的getter setter没有被标明持久化的时候,请求只会拿到一个空的页面对象)如果这个页面中调用的组件包含有持久化的组件属性,那么请求也将获得持久化组件属性的值。

页面实例不是session持久化。他们仅仅在第一次创建的时候存在于JavaVM的内存中。
页面和组件不需要实现 java.io.serializable接口,他们永远不会被序列化。而应用程序引擎对象总是不停地创建页面的新实例,并重新对页面赋予其先前被记录的 状态。(这就是说即时是同一个Session,同一个页面在不同的刷新操作的时候拿到的不一定是同一个页面对象,如果同一个页面在第二次请求的时候还拿到了以前调用该页面的时候的一些属性,说明该属性被标明的持久化)页面的状态也就是指页面所拥有的Tapestry属性(页面属性,以及页面调用组件的组件属性)的值。

在Tapestry中,属性的声明周期和重要。它拥有以下3种声明周期。

1-持久-----在各个请求周期之间,属性被记录并持久化。当属性被重载的时候,持久化页面属性被恢复。持久化Tapestry属性根据其声明的持久化策略已不同的方式被不同的用户共享。

2-瞬时----在页面表现之前,属性被设定,并且在当前请求结束的时候,重置为默认值。 (如果不标明持久化,属性就会在回到页面池的时候丢失)

3-动态----属性的值根据页面的表现而改变,但是在当前请求结束的时候,被重置。

持久化Tapestry属性就好像用户名,又像在商业应用程序中所显示的产品名称;而
瞬时持久Tapestry属性通常只被使用一次,比如错误信 息;
而动态Tapestry属性与表现进程联系紧密,比如以某种排序显示一组条款,就可能需要动态Tapestry属性来为每一条款在循环中赋值。

1.持久化页面状态

Tapestry框架有责任在请求周期内跟踪页面状态的改变,并且在请求周期之间储存状态。实际上,这是应用程序的引擎对象的职责,通过页面记录 器对象来完成。页面记录器是实现org.apache.tapestry.engine. IPageRecorder接口的对象,用于获取页面及其组件中 属性的变化,并在请求周期内储存页面的状态。当一个页面的持久化状态被改变时,引擎对象通知页面记录器,并提供属性的名称以及新的值。这个“通知”作为一 条信息被持久化地储存下来,当下一个请求周期到达的时候,页面记录器将根据这个信息将页面退回到先前的状态。
声明Tapestry属性持久化的工作由开发人员来完成,属性的值必须被序列化(非原始类型通过实现serializable接口来实现)。Tapestry属性的持久化有两种形式。

Session持久化 当页面被第一次访问的时候,页面属性的值被储存到HttpSession对象中,当页面需要操作页面属性的时候,从HttpSession中获取页面属性的值,当session会话的生命周期结束,页面属性的值即被清空。声明方法: 

<property name=”username” persist=”session”/> 

客户端持久化 当页面被第一次访问的时候,Tapestry框架自动向客户端浏览器中所偶表单添加hidden域以保存客户端持久化属性的值。并且页面上所有用于跳转的 URL都将会被添加客户端持久化属性进行操作的时候,Tapestry框架自动从客户端浏览器的hidden域中,或者从URL里包含的客户端持久化属性 相关信息中获取到客户端持久化属性的值,并重新赋给对应的Tapestry属性。客户端持久化分为客户端应用程序持久化和客户端页面持久化。

客户端应用程序持久化:Tapestry属性的 客户端持久化范围为整个应用程序,使用方法是在页面规范或组件规范中声明<property>元素的persist属性,且persist属性的值为”client:app”,例如:

<property name =”username” persist=”client:app”/>

客户端页面持久化
:Tapestry属性的持久化范围是 属性所在页面,使用方法是在页面规范或组件规范中声明<property>元素的persist属性,且persist属性的值为”client”或”client:page”例如:

<property name=”username” persist=”client:page”/> 
<property name=”username” persist=”client”/> 

 
2.瞬时页面状态

我们使用的大多数Tapestry属性都是瞬时的页面状态,瞬时的页面状态就如同我们在页面类中定义成员变量,同时创建该成员变量的标准 JavaBean方法,并在initialize()方法中对其进行初始化。当页面表现的时候,瞬时的Tapestry属性被赋值,当页面表现结束时,瞬 时的属性被还原为初始值。声明方法为:

<property name=”username”/>

3.动态页面状态

页面属性在页面表现的时候动态地改变。最典型的例子就是Foreach组件,例如:
  1. <property name=”fruit”/>  
  2.     <component id=”fruitListLoop” type=”Foreach”>  
  3.     <binding name=”source” value=”fruitList”/>  
  4.     <binding name=”value” value=”fruit”/>  
  5.     </component> 
在这里,组件ID为fruitListLoop的Foreach组件的value参数绑定了页面属性fruit,Foreach组件每遍历到其 source参数所绑定fruitList集合中的每一个元素,就将这个元素赋予value参数绑定的页面属性fruit。于是该页面属性fruit的值 在Foreach组件的整个循环遍历中,是不断被改变的。
当Foreach组件调用结束,整个页面表现完毕之后,value参数所绑定的fruit页面属性又会被还原为初始值。因此,动态页面状态实际上也是瞬时页面状态。

用法:

a) @Persist("client")
b) @Persist("client:page")
c) @Persist("client:app")

a) is the same as b).
If you use b) for a property x for page Foo, then you can get back the property only if the navigation is Foo => Foo. If the navigation is Foo => Bar => Foo, then it will be lost when Bar is
invoked
. In contrast, if you use c), then it will be maintained all the way.

client 跟 session是一样的效果只是实现的方式不一样, 一个是存在cookie或url中另一个是存在http session中。
client:page session:page 仅在当前页面有用, 假如转到其他页面 这个属性值就失效了。
client:app session:app 对于整个application都有效, 转到其他页面再转回来的话这个值仍然存在。如果我们想让他失效怎么办呢?你可以调用这个方法cycle.forgetPage("YourPageName").






  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值