Tapestry5之DataPass Between Pages

由于Tapestry5的提交方式比较特殊,就是所谓的PRG(POST/REDIRECT/GET),所以在参数的传递上也会有些不同。

据说一共有五种方法:

1 By Activation Context:通过上下文。

就是在一个页面中注入另外一个页面(@InjectPage),被注入的页面中有public的设定参数方法。

在传入页面的java类中,需要有onPassivate和onActivate方法。其作用已经介绍过了。

这种传值方式,会被传入页面处理,然后就和eventLink和actionLink一样了。

提交到传入页面的时候,URL的样式像这样:http://hostname:portNumber/injectedPage/param1/param2

2 By Query String:不知道怎么翻译比较好。

也是在一个页面中注入另外一个页面(@InjectPage),被注入的页面中有public的设定参数方法,但是这个方法的返回值不是null而是一个Link。

假如我们传递两个值给下一个页面,需要在A页面中有:

@InjectPage
private PageB pageB;

Link onSuccessFromPageAFrom(){
    return pageB.set("param1","param2");
}

这样一来给PageB的参数就设定好了。

而PageB的java类类似于:

@ActivationRequestParameter(value="first")
private String parameter1;

@ActivationRequestParameter(value="second")
private String parameter2;

@Inject
private PageRenderLinkSource pageRenderLinkSource;

public Link set(String param1, String param2){
    this.parameter1 = param1;
    this.parameter2 = param2;
    pageRenderLinkSource.createPageRenderLink(this.getClass());
}

那么这个类就不再需要onActivate和onPassivate了。并且这种形式的传值的URL显得更加和谐,形似:http://hostname:portNumber/PageB?first=param1&second=param2

以上需要注意一下first和second两个值。

可见以上两种传递的值都显示到了URL上。

3 By Persist:也不知道怎么翻译。

这种方式的传出页面,跟第一种相同没有什么差别。

传入页面的java类类似于:

@Persist(PersistenceConstants.FLASH)
private String param1;

@Persist(PersistenceConstants.FLASH)
private String param2;

public void set(String param1, String param2){
    this.param1 = param1;
    this.param2 = param2;
}

这样一来,如果传入页面设定了PageB的参数,那么PageB的参数就可以被持久化住了,也就是说不用再处理了。

这种方式有一个好处:URL比较理想,http://hostname:portNumber/PageB

有一个坏处:不能够被BookMark等。

4 By Session State Objects:通过SSO。

假如有一个FormBean对象,我们给他追加一个@SessionState注解,那么这个对象就会成为一个SSO。

一个SSO被一个web session所共享,不会被别的web session共享。

在另外一个Page或者Component中也注入一个@SessionState,如果两个注入的对象是同一个类型,那么就被共享。

貌似如果不同的话还可能会出错。有待验证。

5 By Services:通过服务

The best way to share an object across the whole application.

通过在Application Module中的

public static void bind(ServiceBinder binder){
    binder.bind(SomeService.class,SomeServiceImpl.java);
    binder.bind(AnotherService.class);
}

就可以在page或者component中通过@Inject服务,即SomeService或者AnotherSerivce来调用其方法了。

 

posted @ 2013-03-28 21:56  VoctrALs  阅读(219)  评论(0编辑  收藏  举报