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

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

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

    [摘錄]Struts中不同的Action和ActionForm組合

    摘錄地址:http://dev.csdn.net/article/58/58808.shtm

    ?

    在TSS.com上看到一篇好文,有關Struts使用中各種不同的Action和ActionForm組合的利弊。我先消化一下,整理好,供大家參考。原文標題:Struts action mappings: Divide Et Impera,作者:Michael Juravlev。在TSS上的URL:http://www.theserverside.com/articles/article.tss?l=StrutsActionMapping

    說明:閱讀本文需要一定的Struts基礎。
    注:文中小寫的action不一定代表具體的Struts Action類,有時也指作為一個整體的action mapping。


    [1] 完整的action

    <action path="/aFullAction"
    ??? type="somePackage.someActionClass">
    ??? name="someForm"
    ??? input="someJSP.jsp"
    ??? <forward name="successful" path="someJSP.jsp"/>
    ??? <forward name="failed" path="someOtherJSP.jsp"/>
    </action>

    首先,Struts的ActionServlet接收到一個請求,然后根據struts-config.xml的配置定位到相應的mapping(映射);接下來如果form的范圍是request或者在定義的范圍中找不到這個form,創建一個新的form實例;取得form實例以后,調用其reset()方法,然后將表單中的參數放入form,如果validate屬性不為false,調用validate()方法;如果validate()返回非空的ActionErrors,將會被轉到input屬性指定的URI,如果返回空的ActionErrors,那么執行Action的execute()方法,根據返回的ActionForward確定目標URI。

    這樣做的效果是:execute()僅當validate()成功以后才執行;input屬性指定的是一個URI。


    [2] 僅有Form的action

    <action path="/aFormOnlyAction"
    ??? type="org.apache.struts.actions.ForwardAction"
    ??? name="someForm"
    ??? input="someJSP.jsp"
    ??? parameter="someOtherJSP.jsp"
    />

    首先,Struts會在定義的scope搜尋someForm,如果找到則重用,如果找不到則新建一個實例;取得form實例以后,調用其reset()方法,然后將表單中的參數放入form,如果validate屬性不為false,調用validate()方法;如果validate()返回非空的ActionErrors,將會被轉到input屬性指定的URI,如果返回空的ActionErrors,那么轉到parameter屬性指定的目標URI。

    這樣做的效果是:沒有action類可以存放我們的業務邏輯,所以所有需要寫入的邏輯都只能寫到form的reset()或者validate()方法中。validate()的作用是驗證和訪問業務層。因為這里的action映射不包括forward(也沒有意義),所以不能重定向,只能用默認的那個forward。這種僅有form的action可以用來處理數據獲取并forward到另一個JSP來顯示。


    [3] 僅有Action的action

    <action path="/anActionOnlyAction"
    ??? type="somePackage.someActionClass">
    ??? input="someJSP.jsp"
    ??? <forward name="successful" path="someJSP.jsp"/>
    ??? <forward name="failed" path="someOtherJSP.jsp"/>
    </action>

    首先,ActionServlet接收到請求后,取得action類實例,調用execute()方法;然后根據返回的ActionForward在配置中找forward,forward到指定的URI或action。

    這樣做的效果是:沒有form實例被傳入execute()方法,于是execute()必須自己從請求中獲取參數。Action可以被forward或者重定向。這種action不能處理通過HTML FORM提交的請求,只能處理鏈接式的請求。


    [4] 僅有JSP的action

    <action path="/aJSPOnlyAction"
    ??? type="org.apache.struts.actions.ForwardAction"
    ??? parameter="someOtherJSP.jsp"
    />

    首先,ActionServlet接到請求后調用ForwardAction的execute()方法,execute()根據配置的parameter屬性值來forward到那個URI。

    這樣做的效果是:沒有任何form被實例化,比較現實的情形可能是form在request更高級別的范圍中定義;或者這個action被用作在應用程序編譯好后充當系統參數,只需要更改這個配置文件而不需要重新編譯系統。


    [5] 兩個action對應一個form

    <action path="/anAction"
    ??? type="somePackage.someActionClass">
    ??? name="someForm"
    ??? input="someJSP.jsp"
    ??? <forward name="successful" path="/anotherAction.do"/>
    </action>
    <action path="/anotherAction"
    ??? type="somePackage.someOtherActionClass">
    ??? name="someForm"
    ??? input="someOtherJSP.jsp"
    ??? <forward name="successful" path="someResultJSP.jsp"/>
    </action>

    就每個單獨的action來講,處理上并沒有和完整的action有什么實質的區別。這個組合模式可以被用來傳遞命令對象(form)。需要注意的是在后一個action中同樣會調用form的reset()和validate()方法,因此我們必須確保form中的信息不被重寫。

    處理的方式大致分為兩種:a) 在request中放入一個指示器表明前一個action有意向后一個action傳遞form,從而在后一個action可以保留那個form中的值,這一方式只能在使用forward時使用。b) 當使用redirect而不是forward時,可以把指示器放在session或更高的級別,在命令鏈的最后一環將這個指示器清除。


    [6] 兩個action對應兩個form

    <action path="/anAction"
    ??? type="somePackage.someActionClass">
    ??? name="someForm"
    ??? input="someJSP.jsp"
    ??? <forward name="successful" path="/anotherAction.do" redirect="true"/>
    </action>
    <action path="/anotherAction"
    ??? type="somePackage.someOtherActionClass">"
    ??? name="someOtherForm"
    ??? input="someOtherJSP.jsp"
    ??? <forward name="successful" path="someResultJSP.jsp"/>
    </action>

    這個組合方式跟前一種在流程上沒有太大區別,只是我們現在對于兩個action分別提供了form,于是代碼看上去更加清晰。于是我們可以分別處理WEB應用程序的輸入和輸出。值得注意的是,后一個action同樣會嘗試往form中寫入那些參數,不過我們可以這樣處理:a) 在后一個form中使用另一套屬性名;b) 只提供getter而不提供setter。

    大致的處理是這樣:
    前一個action接收輸入、驗證、然后將數據寫入業務層或持久層,重定向到后一個action,后一個action手動的從業務層/持久層取出數據,寫入form(通過其他方式),交給前臺JSP顯示。

    這樣做的好處是不必保留輸入form中的值,因此可以使用redirect而不是forward。這樣就降低了兩個action之間的耦合度,同時也避免了不必要的重復提交。


    作者Blog:http://blog.csdn.net/sean_gao/


    歡迎大家訪問我的個人網站 萌萌的IT人

    posted on 2006-11-22 15:57 見酒就暈 閱讀(162) 評論(0)  編輯  收藏 所屬分類: J2EE文章

    <2025年5月>
    27282930123
    45678910
    11121314151617
    18192021222324
    25262728293031
    1234567

    導航

    統計

    常用鏈接

    留言簿(3)

    我參與的團隊

    隨筆分類

    隨筆檔案

    文章分類

    文章檔案

    收藏夾

    BLOG

    FRIENDS

    LIFE

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 亚洲国产成人精品无码久久久久久综合 | 四虎永久免费地址在线网站| 亚洲成人在线电影| 四虎影视在线影院在线观看免费视频 | 久久久久久99av无码免费网站| 亚洲精品无码乱码成人| 九九免费精品视频在这里| 久久久久亚洲AV成人网人人网站| 九九全国免费视频| 久久久久久久尹人综合网亚洲| 青柠影视在线观看免费| 亚洲AV无码一区二区二三区软件| 欧洲人成在线免费| 亚洲国产成人久久精品影视| 日韩插啊免费视频在线观看| 亚洲电影免费观看| 性感美女视频免费网站午夜 | 亚洲精品少妇30p| 精品无码国产污污污免费网站| 亚洲电影在线免费观看| 巨胸喷奶水视频www网免费| 国产精品亚洲va在线观看| 亚洲一区二区视频在线观看| 中国一级特黄高清免费的大片中国一级黄色片 | 亚洲精品自在在线观看| 久久久久国产精品免费免费不卡| 久久亚洲AV无码精品色午夜麻| 五月亭亭免费高清在线| 亚洲大尺度无码无码专线一区| 亚洲国产成人精品无码久久久久久综合| 最近国语视频在线观看免费播放| 久久久婷婷五月亚洲97号色| 精品熟女少妇AV免费观看| 曰批全过程免费视频免费看| 亚洲精品成人网站在线观看| 免费成人福利视频| sss在线观看免费高清| 亚洲春黄在线观看| 免费国产a国产片高清网站| 免费av一区二区三区| 亚洲男人的天堂网站|