在實際的開發中常會遇到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>