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

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

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

    Flyingis

    Talking and thinking freely !
    Flying in the world of GIS !
    隨筆 - 156, 文章 - 16, 評論 - 589, 引用 - 0
    數(shù)據(jù)加載中……

    Struts Action的多種角色

        作者:Flyingis

        Action類是用戶請求和業(yè)務(wù)邏輯之間的橋梁。每個Action充當(dāng)用戶的一項業(yè)務(wù)代理。在RequestProcessor類預(yù)處理請求時,在創(chuàng)建了Action的實例后,就調(diào)用自身的processActionPerform()方法,該方法再調(diào)用Action類的execute()方法。Action的execute()方法調(diào)用模型的業(yè)務(wù)方法,完成用戶請求的業(yè)務(wù)邏輯,然后根據(jù)執(zhí)行結(jié)果把請求轉(zhuǎn)發(fā)給其他合適的Web組件。在實際的應(yīng)用中,主要有以下幾種比較常見的使用方法:

    1.普通的Action應(yīng)用

    <action path="/normalAction"
    type="package.OneActionClass">
    name="oneForm"
    input="page.jsp"
    <forward name="success" path="success.jsp"/>
    <forward name="failure" path="failure.jsp"/>
    </action>

        Struts的ActionServlet接收到一個請求,然后根據(jù)struts-config.xml的配置定位到相應(yīng)的mapping(映射);接下來如果form的范圍是request或者在定義的范圍中找不到這個form,創(chuàng)建一個新的form實例,如果找到則重用;取得form實例以后,調(diào)用其reset()方法,然后將表單中的參數(shù)放入form,如果validate屬性不為false,調(diào)用validate()方法;如果validate()返回非空的ActionErrors,將會被轉(zhuǎn)到input屬性指定的URI,如果返回空的ActionErrors,那么執(zhí)行Action的execute()方法,根據(jù)返回的ActionForward確定目標(biāo)URI。即execute()僅當(dāng)validate()成功以后才執(zhí)行;input屬性指定的是一個URI。


    2.有Form的Action應(yīng)用

    <action path="/formAction"
    type="org.apache.struts.actions.ForwardAction"
    name="oneForm"
    input="page.jsp"
    parameter="another.jsp"
    />

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

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


    3.僅有Action的Action應(yīng)用

    <action path="/actionAction"
    type="package.OneActionClass">
    input="page.jsp"
    <forward name="success" path="success.jsp"/>
    <forward name="failure" path="failure.jsp"/>
    </action>

        ActionServlet接收到請求后,取得action類實例,調(diào)用execute()方法;然后根據(jù)返回的ActionForward在配置中找forward,forward到指定的URI或action。這樣就沒有form實例被傳入execute()方法,于是execute()必須自己從請求中獲取參數(shù)。Action可以被forward或者重定向。這種action不能處理通過HTML FORM提交的請求,只能處理鏈接式的請求。


    4.僅有JSP的Action應(yīng)用

    <action path="/jspAction"
    type="org.apache.struts.actions.ForwardAction"
    parameter="another.jsp"
    />

        ActionServlet接到請求后調(diào)用ForwardAction的execute()方法,execute()根據(jù)配置的parameter屬性值來forward到那個URI。這種情況下,沒有任何form被實例化,比較現(xiàn)實的情形可能是form在request更高級別的范圍中定義;或者這個action被用作在應(yīng)用程序編譯好后充當(dāng)系統(tǒng)參數(shù),只需要更改這個配置文件而不需要重新編譯系統(tǒng)。


    5.兩個Action對應(yīng)一個Form(和第四種方式部分的Action作用相近)

    <action path="/oneAction"
    type="package.OneActionClass">
    name="oneForm"
    input="one.jsp"
    <forward name="success" path="/anotherAction.do"/>
    </action>
    <action path="/anotherAction"
    type="package.AnotherActionClass">
    name="oneForm"
    input="another.jsp"
    <forward name="success" path="success.jsp"/>
    </action>

        這個組合模式可以被用來傳遞form對象,就每個單獨的action來講,處理上并沒有和完整的action有什么實質(zhì)的區(qū)別。需要注意的是在后一個action中同樣會調(diào)用form的reset()和validate()方法,因此我們必須確保form中的信息不被重寫。這種情況分兩種方式處理:a) 在request中放入一個指示器表明前一個action有意向后一個action傳遞form,從而在后一個action可以保留那個form中的值,這一方式只能在使用forward時使用。b) 當(dāng)使用redirect而不是forward時,可以把指示器放在session或更高的級別,在命令鏈的最后一環(huán)將這個指示器清除。


    6.兩個Action對應(yīng)兩個form

    <action path="/oneAction"
    type="package.oneActionClass">
    name="oneForm"
    input="one.jsp"
    <forward name="successful" path="/anotherAction.do" redirect="true"/>
    </action>
    <action path="/anotherAction"
    type="package.AnotherActionClass">"
    name="anotherForm"
    input="another.jsp"
    <forward name="success" path="success.jsp"/>
    </action>

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

    基本處理過程:
        前一個action接收輸入、驗證、然后將數(shù)據(jù)寫入業(yè)務(wù)層或持久層,重定向到后一個action,后一個action手動的從業(yè)務(wù)層/持久層取出數(shù)據(jù),寫入form(通過其他方式),交給前臺JSP顯示。這樣做的好處是不必保留輸入form中的值,因此可以使用redirect而不是forward。這樣就降低了兩個action之間的耦合度,同時也避免了不必要的重復(fù)提交。

    注明:文中所提及的“僅有Form”指的是沒有繼承Struts提供的Action類,而是直接使用了Struts自身提供的Action類;“僅有Action”指的是僅繼承了Struts提供的Action類而沒有使用Form。

    posted on 2005-11-18 17:10 Flyingis 閱讀(3639) 評論(2)  編輯  收藏 所屬分類: Web 框架與開發(fā)

    評論

    # re: Struts Action的多種角色  回復(fù)  更多評論   

    2和4都是一種,而且不可以認(rèn)為沒有Action,只是用struts提供的Action類罷了
    2005-11-18 17:41 | fanta

    # re: Struts Action的多種角色  回復(fù)  更多評論   

    文字上的確容易誤解,已經(jīng)加上了說明:)
    2005-11-18 17:58 | Flyingis
    主站蜘蛛池模板: 在线看片无码永久免费aⅴ| 亚洲熟妇AV日韩熟妇在线| 免费又黄又爽又猛的毛片 | 青草草在线视频永久免费| 久久免费国产精品一区二区| 黄网站色成年片大免费高清| 亚洲看片无码在线视频| 亚洲黄色三级视频| 久久精品国产69国产精品亚洲| 国产一区视频在线免费观看| 成人免费午间影院在线观看| 中文字幕免费在线看线人| 免费国产成人18在线观看| 国产免费伦精品一区二区三区| 国产精品亚洲综合网站| 亚洲精品无码你懂的| 亚洲一卡2卡4卡5卡6卡在线99| 亚洲黄色免费观看| 亚洲视频免费观看| 亚洲AV成人一区二区三区AV| 亚洲人成色7777在线观看| 亚洲综合国产一区二区三区| 亚洲福利在线播放| 亚洲成网777777国产精品| 免费A级毛片无码A∨男男| 免费a级毛片视频| 国产成人免费a在线视频色戒| 国内精品免费视频自在线| 久久不见久久见免费影院| 久久电影网午夜鲁丝片免费| 日韩毛片免费无码无毒视频观看| 性xxxxx免费视频播放| 中文字幕无码免费久久99| 久久受www免费人成_看片中文| 日本人的色道免费网站| 无码日韩精品一区二区免费| 18禁超污无遮挡无码免费网站国产 | 免费观看四虎精品成人| 美女被免费视频网站| 一级毛片在线免费播放| 一区二区三区免费精品视频|