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

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

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

    (轉載)關于paramsPrepareParamsStack

    原帖地址:
    http://hi.baidu.com/%CC%AB%C6%BD%D1%F31986/blog/item/110b13b1384e805e08230259.html
    轉貼

    paramsPrepareParamsStack在Struts 2.0中是一個很奇妙的interceptor stack,以至于很多人疑問為何不將其設置為默認的interceptor stack。paramsPrepareParamsStack主要解決了ModelDriven和Preparable的配合問題,從字面上理解來說, 這個stack的攔截器調用的順序為:首先params,然后prepare,接下來modelDriven,最后再params。Struts 2.0的設計上要求modelDriven在params之前調用,而業務中prepare要負責準備model,準備model又需要參數,這就需要在 prepare之前運行params攔截器設置相關參數,這個也就是創建paramsPrepareParamsStack的原因。流程如下:
       1. params攔截器首先給action中的相關參數賦值,如id  
       2. prepare攔截器執行prepare方法,prepare方法中會根據參數,如id,去調用業務邏輯,設置model對象
       3. modelDriven攔截器將model對象壓入value stack,這里的model對象就是在prepare中創建的
       4. params攔截器再將參數賦值給model對象
       5. action的業務邏輯執行 依據此stack,一個action的代碼通常如下

    public class UserAction extends ActionSupport implements ModelDriven, Preparable {
        private User user;
        private int id;
        private UserService service; // user business service

        public void setId(int id) {
            this.id = id;
        }

        /**
         * create a new user if none exists, otherwise load the user with the
         * specified id
         */
        public void prepare() throws Exception {
            if (id == 0) {
                user = new User();
            } else {
                user = service.findUserById(id);
            }
        }

        public Object getModel() {
            return user;
        }

        /**
         * create or update the user and then view the created user
         */
        public String update() {
            if (id == 0) {
                service.create(user);
            } else {
                service.update(user);
            }
            return "redirect";
        }

        /**
         * delete the user and go to a default home page
         */
        public String delete() {
            service.deleteById(id);
            return "home";
        }

        /**
         * show the page allowing the user to view the existing data
         */
        public String view() {
            return "view";
        }

        /**
         * show the page allowing the user to view the existing data and change the
         * values
         */
        public String edit() {
            return "input";
        }

    在上述代碼中,edit和view都不需要根據id再為界面準備數據,因為prepare方法已經準備好了model,這些方法很簡單。對于update 方法,prepare首先會從數據庫中加載數據,然后params攔截器會將參數值付給model,在update直接更新就可以,不會出現數據被亂更新 的情況。象Hibernate框架,會判斷哪些字段更新了,然后進行更新,性能也不會損失。
    通過paramsPrepareParamsStack可以讓流程更明確,代碼更簡潔,也更利于大家的交流。

    posted on 2011-11-16 15:39 AK47 閱讀(447) 評論(0)  編輯  收藏 所屬分類: Structs

    <2011年11月>
    303112345
    6789101112
    13141516171819
    20212223242526
    27282930123
    45678910

    導航

    統計

    常用鏈接

    留言簿

    隨筆分類

    隨筆檔案

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 中文字幕精品亚洲无线码二区| 国产成人综合久久精品免费| 亚洲AV无码成人网站久久精品大| 成人无码精品1区2区3区免费看| 全部免费国产潢色一级| 相泽南亚洲一区二区在线播放| 在线免费一区二区| 性色av极品无码专区亚洲| 国产午夜免费福利红片| 日本精品久久久久久久久免费| 亚洲人成网站观看在线播放| 一个人免费观看www视频| 日日噜噜噜噜夜夜爽亚洲精品 | 7m凹凸精品分类大全免费| 亚洲伊人久久大香线蕉苏妲己| 亚洲一级免费视频| 亚洲精品国产高清在线观看| 亚洲成av人片在线观看天堂无码| 精品久久久久久无码免费 | 亚洲日本在线观看网址| 九九精品免费视频| 国产成人综合久久精品亚洲| 日韩精品亚洲aⅴ在线影院| 无码日韩精品一区二区免费暖暖| 亚洲国产福利精品一区二区| 最近免费中文字幕视频高清在线看 | 成年在线网站免费观看无广告| 国产AV日韩A∨亚洲AV电影| 亚洲一区精品无码| 亚洲免费电影网站| 特级毛片免费播放| 亚洲综合婷婷久久| 日韩精品免费一区二区三区| 中文字幕免费播放| 激情亚洲一区国产精品| 亚洲精品人成无码中文毛片| 最近中文字幕大全中文字幕免费 | 亚洲春色在线观看| 大胆亚洲人体视频| **aaaaa毛片免费| 日亚毛片免费乱码不卡一区 |