在實際的開發中常會遇到name相同的<action>,如下代碼:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"> <struts> <package name="default" namespace="/" extends="struts-default"> <action name="add" class="action.UserAction" method="add"> <result >addUser.jsp</result> </action> <action name="add" class="action.HouseAction" method="add"> <result>addHouse.jsp</result> </action> </package> </struts>
以上的配置中在同一個namespace下有兩個相同name為add的<action>,這樣就不能區別了,為了解決這個問題,我們可以把兩個<action>放在不同的namespace下,代碼如下:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"> <struts> <package name="user" namespace="/user" extends="struts-default"> <action name="add" class="action.UserAction" method="add"> <result >addUser.jsp</result> </action> </package>
<package name="house" namespace="/house" extends="struts-default"> <action name="add" class="action.HouseAction" method="add"> <result>addHouse.jsp</result> </action> </package>
</struts>
這樣將不同模塊放在不同的namespace下就可以區分了,但是在請求action時要URL中的action名前加相應的namespace名,如請求第一個使用:http:localhost:8080/Struts2Demo/user/add
在大型項目中往往一個struts.xml配置過於龐大,難於維護,需要將struts.xml進行拆分.
拆分後的struts.xml文件:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"> <struts> <include file="struts-house.xml"/> <include file="struts-add.xml"/> </struts>
拆分後的struts-house.xml文件:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"> <struts> <package name="house" namespace="/house" extends="struts-default"> <action name="add" class="action.HouseAction" method="add"> <result>addHouse.jsp</result> </action> </package> </struts>
拆分後的struts-user.xml文件:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"> <struts> <package name="user" namespace="/user" extends="struts-default"> <action name="add" class="action.UserAction" method="add"> <result >addUser.jsp</result> </action> </package> </struts>
我們定義的action類繼承的Action接口中定義了幾種action方法的返回值的靜態常量字符串。
1.SUCCESS:表示Action執行成功,顯示結果視圖給用戶。
2.NONE:表示Action執行成功,不顯示視圖給用戶。
3.ERROR:表示Action執行失敗,顯示錯誤頁面給用戶。
4.INPUT:表示Action需要更多的輸入信息,回到INPUT對應的頁面。
5.LOGIN:表示用戶沒有正確登陸而沒有正確執行,將返回該登陸視圖。
當然我們也可以自定義Action方法返回值的類型。會根據返回值尋找不同的result標簽。
使用<result>中的type屬性就可以定義以不同的方式輸出結果,它默認是"dispatcher",下面是type屬性的一些常用配置:
1.dispatcher:請求轉發到指定的URL
2.redirect:請求重定向到指定的URL
3.redirectAction:請求重定向到指定的Action
4.chain:Action鏈式處理,將請求轉發到指定的Action
5.json:實現Ajsx時,返回JSON對象。
現在大家來考慮一個問題:例如在一個項目中分為管理員和普通用戶兩類,如果管理員登陸成功後跳轉到後台管理頁面,普通用戶登陸成功後跳轉到首頁,像這種在配置<result>時,結果頁面不能確定,需要運行時才能確定該怎麼辦呢?
下面看這個方法來解決這個問題:
package action; import com.opensymphony.xwork2.ActionSupport; import entity.User; public class DynamicAction extends ActionSupport { private User user; // 下一個跳轉到的Action private String nextDispatch; public String login(){ if (user.getPassword().equals("common")) { nextDispatch="common"; return SUCCESS; } else if (user.getUsername().equals("admin")) { nextDispatch="admin"; return SUCCESS; } else { return INPUT; } } public User getUser() { return user; } public void setUser(User user) { this.user = user; } public String getNextDispatch() { return nextDispatch; } public void setNextDispatch(String nextDispatch) { this.nextDispatch = nextDispatch; } }
在web.xml中的配置:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"> <struts> <package name="user" namespace="/user" extends="struts-default"> <action name="login" class="action.UserAction" method="login"> <result name="success" type="redirectAction">${nextDispatch}</result> </action> <action name="common" class="action.CommonAction"> <result name="success">common.jsp</result> </action> <action name="admin" class ="action.AdminAction"> <result name="success">admin.jsp</result> </action> </package> </struts>
在這個配置文件中,使用${nextDispatch}取出了存儲在UserAction中的nextDispatch變量的值,然後再根據它的值,使用redirectAction方式重定向到name為common或admin的<action>.
配置跳轉公共錯誤頁面的<result>
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"> <struts> <package name="user" namespace="/user" extends="struts-default"> <global-results> <result name="error">/error.jsp</result> </global-results> <action name="add" class="action.UserAction" method="add"> <result >addUser.jsp</result> </action> </package> </struts>