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

  • 相关阅读:
    css
    数据库
    手机编码
    火锅开2了
    Linux 与 Virtual PC(VirtualBox)
    切图
    [zz] Loading Master Data without using the PSA in SAP BI 7.0
    Notes: CRM Analytics–BI from a CRM perspective (2)
    Notes: CRM Analytics–BI from a CRM perspective (3)
    Sharing: hints, tcodes, commands that may help when solving support package implementation problems
  • 原文地址:https://www.cnblogs.com/voctrals/p/2982745.html
Copyright © 2011-2022 走看看