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来调用其方法了。