zoukankan      html  css  js  c++  java
  • 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来调用其方法了。

  • 相关阅读:
    一天摄入多少蛋白质比较合理?
    给函数添加元数据(python)
    反转链表(C++实现)
    删除链表的中间节点(C++实现)
    在双向链表中删除倒数第K个链表节点(C++实现)
    在单链表中删除倒数第K个节点(C++实现)
    二叉树的创建及遍历(递归和非递归C++实现)
    删除排序数组中的重复项(C++实现)
    打印两个有序链表的公共部分(C++实现)
    用一个栈实现另一个栈的排序(C++实现)
  • 原文地址:https://www.cnblogs.com/voctrals/p/2982745.html
Copyright © 2011-2022 走看看