Struts2之Result詳解


  上一篇我們把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表達式,后續內容持續更新中。。。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM