Tin's Blog

          You are coming a long way, baby~Thinking, feeling, memory...

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            128 隨筆 :: 0 文章 :: 221 評論 :: 0 Trackbacks
          <2006年3月>
          2627281234
          567891011
          12131415161718
          19202122232425
          2627282930311
          2345678

          公告

           
          Tin是一個熱愛收集最佳實踐的程序員。曾經在小型Java團隊中擔任架構師,后在新浪郵件部門領導RIA團隊進行開發,目前是自由程序員,接受Java/ RIA/ RoR項目和咨詢。
          業余時間積極進行敏捷實踐和參與社區討論,對RoR和Django感興趣。在社區中還積極參與開源項目的文檔中文化工作。目前為InfoQ中文站做社區編輯。

          業余愛好:編程、硬件、Mac、美術、音樂(Rock)、電影、攝影、集圖、集郵、Quake3、旅行、美食

          常用鏈接

          留言簿(20)

          隨筆分類(63)

          隨筆檔案(58)

          文章分類

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          Webwork是標準的請求風格Web MVC,類似的有Struts、Spring MVC。這這種風格的MVC中都使用了前端控制器模式(企業架構模式),也就是說一個URL會被解析然后派發到對應的Action解析,而View調用的是Action處理后的Form對象或者Command對象(Rod的Without EJB)。
          上面引用了一些經典的言論,而它們和“頁面控制器風格Action復用”有什么關系呢?
          嘿嘿,頁面控制器在這里指到了View的Page里面依然可以調用控制器(在Webwork中就是Action)。如果是以前肯定有人會說,如果用JSP我隨時可以在Page里面寫scriptlet,什么東西都能調用……
          可是,現在不一樣了。我們希望讓View單純一點,不要有雜亂無章的邏輯參與其中。
          可是,如果要是如上面所說那么Action在它的一個請求生命周期就要做所有的事……這樣一是使Action邏輯變得復雜,二是會變得難以復用。
          所以,說到這里就引出了這個主題:
          1、在頁面調用控制器
          2、復用控制器邏輯
          在Webwork中我們可以使用<ww:action/>標簽實現這個目的。
          ——————————————————————————————————————
          不要著急,我們先介紹一下ww:action的兩種主要用法,而說用法之前先說語法:
          語法:
          <ww:action/>有5個屬性:
          1、id:給Action返回的ValueStack命名,如果不寫則默認為調用的Action的名字。(詳細使用參照后面)
          2、name:調用的Action的name。
          3、namespace:調用的Action的namespace。
          4、executeResult:true或false,是否渲染Action的View。這個決定了ww:action的用法。(后面會做說明)
          5、ignoreContextParams:Boolean值,request參數是否在Action被調用時所包括。

          好了,語法很簡單,我們說ww:action的兩種主要用法。
          1、代替<jsp:include>:
          include有兩種方式@ include和jsp:include,它們一個是編譯前一個是運行時include。webwork是不能使用<jsp:include>的。
          但其實ww有ww:include標簽,但是根據Webwork in Action中的推薦,ww:include標簽適合調用一般servlet,而對于action則推薦使用強大的ww:action。所以我們這里就略過ww:include。
          說強大是什么意思呢?ww:action充當這個角色時,可以選擇是否將valueStack的東西復制過來。
          當ww:action代替jsp:include的時候我們需要executeResult="true",這個時候調用的action返回的view會被include到調用的位置。<ww:action><param name="xxx" value="yyy"/></ww:action>則可以給action傳遞參數。其它的用法就與jsp:include或者ww:include用法差別不大了。

          2、頁面控制器風格Action復用:
          我們經常遇到這樣的場景,比如用戶注冊的時候需要選擇單位列表。那么我們reg.action運行之前就需要先把單位列表unitsList取出來。而它們本身與User注冊邏輯上沒什么關系。
          所以有的人把這個取出unitsList單獨寫在prepare()方法里面,然后用prepare Inteceptor……或者把讀取unitsList的邏輯寫在execute方法里面。
          但是這顯然難以復用!
          其實如果有單位unit這樣的domain,我們可能就有對應的CRUD的Action。其中可能就有UnitsListAction這樣的Action。
          我們完全可以在用戶注冊的時候就復用這個Action,而不是把同樣的邏輯寫到用戶注冊的Action里面。這就是頁面控制器風格要解決的問題。
          說那么多大帽子其實沒有意義,我們看看怎么實現:
          UnitsListAction片斷(我們要復用它):

          UnitService unitService = null;//注入,商業邏輯
          List<Unit> unitsList = null;//設置對應getter、setter

          Public String execute() {
           unitsList 
          = unitDao.listAll();
           
          return SUCCESS;
          }

          UserRegAction假設在注冊前只是doDefault()直接返回SUCCESS,只有在Post數據時在調用execute(),我們就不寫空的代碼了。或者不通過任何Action調用注冊頁面,直接調用注冊的jsp文件直接訪問也可以。

          到了UserRegAction顯示的View,我這里是Jsp片斷:

          <ww:action id="listUnits" executeResult="false" namespace="/" name="unitsListAction" />
          <ww:select name="unitId" list="#attr.listUnits.unitsList" listKey="id" listValue="name" required="true"/>

          注意,executeResult="false",也就是說我們不渲染unitsListAction返回的view,只用它的值。
          而訪問它的值的時候要使用#attr.listUnits.unitsList這樣的引用,因為這時unitsListAction返回的VlueStack不是頁面的ognl的rootStack,我們需要訪問#attr這個Stack,這部分可以參考一下Webwork的wiki。
          上面我給unitsListAction規定了一個id,這樣調用比較靈活,你可以多次調用同一個Action并且將值放在#attr下的不同地方。
          我們引用unitsListAction返回的unitsList這個list的時候需要用#attr加上我們給unitsListAction設定的id(如果不指定id,則默認unitsListAction)再加上你要訪問的變量名訪問。
          其實很簡單,而這種方式就是開始說的頁面控制器風格的action復用。雖然和真正的葉面控制器的Tapestry和JSF相差甚遠,但是也算有點那個意思了。
          擴展點想,如果我們在Action實現了一個counter,也可以通過這種方式調用,連返回的值都可以忽略,呵呵,這種邏輯復用還是挺有用的。

          拋磚引玉,我這個人說話啰嗦,見諒,就到這里。

          posted on 2006-03-10 14:45 Tin 閱讀(2592) 評論(4)  編輯  收藏 所屬分類: Webwork相關

          評論

          # re: 在Webwork中使用ww:action實現頁面控制器風格Action復用 2006-03-10 16:48 123steel
          學習 ing  回復  更多評論
            

          # re: 在Webwork中使用ww:action實現頁面控制器風格Action復用 2006-07-29 16:43 hgfh
          @123steel
          hgf  回復  更多評論
            

          # re: 在Webwork中使用ww:action實現頁面控制器風格Action復用 2006-07-29 16:43 hgfh
          hgfhgfhgfhgfhgf  回復  更多評論
            

          # re: 在Webwork中使用ww:action實現頁面控制器風格Action復用 2006-07-29 16:43 hgfh
          這個東西  回復  更多評論
            

          主站蜘蛛池模板: 蓬安县| 偏关县| 昌黎县| 长垣县| 资中县| 陕西省| 田阳县| 遂溪县| 延庆县| 广元市| 精河县| 镇江市| 达日县| 德庆县| 策勒县| 丰城市| 宝丰县| 襄城县| 安顺市| 镇安县| 秀山| 唐海县| 察哈| 河东区| 康保县| 墨玉县| 光泽县| 鞍山市| 子长县| 利津县| 正镶白旗| 新营市| 江达县| 高要市| 乌兰浩特市| 柞水县| 大安市| 龙山县| 长岭县| 德州市| 沿河|