Struts2的ResultType和Action處理鏈 Struts2的結果類型 在struts-default.xml中定義了Struts2內置的所有可用的<result-type/> 所有的Struts2結果處理類都要直接或間接的實現(xiàn)com.opensymphony.xwork2.Result接口 在struts-default.xml中的<result-types/>里面,有這樣一行聲明 Deprecated name form scheduled for removal in Struts 2.1.0. The camelCase versions are preferred. 即:不建議使用以下兩種結果類型,在Struts-2.1.0中它們將被移除,應采用Java命名規(guī)則,即駱駝命名方式,也即駝峰命名規(guī)則 另外Struts2還有一些插件,這些插件還支持一些其它結果類型,這里暫時先不涉及它們 結果類型為input的頁面的作用 Struts2應用在運行過程中若發(fā)現(xiàn)addFieldError()中有信息或者類型轉換失敗或著輸入校驗失敗等情況 那么它會自動跳轉到name為input的<result/>,然后轉到INPUT所對應的頁面 若JSP頁面中表單是用普通<form>編寫的,發(fā)生錯誤而返回該頁面時,則原數(shù)據(jù)將消失 若JSP頁面中表單是用<s:form/>編寫的,發(fā)生錯誤而返回該頁面時,則原數(shù)據(jù)仍存在 若沒有提供name值為input的<result/>,那么發(fā)生錯誤時,將直接在瀏覽器中提示404錯誤 結果類型中的httpheader httpheader結果類型很少使用到,它實際上是返回一個HTTP響應的頭信息 若單純的設置<result type="httpheader">/result.jsp</result>,執(zhí)行時控制臺會報如下錯誤 Caught OgnlException while setting property 'status' on type 'org.apache.struts2.dispatcher.HttpHeaderResult'. java.lang.NoSuchMethodException: setStatus(java.lang.String) 翻譯:應用程序在設置status屬性時捕獲了OgnlException異常 查看HttpHeaderResult類源代碼發(fā)現(xiàn),它果然定義了private int status = -1 它代表的是一個狀態(tài)碼,較常見的狀態(tài)碼如下 200對應OK 404對應File Not Found或者requested resource() is not available 500對應服務器內部錯誤 這時我們在<action/>中修改為<result type="httpheader"><param name="status">404</param></result>即可 這樣當Action執(zhí)行完畢,就會轉向到SUCCESS結果,所以頁面就會顯示404錯誤提示 關于httpheader結果類型,了解即可,平時很少用到的不是很多 結果類型中的plainText 當設定為type="plainText"之后,就可以顯示原始文件內容,例如文件源代碼 <result name="success" type="plainText">/testSuc.jsp</result> 這時訪問應用,當跳轉到testSuc.jsp頁面后,右鍵就可以查看到它的Java代碼了 它比較適用于Java教學網(wǎng)站,但若僅設置type="plainText"的話,頁面中顯示中文時會亂碼 這時就可以借助它的charSet屬性以解決中文顯示時的亂碼問題 [xhtml]?view plaincopyprint? <result?name="success"?type="plainText">?? ????<param?name="location">/testSuc.jsp</param>?? ????<param?name="charSet">GBK</param>?? </result>?? 如果不設置charSet屬性,反而去配置struts.i18n.encoding全局屬性,是不能解決問題的 設置charSet屬性的目的就是讓JSP頁面的編碼與明文顯示時的編碼一致 結果類型中redirect和redirectAction的區(qū)別 redirect是在處理完當前Action之后,重定向到另外一個實際的物理資源 redirectAction也是重定向,但它重定向到的是另外一個Action 只要是重定向,那么之前凡是保存在request里面的東西就全都消失了 因為重定向實際是發(fā)送第二個請求,故請求中的東西也就不會出現(xiàn)在第二個請求里面了 也就是說重定向是不共享request的東西,重定向后的頁面中無法接收request里的東西 另外dispatcher結果類型的default屬性為TRUE,故<result-type/>缺省為dispatcher 所以如果沒有設置type屬性的話,那么默認的是請求轉發(fā),即瀏覽器顯示的是*.action 但是在設置type="redirect"屬性后,就可以重定向了,即瀏覽器顯示的是/login2.jsp Struts2的Action處理鏈 從一個Action跳轉到另一個Action,有兩種辦法,即將type設置為chain或者redirectAction chain結果類型表示將多個Action作為一個鏈來處理 而使用chain和redirectAction的好處就是:它會按照框架的默認后綴去自動匹配后綴 而chain和redirectAction的區(qū)別與dispatcher和redirect的區(qū)別是一樣的 即同樣是跳轉到一個Action上,但chain是服務器跳轉,而redirectAction是客戶端跳轉 服務器跳轉的過程中,可以共享數(shù)據(jù),這時后面的Action就可以接收前面Action中的屬性信息進行二次處理 以下是chain結果類型的使用示例 [xhtml]?view plaincopyprint? <action?name="firstchain"?class="com.jadyer.action.FirstAction">?? ????<result?type="chain">secondchain</result>?? </action>?? <action?name="secondchain"?class="com.jadyer.action.SecondAction">?? ????<result?type="chain">thirdchain</result>?? </action>?? <action?name="thirdchain"?class="com.jadyer.action.ThirdAction">?? ????<result?type="plainText">/chainResult.jsp</result>?? </action>?? 或者使用<result type="redirect">secondchain.action</result>即手工添加?.action?亦可正常訪問 但不建議這么做,因為若修改應用的Action后綴,這里也需手動的把后綴改掉,麻煩得很 盡管在官方幫助文檔的案例中,曾使用過這種方式來執(zhí)行下一個Action,但這是不嚴謹?shù)?/span> 下面的例子是訪問不同命名空間下的Action [xhtml]?view plaincopyprint? <package?name="test"?extends="struts-default"?namespace="/">?? ????<action?name="test"?class="cn.jadyer.action.TestAction">?? ????????<result?name="success"?type="redirectAction">?? ????????????<!--這里也可將兩行<param/>寫成一行,即<param?name="actionName">/xx/test1</param>?-->?? ????????????<param?name="actionName">test1</param>?? ????????????<param?name="namespace">/xx</param>?? ????????</result>?? ????</action>?? </package>?? <package?name="test1"?extends="struts-default"?namespace="/xx">?? ????<action?name="test1"?class="cn.jadyer.action.Test1Action">?? ????????<result?name="success"?type="redirect">/test1Suc.jsp?name=${name}</result>?? ????</action>?? </package>?? 客戶端跳轉中的參數(shù)傳遞 若第二個Action使用type="redirect",那么在頁面中將無法接收Action中所共享的數(shù)據(jù) 但在客戶端跳轉中,我們可以在鏈接上傳參。比如result寫成/test1Suc.jsp?name=${username} 在Struts2的XML文件中可以使用${}表達式,它會自動的取出Action中所有可用的屬性,作為參數(shù)傳遞到下一頁面 這里${}不是EL表達式,實際上它的本質上是OGNL表達式 由于從鏈接中取值,故用<%=request.getParameter("name")%>或者${param.name},這里param相當于request.getParameter("") 注意也不能使用${name},因為它是用來從page、request、session、application中取值的 并且頁面中也不能使用<s:property value="name"/>接收參數(shù)值,因為它是從ValueStack中取值的 下面是代碼示例 [xhtml]?view plaincopyprint? <action?name="test"?class="cn.jadyer.action.TestAction">?? ????<result?name="success"?type="redirectAction">?? ????????<param?name="actionName">test1</param>?? ????</result>?? </action>?? <action?name="test1"?class="cn.jadyer.action.Test1Action">?? ????<result?name="success"?type="redirect">/test1Suc.jsp?name=${username}</result>?? </action>?? |