上一篇我們把Struts2中的Action接收參數的內容為大家介紹了,本篇我們就一起來簡單學習一下Action的4種Result type類型,分為:dispatcher(服務端頁面跳轉);redirect(客戶端頁面跳轉);chain(動作鏈跳轉);redirectAction(客戶端Action跳轉),當然還有其他類型,這里我們就以這四種為例為大家介紹一下,其他幾種大家有興趣單獨學習。下面我們一起來看一下上面四種的具體實現,首先是我們的配置文件:
<package name="resultFilter" namespace="/resultFilter" extends="struts-default"> <!-- http://localhost:8080/Struts/resultFilter/default --> <action name="default" class="com.edu.action.ResultFilter"> <result name="success">/default.jsp</result> </action> <!-- http://localhost:8080/Struts/resultFilter/dispatcher 服務端跳轉--> <action name="dispatcher" class="com.edu.action.ResultFilter" method="Dispatcher"> <result name="success" type="dispatcher">/dispatcher.jsp</result> </action> <!-- http://localhost:8080/Struts/resultFilter/redirect 客戶端跳轉 --> <action name="redirect" class="com.edu.action.ResultFilter" method="Redirect"> <result name="success" type="redirect">/redirect.jsp</result> </action> <!-- http://localhost:8080/Struts/resultFilter/chain 動作鏈跳轉--> <!-- http://blog.csdn.net/randomnet/article/details/8656759 --> <action name="chain" class="com.edu.action.ResultFilter" method="Chain"> <result name="success" type="chain">chain1</result> </action> <action name="chain1" class="com.edu.action.ResultFilter" method="Chain"> <result name="success">/chain.jsp</result> </action> <!-- http://localhost:8080/Struts/resultFilter/redirectAction 客戶端跳轉--> <action name="redirectAction" class="com.edu.action.ResultFilter" method="RedirectAction"> <result name="success" type="redirectAction"> <param name="namespace">/redirectAction</param> <param name="actionName">default</param> </result> </action> <!-- http://localhost:8080/Struts/resultFilter/redirectAction 客戶端跳轉(單值傳參)--> <action name="redirectAction" class="com.edu.action.ResultFilter" method="RedirectAction"> <result name="success" type="redirectAction"> <param name="namespace">/redirectAction</param> <param name="actionName">default?value1=${value1}</param> </result> </action> <!-- http://localhost:8080/Struts/resultFilter/redirectAction 客戶端跳轉(多值傳參)--> <action name="redirectAction" class="com.edu.action.ResultFilter" method="RedirectAction"> <result name="success" type="redirectAction"> <param name="namespace">/redirectAction</param> <param name="actionName">default</param> <param name="value1">${value1}</param> <param name="value2">${value2}</param> </result> </action> </package> <package name="redirectAction" namespace="/redirectAction" extends="struts-default"> <action name="default" class="com.edu.action.ResultFilter"> <result name="success">/redirectAction.jsp</result> </action> </package>
default action我們並沒有設置result的type類型,系統默認設置為:dispatcher類型,dispatcher類型和redirect下只能跳轉到頁面,兩者的區別在於,dispatcher類型屬於服務端調轉,地址欄不更新,redirect屬於客戶端跳轉,地址欄會更新。chain類型屬於動態鏈跳轉,故我們在第二個Action中任然可以拿到傳遞給第一個Action的參數,我們可以在頁面上添加<s:debug></s:debug>來查看具體信息。最后一個redirectAction大家一看配置一定已經明白了,這里就不再贅述。下面我們看一下chain動態鏈跳轉,首先看一下我的jsp頁面:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <%@taglib uri="/struts-tags" prefix="s"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>Result類型跳轉</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> </head> <body> result的chain跳轉類型 <s:debug></s:debug> </body> </html>
運行我們的工程,打開debug:
這樣大家是不是對於動態鏈跳轉認識更加清楚一些,更具體的內容,請參考:http://blog.csdn.net/randomnet/article/details/8656759
下面我們來一起學習一下global-reslut全局結果集的配置,首先先看配置文件:
<?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"> <!-- http://localhost:8080/Struts13/login?name=3 --> <global-results> <result name="other">/other.jsp</result> </global-results> <action name="login" class="com.edu.action.Login"> <!-- http://localhost:8080/Struts13/login?name=1 --> <result name="success">/success.jsp</result> <!-- http://localhost:8080/Struts13/login?name=2 --> <result name="error">/error.jsp</result> </action> </package> </struts>
下面我們再來看一下Action中的返回參數:
public class Login extends ActionSupport implements ModelDriven<User>{ private User user = new User(); @Override public String execute() throws Exception { if(user.getName() == 1){ return SUCCESS; } else if(user.getName() == 2){ return ERROR; } else { return "other"; } } public User getModel() { return user; } }
我們看到當我們的傳入的Name值等於1和2時,Action會返回other,我們再移步配置文件,我們發現,login Action下的Result結果處理類型並不包括other類型,那是哪里這樣的話是不是就會沒有訪問結果返回呢?答案一定是不,我們仔細觀察我們的配置文件,我們發現我們在上面配置了
<global-results> <result name="other">/other.jsp</result> </global-results>
global-results就是我們的全局結果集設置,這樣當我們的other返回給Action后,就會被這個result處理。
有了全局結果集,下面我們來一起研究下動態結果集的概念,首先我們看一下我們的Action內容:
public class resultJsp extends ActionSupport implements ModelDriven<User>{ private User user = new User(); private String resultJsp; public String getResultJsp() { return resultJsp; } public void setResultJsp(String resultJsp) { this.resultJsp = resultJsp; } @Override public String execute() throws Exception { if(user.getName() == 1){ resultJsp = "success.jsp"; } else { resultJsp = "error.jsp"; } return SUCCESS; } public User getModel() { return user; } }
我們看到當我們的name值等於1時,resultJsp我們設置的參數是success.jsp,我們的成功操作結果頁面,那么我們的配置文件時如何識別並進行處理的呢?我們來一起看一下配置文件的設置:
<?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"> <default-action-ref name="index"></default-action-ref> <!-- http://localhost:8080/Struts/login?name=1 --> <action name="login" class="com.edu.action.resultJsp"> <result>${resultJsp}</result> </action> </package> </struts>
我們看到result之間我們使用${resultJsp}來動態設置跳轉的頁面,我們知道result在沒有設置Type類型時為dispatcher,服務端頁面跳轉,我們的瀏覽器地址欄不顯示跳轉頁面名稱。
接下來我們再來看一下動態參數傳遞的內容,就是當我們的Action處理完成后,在跳轉到新頁面時,將一些參數動態傳遞出去。我們先來看一下我們的Action中的處理:
public class resultJsp extends ActionSupport{ private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String execute() throws Exception { return SUCCESS; } }
我們設置了一個全局變量name,接下來我們就通過配置文件將name值動態的傳遞到下一頁,配置文件:
<?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"> <default-action-ref name="index"></default-action-ref> <!-- http://localhost:8080/Struts/login?name=1 --> <action name="login" class="com.edu.action.resultJsp"> <!-- 這里使用 type = redirect 是為了 --> <result name="success" type="redirect">/success.jsp?n=${name}</result> </action> </package> </struts>
這樣我們的參數便可以傳遞到下一個頁面請求中了,這里需要提示一下就是,result的類型,這里是為了讓大家在地址欄能清楚的看到參數傳遞的過程,我們知道redirect是客戶端跳轉,所以我們在地址欄是可以看到跳轉路徑的。
最后在插一句,在介紹全局結果集,我們提到,當我們的action下面沒有設置返回名稱的result時,struts2回去全局結果集進行查找,如果都沒有找到處理結果會出現什么情況呢?具體的實驗就不再帶領大家一起實現了,這里我只把我這測試的結果展示一下,大家做個參考,了解一下:
到這里關於Struts2的result部分就為大家介紹完了,接下來我們將一起學習ONGL表達式,后續內容持續更新中。。。