posts - 51, comments - 17, trackbacks - 0, articles - 9
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          Action

          Posted on 2007-03-20 15:30 chenweicai 閱讀(201) 評論(0)  編輯  收藏
          ? Action類是用戶請求和業務邏輯之間的橋梁。每個Action充當用戶的一項業務代理。在 ? RequestProcessor類預處理請求時,在創建了Action的實例后,就調用自身的processActionPerform()方法,該方法再調用Action類的execute()方法。Action的execute()方法調用模型的業務方法,完成用戶請求的業務邏輯,然后根據執行結果把請求轉發給其他合適的Web組件。在實際的應用中,主要有以下幾種比較常見的使用方法: ?
          ? ?
          ? 1.普通的Action應用 ?
          ? ?
          ? <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接收到一個請求,然后根據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="/formAction" ?
          ? type="org.apache.struts.actions.ForwardAction" ?
          ? name="oneForm" ?
          ? input="page.jsp" ?
          ? parameter="another.jsp" ?
          ? /> ?
          ? ?
          ? ? ? ? ? Struts會在定義的scope搜尋oneForm,如果找到則重用,如果找不到則新建一個實例;取得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="/actionAction" ?
          ? type="package.OneActionClass"> ?
          ? input="page.jsp" ?
          ? <forward ? name="success" ? path="success.jsp"/> ?
          ? <forward ? name="failure" ? path="failure.jsp"/> ?
          ? </action> ?
          ? ?
          ? ? ? ? ? ActionServlet接收到請求后,取得action類實例,調用execute()方法;然后根據返回的ActionForward在配置中找 ? forward,forward到指定的URI或action。這樣就沒有form實例被傳入execute()方法,于是execute()必須自己從請求中獲取參數。Action可以被forward或者重定向。這種action不能處理通過HTML ? FORM提交的請求,只能處理鏈接式的請求。 ?
          ? ?
          ? ?
          ? 4.僅有JSP的Action應用 ?
          ? ?
          ? <action ? path="/jspAction" ?
          ? type="org.apache.struts.actions.ForwardAction" ?
          ? parameter="another.jsp" ?
          ? /> ?
          ? ?
          ? ? ? ? ? ActionServlet接到請求后調用ForwardAction的execute()方法,execute()根據配置的parameter屬性值來forward到那個URI。這種情況下,沒有任何form被實例化,比較現實的情形可能是form在request更高級別的范圍中定義;或者這個 ? action被用作在應用程序編譯好后充當系統參數,只需要更改這個配置文件而不需要重新編譯系統。 ?
          ? ?
          ? ?
          ? 5.兩個Action對應一個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有什么實質的區別。需要注意的是在后一個 ? action中同樣會調用form的reset()和validate()方法,因此我們必須確保form中的信息不被重寫。這種情況分兩種方式處理: ? a) ? 在request中放入一個指示器表明前一個action有意向后一個action傳遞form,從而在后一個action可以保留那個form中的值,這一方式只能在使用forward時使用。b) ? 當使用redirect而不是forward時,可以把指示器放在session或更高的級別,在命令鏈的最后一環將這個指示器清除。 ?
          ? ?
          ? ?
          ? 6.兩個Action對應兩個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> ?
          ? ?
          ? ? ? ? ? 這個組合方式跟前一種在流程上沒有太大區別,只是我們現在對于兩個action分別提供了form,于是代碼看上去更加清晰。于是我們可以分別處理WEB ? 應用程序的輸入和輸出。值得注意的是,后一個action同樣會嘗試往form中寫入那些參數,不過我們可以這樣處理:a) ? 在后一個form中使用另一套屬性名;b) ? 只提供getter而不提供setter。 ?
          ? ?
          ? 基本處理過程: ?
          ? ? ? ? ? 前一個action接收輸入、驗證、然后將數據寫入業務層或持久層,重定向到后一個action,后一個action手動的從業務層/持久層取出數據,寫入form(通過其他方式),交給前臺JSP顯示。這樣做的好處是不必保留輸入form中的值,因此可以使用redirect而不是forward。這樣就降低了兩個action之間的耦合度,同時也避免了不必要的重復提交。 ?
          ? ?
          ? 注明:文中所提及的“僅有Form”指的是沒有繼承Struts提供的Action類,而是直接使用了Struts自身提供的Action類;“僅有Action”指的是僅繼承了Struts提供的Action類而沒有使用Form。

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


          網站導航:
           
          主站蜘蛛池模板: 固原市| 瑞安市| 阳信县| 迁西县| 德江县| 巴东县| 青铜峡市| 通江县| 左贡县| 乌拉特中旗| 娱乐| 平陆县| 苍溪县| 通江县| 忻城县| 天水市| 屏东县| 二手房| 息烽县| 安仁县| 和平县| 利辛县| 五家渠市| 内丘县| 荆门市| 武川县| 南郑县| 海口市| 绥化市| 蓬溪县| 钟祥市| 泽普县| 江西省| 巴南区| 平顺县| 广德县| 新安县| 天峨县| 潼南县| 永德县| 仪陇县|