<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    云自無心水自閑

    天平山上白云泉,云自無心水自閑。何必奔沖山下去,更添波浪向人間!
    posts - 288, comments - 524, trackbacks - 0, articles - 6
      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

    在tapestry5中,在頁面之間傳遞基本有3種方法
    1、存放在Session中
    2、使用@Persist進行持久化
    3、使用頁面context來傳遞參數。
    其中1和2都需要將數據存放在Session中,相對來說系統的開銷比較大。尤其是多用戶高并發情況下,對于性能可能會有一定的影響。
    使用頁面Context來傳遞則需要在開發時寫一些代碼,增加了一些開發量,顯得沒有前兩種方法方便。
    第3種方法的實現是需要在頁面中添加onActivate和onPassivate方法來完成頁面參數的傳遞。
    我們先來看一下其背后的故事。
    舉個例子,比如說我們有兩個頁面,第一個是查詢條件輸入頁面input,另一個是查詢結果輸出頁面output。input頁面中有兩個查詢條件,起始時間dateFrom和終止時間dateTo
    在Input.java中,我們可以很直觀地這樣寫:
    @InjectPage
    private Output output;

    @Property
    private String dateFrom;

    @Property
    private String dateTo;

    Object onFormSubmit() {
            output.setDateFrom(dateFrom);
            output.setDateTo(dateTo);
            return output;
    }
    首先使用注解注入output頁面,然后在表單的提交事件中,返回output,這樣就在程序中定義了返回頁面,而不是使用配置文件的方式。
    但是這樣的實現卻不能正確運行,原因是因為Tapestry5的使用了頁面池技術,頁面在每次渲染前都是從頁面池中隨機獲取一個頁面,而從頁面池中取得的頁面,所有的屬性都是被清空了的。
    也就是說在上例中,雖然我們注入了output頁面,但是此頁面馬上就被放入了頁面池,而且其中的屬性值馬上就被清空了。這就是引入onActivate和onPassivate這丙個方法的原因。tapestry5在清空屬性前會首先查看是否包含onPassivate方法,如果有,就把其返回值保存起來,然后從頁面池中取得頁面后,再把剛才保存的值作為參數傳遞給onActivate方法。
    這就是方法3的基本原理,但是無論是在官方的文檔或是示例或者網上其他的應用中,可以發現大部分都是使用單個參數的,比如說id。這也很容易理解,因為onPassivate的方法的返回值只能有一個。
    在Tapestry5的官方文檔中,只有一句非常簡要的話介紹了如果傳遞多個文檔的方法: The activation context may consist of a series of values, in which case the return value of the method should be an array or a List. (參見:http://tapestry.apache.org/tapestry5.1/guide/pagenav.html)。
    但是這并不是說只要在onPassivate中把參數的值加入到List中,返回一個List,而在onActivate中接受一個List參數,然后就可以得到其中的參數了,因為Tapestry5把參數傳給onActivate的方法其實是通過將參數作為HttpRequest中的參數的。如果試圖使用上述方法就是得到一個“無法將List轉換成String的錯誤”
    所以方法應該是這樣的,在Output中:

    private List<String> paramList;
    public void setParamList(List<String> paramList) {
            this.paramList = paramList;
    }
    public List<String> getParamList() {
            return paramList;
    }
    List<String> onPassivate() {
            return paramList;
    }
    void onActivate(String dateFrom, String dateTo) {
            this.dateFrom = dateFrom;
            this.dateTo = dateTo;
    }
    private String dateFrom;
    private String dateTo;

    在Input頁面中,需要把onFormSubmit改一下:
    Object onFormSubmit() {
            List<String> list = new ArrayList<String>();
            output.setParamList(list);
            return output;
    }

    其中,需要注意的是output中的onActivate方法,基參數的順序必須和List中放入的參數順序一致。


     




    評論

    # re: Tapestry 最新版5.1.0.5教程(十):頁面間傳遞多個參數  回復  更多評論   

    2010-02-09 22:12 by 一農
    不太看好Tapestry,雖然其他的解決方案說不上完美,
    --使用struts2和springmvc的飄過

    # re: Tapestry 最新版5.1.0.5教程(十):頁面間傳遞多個參數  回復  更多評論   

    2010-02-10 09:01 by usherlight
    能說一下具體的原因嗎?

    # re: Tapestry 最新版5.1.0.5教程(十):頁面間傳遞多個參數  回復  更多評論   

    2010-02-21 15:03 by DH
    T5非常有意思,非常值得學習

    # re: Tapestry 最新版5.1.0.5教程(十):頁面間傳遞多個參數  回復  更多評論   

    2010-02-22 06:34 by usherlight
    T5其實是一個非常好的框架,有很多很強大的功能,但是由于宣傳、學習曲線、文檔之類的原因,使得它沒有能夠象struts/strust2這樣流行。
    主站蜘蛛池模板: 色吊丝免费观看网站| 亚洲高清日韩精品第一区| 精品久久久久亚洲| 国产老女人精品免费视频| 老司机亚洲精品影院在线观看| 免费理论片51人人看电影| 亚洲色大成网站www永久网站| 国产一卡2卡3卡4卡无卡免费视频 国产一卡二卡3卡四卡免费 | 亚洲电影免费在线观看| 久9热免费精品视频在线观看| 亚洲午夜未满十八勿入| av免费不卡国产观看| 亚洲欧美熟妇综合久久久久| 成年女人免费碰碰视频| 国产精品亚洲一区二区三区在线观看| 国产伦精品一区二区三区免费迷 | 亚洲AV无码乱码在线观看富二代 | 久久狠狠高潮亚洲精品| 成年女人喷潮毛片免费播放 | 在线观看免费无码视频| 亚洲AV日韩AV天堂一区二区三区 | 免费人成在线观看视频播放| 一级毛片免费播放男男| 亚洲av无码不卡| 日本精品人妻无码免费大全| 亚洲AV无码一区二区三区鸳鸯影院| 亚洲人成电影网站国产精品| 久久免费观看国产精品| 亚洲最大的成人网| 国产精品亚洲综合专区片高清久久久 | 精品无码一区二区三区亚洲桃色| 丁香花在线观看免费观看| 免费一级特黄特色大片| 亚洲小视频在线观看| 精品无码国产污污污免费| 免费看搞黄视频网站| 亚洲精品蜜夜内射| 亚洲成AV人片在线观看无 | 亚洲爽爽一区二区三区| 无码区日韩特区永久免费系列| 麻豆亚洲AV成人无码久久精品 |