在struts2中,初學者因為參數傳遞的問題往往會出現一些錯誤。
比如頁面跳轉的問題,在用戶注冊中,以一下代碼作為案例:
<struts> <constant name="struts.action.extension" value="action,,"></constant> <constant name="struts.devMode " value="true"></constant> <constant name="struts.enable.DynamicMethodInvocation" value="true" /> <package name="user" namespace="/" extends="struts-default"> <action name="*" class="user.TotalAction" method="{1}" > <result name="success">/WEB-INF/user/userlist.jsp</result> <result name="modify">/WEB-INF/user/modifyit.jsp</result> <result name="list" type="redirectAction">userlist</result> </action> </package> </struts>
1 public String userlist() throws Exception { 2 // TODO Auto-generated method stub 3 UserDAO dao= new UserDAO(); 4 ArrayList<User> list= dao.getUser(); 5 // System.out.println("dao::"+list.size()); 6 ActionContext acx= ActionContext.getContext(); 7 acx.put("USERLIST", list); 8 9 return "success";
1 public String save() throws ClassNotFoundException, SQLException 2 { 3 UserDAO dao= new UserDAO(); 4 dao.modifyUser(user); 5 return "list"; 6 }
筆者如果想要通過save()方法直接將值傳遞到>/WEB-INF/user/userlist.jsp。如果不借助redirectAction,最笨的方法就是將userlist()方法重寫一遍,然後還回success。
但是借助redirectAction,可以直接重定向到新的地址。就是說通過配置一個struts中的rusult方法:加入redirectAction對象,可以在action中通過返回list方法,重新流入<action配置中,重定向,然後再找到userlist方法,以此傳遞數據。《初次學習,總結如有不足或不對之處請指出》
Chain Result:
這個result調用另外的一個action,連接自己的攔截器棧和result。
Redirect Action Result:
這
個Result使用ActionMapperFactory提供的ActionMapper來重定位浏覽器的URL來調用指定的action和(可選
的)namespace.
這個Result比ServletRedirectResult要好.因為你不需要把URL編碼成xwork.xml中配置的ActionMapper提
供的模式. 這就是說你可以在任意點上改變URL模式而不會影響你的應用程序. 因此強烈推薦使用這個Result而不是標准的redirect
result來解決重定位到某個action的情況.
Redirect Result
調
用{@link HttpServletResponse#sendRedirect(String)
sendRedirect}方法來轉到指定的位置. HTTP響應被告知使浏覽器直接跳轉到指定的位置(產生客戶端的一個新請求).
這樣做的結果會使剛剛執行的action(包括action實例,action中的錯誤消息等)丟失, 不再可用.
這是因為action是建立在單線程模型基礎上的.
傳遞數據的唯一方式就是通過Session或者可以為Ognl表達式的web參數(url?name=value)
二。當使用type=“redirectAction” 或type=“redirect”提交到一個action並且需要傳遞一個參數時。這裡是有區別的:
a.使用type=“redirectAction”時,結果就只能寫Action的配置名,不能帶有後綴:“.action”
Java代碼
<action name="Login" class="steven.actions.LoginAction">
<result name="success" type="redirectAction">User?u_id=${loginBean.u_id}</result>
</action>
b.使用type=“redirect”時,結果應是action配置名+後綴名
Java代碼
<action name="Login" class="steven.actions.LoginAction">
<result name="success" type="redirect">User.action?u_id=${loginBean.u_id}</result>
</action>
ps:1 redirect:action處理完後重定向到一個視圖資源(如:jsp頁面),請求參數全部丟失,action處理結果也全部丟失。
2 redirect-action:action處理完後重定向到一個action,請求參數全部丟失,action處理結果也全部丟失。
3 chain:action處理完後轉發到一個action,請求參數全部丟失,action處理結果不會丟失。