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

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

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

    Tin's Blog

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

      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
      128 隨筆 :: 0 文章 :: 221 評論 :: 0 Trackbacks

    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 閱讀(2591) 評論(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
    這個東西  回復  更多評論
      

    主站蜘蛛池模板: 亚洲AV日韩AV永久无码色欲| 亚洲国产成人久久综合| xxxx日本在线播放免费不卡| 大香人蕉免费视频75| 久久久久久亚洲精品影院| 拨牐拨牐x8免费| 亚洲av无码av在线播放| 国产成人综合久久精品免费| 免费激情网站国产高清第一页| 亚洲国产人成精品| 国产福利在线观看永久免费| 亚洲女同成av人片在线观看| 暖暖免费在线中文日本| 亚洲AV无码不卡在线播放| 91久久青青草原线免费| 久久亚洲精品专区蓝色区| 成人永久福利免费观看| 一级毛片免费播放试看60分钟 | 午夜a级成人免费毛片| 色窝窝亚洲av网| 亚洲级αV无码毛片久久精品| 美女内射无套日韩免费播放| 天堂亚洲国产中文在线| 四虎亚洲国产成人久久精品| jizz免费在线观看| 亚洲视频一区网站| 日本特黄特色aa大片免费| 国产美女视频免费观看的网站 | 一级做a爰黑人又硬又粗免费看51社区国产精品视 | 亚洲AV日韩综合一区尤物| 日本免费一本天堂在线| 中文字幕免费视频精品一| 亚洲日韩国产精品无码av| 免费成人黄色大片| 99在线视频免费| 粉色视频成年免费人15次| 亚洲色图.com| 免费国产a国产片高清网站| 无码av免费网站| 老司机午夜在线视频免费| 亚洲视频免费在线观看|