您的位置:首页 > 其它

Tapestry学习五:创建和使用ASO

2008-07-10 16:09 183 查看
既然我们已经谈到用户,它可以一提的是,很多时候我们会希望能有一些资料,供我们的Web应用程序所有的页面使用,一个典型的例子,例如信息是用户的特定设置,偏好和其他一些细节。如果把这一切都放在页面中传递这无疑是种负担;我们需要一种在任何时候需要都能找到的一些公共的资料。让我们看看在一个Tapestry应用我们如何能够做到这一点。

在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。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: