在讲述页面之间传递值之前首先要介绍一个Tapestry的页面缓存。
Tapestry的一个经常被提及的就是页面的缓存,Wicket也有页面缓存,但是Wicket的页面是缓存在Session里的,缺省好像是只缓存5个页面。这一点让我对Wicket的印象打了折扣,首先,这种机制在高并发,也就是多人同时在线的时候,感觉页面缓存会占用大量资源。而Tapestry的页面缓存是在一个大池中。
页面缓存的优点就是提高效率,但是缺点也是比较明显的,那就是给开发实现带来了不方便。我觉得众人说的Tapestry的学习曲线比较陡,一部分原因就在这里。上一章讲过,在Tapestry中,页面的跳转是通过InjectPage实现的。Tapestry在页面跳转时,会从缓存池中选取一个相应页面的实例,渲染成html。关键在于Tapestry在把页面放到缓存池之前,会把页面实例里的值清空。这就是造成页面传值麻烦的原因。写段代码示例:
class Register {
private String name;
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
class Start{
@InjectPage
private Register register;
Object onSubmit() {
register.setName("superman");
return register;
}
}
如果页面从Start跳转到Register,并且希望把superman这个值传递给Register这个页面,感觉上只要象上面这段代码一样简单设置一下就行了,但是实际上这样是无法在Register的页面上显示出superman这个名字的。因为Tapestry会在页面显示时候的时候,从缓存池中提取一个实例,这个实例在放入缓存池之前,name属性的值就被清空了。
下面是Tapestry页面之间传递值的几种方式:
1、Persist。最简单的方式是使用persist注解。
class Register {
@Persist
private String name;
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
只要这样指定后,Tapestry会把name的值保存在Session中,以备下次使用。但是这样的缺点也很明显,首先是占用资源,另外这样的URL是不能作为书签的,因为参数值不体现在URL中,而是保存在Session中。
2、Page Active Context。这个方法比较好,但是需要一些代码来实现。主要是添加两个函数onActivate和onPassivate。
Class Register {
private String name;
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
void onActivate(String name) {
this.name = name;
}
String onPassivate() {
return name;
}
}
在Start页面中,我们使用了InjectPage把Register注入到了类中,如果只是简单地返回Register,是不能正确显示name的值的,但是在Tapestry会在把Start页面中的Register放回缓存池,清空Register实例中的变量值之前,检查这个类是否存在,但是现在我们实现了onActivate和onPassivate这两个方法,Tapestry会自动将onPassivate返回值保存起来,然后从页面池中取得页面后,再把刚才保存的值作为参数传递给onActivate方法。
3、SessionState
在Tapestry中有一种类型的对象存储在Session中,所以对所有页面都是可见的,但是又不需要对页面暴露Session。在Tapestry5以前,称之为ApplicationStateObject,但是这个称呼并不准确,因为这个对象不是Application级别,而只是Session级别,所以Tapestry5开始,改名为SessionStateObject。
使用方法也很简单,只需要在JavaClass中,给相应的属性添加一个@SessionState注解即可。
需要提醒注意的是,SessionState区分对象实例不依赖于实例的名称,而是根据实例的类型,比如:你在一个类中使用@SessionState注解了一个String name;而在另一个类中想再用@SessionState注解一个String password;这是不行的,Tapestry会把这两个当作同一个对象实例。
另一个需要注意的是,SessionState注解之后,Tapestry会马上会初始化生成一个该对象的实例。
原文地址:[url]http://www.blogjava.net/usherlight/archive/2009/06/05/280207.html [/url]
分享到:
相关推荐
【描述】"tapestry-bin-5.1.0.5" 描述了该版本是Tapestry框架的5.1.0.5版,这通常意味着它包含了该框架在那个时间点的所有功能和修复的错误。这个版本可能比之前的版本有所改进,包括性能优化、新功能添加以及对已有...
tapestry5.1.0.5中文实例教程,对于目前国内tapestry学习资源紧缺的情况,可谓填补了中文学习最大的空白,对于想学习tapestry5框架的人来说可谓字字如金,内容详尽,由浅入深,pdf格式
在官方下载的最新的tapestry5的api文档。。。。。。
来自:http://tapestry.apache.org/tapestry5.1/tapestry-core/ref
包含: tapestry 的源代码, tapestry集成spring2.0 tapestry快速启动 tapestry upload tapestry hibernate tapestry annotations
Tapestry5.0.16文档和大家一起学习
Tapestry是一个基于控件的框架以致于用它开发Web应用类似开发传统的GUI应用。你用Tapestry开发Web应用时你无需关注以操作为中心的(Operation-centric) Servlet API.引用Tapestry网站上的一句话:"Tapestry用对象...
《Tapestry5.1实例教程》是一份深入讲解Java Web开发框架Tapestry5.1的实践指导文档。Tapestry5.1是Apache软件基金会的一个开源项目,它为开发者提供了一种高度模块化、组件化的Web应用程序开发方式,强调了代码的...
Tapestry5最新中文教程.doc 作者 Renat Zubairov & Igor Drobiazko译者 沙晓兰 发布于 2008年7月2日 下午9时30分 社区 Java 主题 Web框架 ----------------------------------------- Tapestry5.1实例教程.pdf ...
Tapestry4开发指南.rar Tapestry4开发指南.rar Tapestry4开发指南.rar
### 关于Tapestry 5的关键知识点 #### 1. 什么是Tapestry? Tapestry是一个开源框架,用于创建动态、稳健且高度可扩展的Java Web应用程序。它补充并建立在标准Java Servlet API之上,因此可以在任何Servlet容器或...
**Tapestry 5.1 实例教程全览** Tapestry 5.1 是一个强大的Java Web应用程序框架,由Apache软件基金会维护。这个框架以其组件化、类型安全的URL映射、内置的依赖注入以及丰富的功能而备受赞誉。本教程全面地涵盖了...
【Tapestry 5.1 实例教程】 Tapestry 5.1 是一个基于Java的Web应用程序框架,由Apache软件基金会开发。它提供了一种高效、声明式的方法来构建动态、高性能的Web应用,强调组件化和强类型的安全性。Tapestry 5.1在...
- **跟踪最新动态**:关注Tapestry5项目的更新日志和技术博客,了解最新的技术和最佳实践。 总之,《Tapestry5:构建Web应用程序》是一本非常适合希望使用Tapestry5框架构建高质量Web应用的开发者的指南。无论是...
- 访问 [http://tapestry.apache.org/](http://tapestry.apache.org/) 下载 tapestry-bin-5.1.0.5.zip。 - 备份以备后续使用。 ##### 1.5 新建 Web 工程 - **步骤**: - 打开 Eclipse,选择 File > New > ...