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

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

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

    空間站

    北極心空

      BlogJava :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
      15 Posts :: 393 Stories :: 160 Comments :: 0 Trackbacks

    Struts中不同的Action和ActionForm組合(轉(zhuǎn)載)

    [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接收到一個請求,然后根據(jù)struts-config.xml的配置定位到相應(yīng)的mapping (映射);接下來如果form的范圍是request或者在定義的范圍中找不到這個form,創(chuàng)建一個新的form實(shí)例;取得form實(shí)例以后,調(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

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

    首先,Struts會在定義的scope搜尋someForm,如果找到則重用,如果找不到則新建一個實(shí)例;取得form實(shí)例以后,調(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àn)證和訪問業(yè)務(wù)層。因?yàn)檫@里的action映射不包括forward(也沒有意義),所以不能重定向,只能用默認(rèn)的那個forward。這種僅有form的action可以用來處理數(shù)據(jù)獲取并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類實(shí)例,調(diào)用execute()方法;然后根據(jù)返回的ActionForward在配置中找forward,forward到指定的URI或action。

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


    [4] 僅有JSP的action

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

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

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


    [5] 兩個action對應(yīng)一個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>

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

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


    [6] 兩個action對應(yīng)兩個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>

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

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

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

    posted on 2006-11-02 14:14 蘆葦 閱讀(581) 評論(0)  編輯  收藏

    只有注冊用戶登錄后才能發(fā)表評論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 成人免费视频网址| 亚洲精品视频免费在线观看| 国产大片线上免费看| 亚洲国产最大av| 97无码免费人妻超级碰碰夜夜| 国产精品高清视亚洲精品| 毛片A级毛片免费播放| 亚洲精品无码成人片久久不卡| 免费观看黄网站在线播放| 97久久国产亚洲精品超碰热| 成年人免费网站在线观看| 亚洲AV无码国产精品永久一区| 国产乱人免费视频| 特级毛片免费观看视频| 国产日产亚洲系列| 国产一区二区三区免费观看在线 | 外国成人网在线观看免费视频| 在线精品亚洲一区二区小说 | 免费人妻精品一区二区三区| 亚洲区小说区图片区| 国产免费一区二区三区不卡| 亚洲AV无码不卡无码| 免费精品国产自产拍在 | 免费成人黄色大片| 久久精品成人免费国产片小草| 亚洲AV日韩AV永久无码下载| 美丽的姑娘免费观看在线播放| 亚洲狠狠婷婷综合久久| 亚洲人成网站在线观看青青| 日本免费大黄在线观看| 亚洲国产最大av| 亚洲精品字幕在线观看| 亚洲免费视频观看| 亚洲AV色欲色欲WWW| 亚洲国产精品无码久久久秋霞2| 亚洲免费观看在线视频| 成人福利在线观看免费视频| 亚洲精选在线观看| 国产伦一区二区三区免费| 久久免费观看国产精品88av| 亚洲av综合av一区二区三区|