空間站

          北極心空

            BlogJava :: 首頁(yè) :: 聯(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接收到一個(gè)請(qǐng)求,然后根據(jù)struts-config.xml的配置定位到相應(yīng)的mapping (映射);接下來(lái)如果form的范圍是request或者在定義的范圍中找不到這個(gè)form,創(chuàng)建一個(gè)新的form實(shí)例;取得form實(shí)例以后,調(diào)用其 reset()方法,然后將表單中的參數(shù)放入form,如果validate屬性不為false,調(diào)用validate()方法;如果validate ()返回非空的ActionErrors,將會(huì)被轉(zhuǎn)到input屬性指定的URI,如果返回空的ActionErrors,那么執(zhí)行Action的 execute()方法,根據(jù)返回的ActionForward確定目標(biāo)URI。

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


          [2] 僅有Form的action

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

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

          這樣做的效果是:沒(méi)有action類(lèi)可以存放我們的業(yè)務(wù)邏輯,所以所有需要寫(xiě)入的邏輯都只能寫(xiě)到form的reset()或者validate() 方法中。validate()的作用是驗(yàn)證和訪(fǎng)問(wèn)業(yè)務(wù)層。因?yàn)檫@里的action映射不包括forward(也沒(méi)有意義),所以不能重定向,只能用默認(rèn)的那個(gè)forward。這種僅有form的action可以用來(lái)處理數(shù)據(jù)獲取并forward到另一個(gè)JSP來(lái)顯示。


          [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接收到請(qǐng)求后,取得action類(lèi)實(shí)例,調(diào)用execute()方法;然后根據(jù)返回的ActionForward在配置中找forward,forward到指定的URI或action。

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


          [4] 僅有JSP的action

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

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

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


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

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

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


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

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

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

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

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

          只有注冊(cè)用戶(hù)登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 昭苏县| 衡山县| 博罗县| 盐城市| 晋城| 无为县| 连城县| 台江县| 方城县| 乐至县| 临安市| 平安县| 乐昌市| 罗源县| 思茅市| 增城市| 闻喜县| 江安县| 五河县| 上思县| 托克托县| 成都市| 界首市| 张家界市| 临猗县| 浦江县| 江门市| 竹溪县| 巫山县| 眉山市| 贵德县| 共和县| 六盘水市| 阜康市| 墨脱县| 砚山县| 舞阳县| 张家港市| 庆云县| 南陵县| 碌曲县|