Tapestry学习五:创建和使用ASO
2008-07-10 16:09
183 查看
既然我们已经谈到用户,它可以一提的是,很多时候我们会希望能有一些资料,供我们的Web应用程序所有的页面使用,一个典型的例子,例如信息是用户的特定设置,偏好和其他一些细节。如果把这一切都放在页面中传递这无疑是种负担;我们需要一种在任何时候需要都能找到的一些公共的资料。让我们看看在一个Tapestry应用我们如何能够做到这一点。
在Tapestry中,如果一个对象能被应用中的所有页面使用,那么这个对象就被叫做Application State Object(ASO).通常,我们以一种有序的方式去穿件一些这样的对象去保存数据。也就是说,我们可以有一个用户类去保存这个在应用中用户的资料。它很简单:
在Start.java中加入User 属性 并且使用注释@ApplicationState
提供getter方法,以便实例能够访问这个ASO,然后几可以在页面中展示USER的属性了
<p>The user is ${user.firstName} ${user.lastName}</p>
在到Another.java中加入类似的代码
}
你可能注意到了这两个类中的USER的属性名字不同,这是不是就意味着两个页面中使用的是不同的ASO?当然不是,来看看它是怎么工作的吧。
当一个对象被注释@ApplicationState标记并且是一个类的私有的属性,并且在其他的类中也被@ApplicationState标记,不管在这些类中它的属性名是什么,它们都将去访问同一个ASO实例。
另一个需要我明白的是:Tapestry在我们第一次访问这个ASO的时候创建了这个实例,意思就是说不管什么时候去访问ASO,它总是在那里,永远不可能为null。
一般情况下,ASO被session所保存。在第一次访问aso的时候如果session不存在将被新创建一个。当我们想要创建一个高性能的应用时我们就应该记住这个。
在Another中展示:
<p>The user is ${myUser.firstName} ${myUser.lastName}</p>
完成了准备,接下来我们要试着改变ASO的内容。为了简单的演示,我们就利用已经存在的输入框,我们可以输入任意的信息,但是让我们增加一些代码去给USER赋一个新的名字。还记得刚开始的代码吧,就在Start.java的onFormSubmit方法中修改:
在Tapestry中,如果一个对象能被应用中的所有页面使用,那么这个对象就被叫做Application State Object(ASO).通常,我们以一种有序的方式去穿件一些这样的对象去保存数据。也就是说,我们可以有一个用户类去保存这个在应用中用户的资料。它很简单:
package com.packtpub.t5first.util; public class User { private String firstName = "John"; private String lastName = "Smith"; public String getFirstName() { return firstName; } public void setFirstName(String firstName) { this.firstName = firstName; } public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName = lastName; } }
在Start.java中加入User 属性 并且使用注释@ApplicationState
@ApplicationState private User myUser; public User getMyUser() { return myUser; }
提供getter方法,以便实例能够访问这个ASO,然后几可以在页面中展示USER的属性了
<p>The user is ${user.firstName} ${user.lastName}</p>
在到Another.java中加入类似的代码
@ApplicationState private User myUser; public User getMyUser() { return myUser; }
}
你可能注意到了这两个类中的USER的属性名字不同,这是不是就意味着两个页面中使用的是不同的ASO?当然不是,来看看它是怎么工作的吧。
当一个对象被注释@ApplicationState标记并且是一个类的私有的属性,并且在其他的类中也被@ApplicationState标记,不管在这些类中它的属性名是什么,它们都将去访问同一个ASO实例。
另一个需要我明白的是:Tapestry在我们第一次访问这个ASO的时候创建了这个实例,意思就是说不管什么时候去访问ASO,它总是在那里,永远不可能为null。
一般情况下,ASO被session所保存。在第一次访问aso的时候如果session不存在将被新创建一个。当我们想要创建一个高性能的应用时我们就应该记住这个。
在Another中展示:
<p>The user is ${myUser.firstName} ${myUser.lastName}</p>
完成了准备,接下来我们要试着改变ASO的内容。为了简单的演示,我们就利用已经存在的输入框,我们可以输入任意的信息,但是让我们增加一些代码去给USER赋一个新的名字。还记得刚开始的代码吧,就在Start.java的onFormSubmit方法中修改:
@OnEvent(value="submit", component="userInputForm") Object onFormSubmit() { System.out.println("Handling form submission!"); String[] words = message.split(" "); if (words.length > 0) { user.setFirstName(words[0]); if (words.length > 1) { user.setLastName(words[1]); } } another.setPassedMessage(message); return another; }
好了 去测试一下吧
然而这个方便的功能有一个棘手的后果。如果说你要在一个页面中创建一个String类型的ASO:
@ApplicationState
private String someValue;
它工作起来很正常,但是后来你觉得需要另一个ASO以提供不同的信息。于是又写了:
@ApplicationState
private String someCompletelyDifferentValue;
看到了吧,事实不是你期望的那样。这两个ASO其实用的是一个String,所以一旦你改变了一个的值,那么另一个会返回一个一样的值给你。
正确的做法是把一些你要用到的信息包装成一个特定的类,比如例子中的USER。
相关文章推荐
- 使用sqlyog学习mysql中怎样创建用户、数据库、表
- go语言学习-数组切片的创建和使用方法
- Maven学习总结(七)——eclipse中使用Maven创建Web项目
- Ext学习笔记一(使用Ext.Panel创建一个登录面板)
- 我的python学习笔记.创建和使用类
- 【Servlet学习笔记-1】使用Eclipse创建第一个Servlet并在html页面调用示例
- hbase学习--1 使用 java api 创建表
- 学习Hadoop第十二课(Hadoop序列化机制、Linux安装Eclipse及创建快捷图标、使用Maven开发)
- Lua的系统学习(杂)_使用uLua在Unity中创建一个Sphere小球
- php学习笔记(7):PHP数组的创建修改使用
- 不错的maven学习笔记,收藏——Maven学习 (三) 使用m2eclipse创建web项目
- SQL学习记录2 创建和使用数据库(weiwancheng)
- linux学习之二十四---静态库的创建和使用
- Android个人学习笔记-使用myeclipse快速创建webservice并在Android中调用
- unity3d游戏开发学习之使用3dmax创建导弹模型
- Java 并发编程学习1线程的创建和定时器的使用
- Maven学习一:使用Myeclipse创建Maven项目
- Lucene学习之一:使用lucene为数据库表创建索引,并按关键字查询
- cocos2d-x学习笔记(九)使用shader创建鱼的投影
- 一步步学习微软InfoPath2010和SP2010--第五章节--添加逻辑和规则到表单(6)--使用规则创建多视图样式向导表单