1. 程式人生 > >Struts2的結果型別

Struts2的結果型別

result

  • 每個 action 方法都將返回一個 String 型別的值, Struts 將根據這個值來決定響應什麼結果.
  • 每個 Action 宣告都必須包含有數量足夠多的 result 元素, 每個 result 元素分別對應著 action 方法的一個返回值.
  • result 元素可以有下面兩個屬性
    • name: 結果的名字, 必須與 Action 方法的返回值相匹配, 預設值為 success
    • type: 響應結果的型別. 預設值為 dispatcher

結果型別

在struts2-core-2.3.31.jar包下的struts-default.xml配置檔案:
這裡寫圖片描述


這裡寫圖片描述
這裡寫圖片描述

理解struts-default.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:是struts2框架底層提供出來的
            * name:用於讓其他包來繼承的
            * abstract:設定為抽象包,下面不能定義action標籤
     -->
<package name="struts-default" abstract="true"> <!-- result-types:宣告結果型別 * name:結果型別的名稱 * class:結果型別對應類的完整路徑 * default:設定其為預設,true是預設 --> <result-types> <!-- 轉發到action --> <result-type
name="chain" class="com.opensymphony.xwork2.ActionChainResult"/>
<!-- 轉發到jsp --> <result-type name="dispatcher" class="org.apache.struts2.dispatcher.ServletDispatcherResult" default="true"/> <result-type name="freemarker" class="org.apache.struts2.views.freemarker.FreemarkerResult"/> <result-type name="httpheader" class="org.apache.struts2.dispatcher.HttpHeaderResult"/> <!-- 重定向到jsp --> <result-type name="redirect" class="org.apache.struts2.dispatcher.ServletRedirectResult"/> <!-- 重定向到action --> <result-type name="redirectAction" class="org.apache.struts2.dispatcher.ServletActionRedirectResult"/> <!-- 用於下載 --> <result-type name="stream" class="org.apache.struts2.dispatcher.StreamResult"/> <result-type name="velocity" class="org.apache.struts2.dispatcher.VelocityResult"/> <result-type name="xslt" class="org.apache.struts2.views.xslt.XSLTResult"/> <result-type name="plainText" class="org.apache.struts2.dispatcher.PlainTextResult" /> </result-types> <!-- interceptors * interceptor:宣告攔截器 * name:攔截器的名稱 * class:對應攔截器類的完整路徑 --> <interceptors> <interceptor name="alias" class="com.opensymphony.xwork2.interceptor.AliasInterceptor"/> <interceptor name="autowiring" class="com.opensymphony.xwork2.spring.interceptor.ActionAutowiringInterceptor"/> <interceptor name="chain" class="com.opensymphony.xwork2.interceptor.ChainingInterceptor"/> <interceptor name="conversionError" class="org.apache.struts2.interceptor.StrutsConversionErrorInterceptor"/> <interceptor name="cookie" class="org.apache.struts2.interceptor.CookieInterceptor"/> <interceptor name="clearSession" class="org.apache.struts2.interceptor.ClearSessionInterceptor" /> <interceptor name="createSession" class="org.apache.struts2.interceptor.CreateSessionInterceptor" /> <interceptor name="debugging" class="org.apache.struts2.interceptor.debugging.DebuggingInterceptor" /> <interceptor name="execAndWait" class="org.apache.struts2.interceptor.ExecuteAndWaitInterceptor"/> <interceptor name="exception" class="com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor"/> <interceptor name="fileUpload" class="org.apache.struts2.interceptor.FileUploadInterceptor"/> <interceptor name="i18n" class="com.opensymphony.xwork2.interceptor.I18nInterceptor"/> <interceptor name="logger" class="com.opensymphony.xwork2.interceptor.LoggingInterceptor"/> <interceptor name="modelDriven" class="com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor"/> <interceptor name="scopedModelDriven" class="com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor"/> <interceptor name="params" class="com.opensymphony.xwork2.interceptor.ParametersInterceptor"/> <interceptor name="actionMappingParams" class="org.apache.struts2.interceptor.ActionMappingParametersInteceptor"/> <interceptor name="prepare" class="com.opensymphony.xwork2.interceptor.PrepareInterceptor"/> <interceptor name="staticParams" class="com.opensymphony.xwork2.interceptor.StaticParametersInterceptor"/> <interceptor name="scope" class="org.apache.struts2.interceptor.ScopeInterceptor"/> <interceptor name="servletConfig" class="org.apache.struts2.interceptor.ServletConfigInterceptor"/> <interceptor name="timer" class="com.opensymphony.xwork2.interceptor.TimerInterceptor"/> <interceptor name="token" class="org.apache.struts2.interceptor.TokenInterceptor"/> <interceptor name="tokenSession" class="org.apache.struts2.interceptor.TokenSessionStoreInterceptor"/> <interceptor name="validation" class="org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor"/> <interceptor name="workflow" class="com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor"/> <interceptor name="store" class="org.apache.struts2.interceptor.MessageStoreInterceptor" /> <interceptor name="checkbox" class="org.apache.struts2.interceptor.CheckboxInterceptor" /> <interceptor name="profiling" class="org.apache.struts2.interceptor.ProfilingActivationInterceptor" /> <interceptor name="roles" class="org.apache.struts2.interceptor.RolesInterceptor" /> <interceptor name="annotationWorkflow" class="com.opensymphony.xwork2.interceptor.annotations.AnnotationWorkflowInterceptor" /> <interceptor name="multiselect" class="org.apache.struts2.interceptor.MultiselectInterceptor" /> <!-- Basic stack --> <interceptor-stack name="basicStack"> <interceptor-ref name="exception"/> <interceptor-ref name="servletConfig"/> <interceptor-ref name="prepare"/> <interceptor-ref name="checkbox"/> <interceptor-ref name="multiselect"/> <interceptor-ref name="actionMappingParams"/> <interceptor-ref name="params"> <param name="excludeParams">dojo\..*,^struts\..*,^session\..*,^request\..*,^application\..*,^servlet(Request|Response)\..*,parameters\...*</param> </interceptor-ref> <interceptor-ref name="conversionError"/> </interceptor-stack> <!-- interceptor-stack:攔截器棧 * struts2框架通過使用攔截器棧,進而使用上面宣告好的攔截器 * 在攔截器棧裡面,存放了一些上面宣告好的攔截器 * 攔截器棧相當於一個list集合,執行的時候是按照存放的先後順序來執行 --> <interceptor-stack name="defaultStack"> <interceptor-ref name="exception"/> <interceptor-ref name="alias"/> <interceptor-ref name="servletConfig"/> <interceptor-ref name="i18n"/> <interceptor-ref name="prepare"/> <interceptor-ref name="chain"/> <interceptor-ref name="scopedModelDriven"/> <interceptor-ref name="modelDriven"/> <interceptor-ref name="fileUpload"/> <interceptor-ref name="checkbox"/> <interceptor-ref name="multiselect"/> <interceptor-ref name="staticParams"/> <interceptor-ref name="actionMappingParams"/> <interceptor-ref name="params"> <param name="excludeParams">dojo\..*,^struts\..*,^session\..*,^request\..*,^application\..*,^servlet(Request|Response)\..*,parameters\...*</param> </interceptor-ref> <interceptor-ref name="conversionError"/> <interceptor-ref name="validation"> <param name="excludeMethods">input,back,cancel,browse</param> </interceptor-ref> <interceptor-ref name="workflow"> <param name="excludeMethods">input,back,cancel,browse</param> </interceptor-ref> <interceptor-ref name="debugging"/> </interceptor-stack> </interceptors> <!-- 配置在struts2框架執行時,預設要執行的是哪個攔截器棧,defaultStack --> <default-interceptor-ref name="defaultStack"/> <!-- 配置在struts2框架執行時,如果沒有為action指定class的話,預設要執行的class的類名 --> <default-class-ref class="com.opensymphony.xwork2.ActionSupport" /> </package> </struts>

結果型別: dispatcher

  • dispatcher 結果型別是最常用的結果型別, 也是 struts 框架預設的結果型別
  • 該結果型別有一個 location 引數, 它是一個預設引數

    • 檢視API文件org.apache.struts2.dispatcher.ServletDispatcherResult
      這裡寫圖片描述
  • dispatcher 結果型別將把控制權轉發給應用程式裡的某個資源

  • dispatcher 結果型別不能把控制權轉發給一個外部資源. 若需要把控制權重定向到一個外部資源, 應該使用 redirect 結果型別

結果型別: dispatcher的兩種寫法

<!-- 方法一:type表示結果型別,預設值是dispatcher(轉發) -->
<result name="success" type="dispatcher">/resulttype/success.jsp</result> 

<!-- 方法二: 
 * type="dispatcher":struts2執行時,根據type="dispatcher"的值執行
              org.apache.struts2.dispatcher.ServletDispatcherResult
 * param name="location":該配置要呼叫ServletDispatcherResult中的setLocation()
 * location:表示ServletDispatcherResult中的屬性名
 * 該配置要呼叫ServletDispatcherResult中的setLocation("/resulttype/success.jsp")
-->
<result name="success" type="dispatcher">
    <param name="location">/resulttype/success.jsp</param>
</result>

結果型別: dispatcher的底層程式碼說明

這裡寫圖片描述

結果型別: redirect

  • redirect 結果型別將把響應重定向到另一個資源, 而不是轉發給該資源.
  • redirect 結果型別接受下面這些引數:
    • location: 用來給出重定向的目的地
    • parse: 用來表明是否把 location 引數的值視為一個 OGNL 表示式來解釋. 預設值為 true
  • redirect 結果型別可以把響應重定向到一個外部資源
    • struts-default.xml中的
    • <result-type name="redirect" class="org.apache.struts2.dispatcher.ServletRedirectResult"/>

這裡寫圖片描述

結果型別: redirect的底層程式碼說明

這裡寫圖片描述

結果型別: redirectAction

  • redirectAction 結果型別把響應重定向到另一個 Action
  • redirectAction 結果型別接受下面這些引數:
    • actionName: 指定 “目的地” 動作的名字. 它是預設屬性
    • namespace: 用來指定 “目的地” 動作的名稱空間. 如果沒有配置該引數, Struts 會把當前 Action 所在的名稱空間作為 “目的地” 的名稱空間

檢視API文件

這裡寫圖片描述

結果型別: redirectAction的底層程式碼說明

這裡寫圖片描述

編寫ResulttypeAction檔案

package cn.itcast.resulttype;

import javax.servlet.http.HttpServletRequest;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionSupport;


@SuppressWarnings("serial")
public class ResulttypeAction extends ActionSupport{


    @Override
    public String execute() throws Exception {

        System.out.println("ResulttypeAction ************ execute()");
        //struts2框架將request封裝成一個map集合,通過struts2框架提供工具類ServletActionContext的getRequest()方法來獲取request
        HttpServletRequest request = ServletActionContext.getRequest();

        request.setAttribute("username", "username_request");

        return "success";
    }
}

編寫struts_resulttype.xml

方法一: 預設為轉發
type:指定結果型別,預設為轉發”dispatcher”

<?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="resulttype" namespace="/resulttype" extends="struts-default">

        <action name="resulttypeAction" class="cn.itcast.resulttype.ResulttypeAction">
        <!-- 方法一
                預設為轉發 
                    * type:指定結果型別,預設為轉發"dispatcher"
            -->
            <result name="success" type="dispatcher">/resulttype/success.jsp</result>
        </action>

    </package>

</struts>

這裡寫圖片描述

引入自定義配置檔案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="cn/itcast/primer/struts_primer.xml"></include>
    <include file="cn/itcast/resulttype/struts_resulttype.xml"></include>
</struts>

jsp頁面

form.jsp頁面

<%@ page language="java" pageEncoding="utf-8" contentType="text/html; charset=utf-8"%>
<%@ taglib uri="/struts-tags"   prefix="s"%>
<html>
  <head>
    <title>My JSP 'index.jsp' starting page</title>
    </head>
  <body>
    <form action="${pageContext.request.contextPath}/resulttype/resulttypeAction.action" 
          name="form1"  method="post">
      <input type="submit" value="提交">
    </form>
  </body>
</html>

success.jsp頁面

<%@ page language="java" pageEncoding="utf-8" contentType="text/html; charset=utf-8"%>
<%@ taglib uri="/struts-tags"   prefix="s"%>
<html>
  <head>
    <title>My JSP 'index.jsp' starting page</title>
    </head>
  <body>
            resulttype :   ${requestScope.username}
  </body>
</html>

測試

轉發

方法一: 預設為轉發

<result name="success" type="dispatcher">/resulttype/success.jsp</result>

這裡寫圖片描述

方法二:標準寫法

<!-- 方法二 :標準寫法 -->
<result name="success" type="dispatcher">
    <!--  
            param:引數
            * name:引數的名稱為"location"
            實際上,是struts2框架底層的StrutsResultSupport類的setLocation()提供的
        public void setLocation(String location) {
              this.location = location;
        }
        * 所謂的引數,應該是set方法或者get方法後面跟的名稱才是引數名
    --> 
<param name="location">/resulttype/success.jsp</param>
</result> 

這裡寫圖片描述

重定向

重定向到jsp:

<!-- 
    重定向到jsp:org.apache.struts2.dispatcher.ServletRedirectResult
 -->
<result name="success" type="redirect">
    <param name="location">/resulttype/success.jsp</param>
</result> 

這裡寫圖片描述

重定向到action:


<!-- 
    重定向到action:org.apache.struts2.dispatcher.ServletActionRedirectResult
    * 無論是重定向到jsp還是重定向到action,底層程式碼都是一樣的
 -->
 <result name="success" type="redirectAction">  
    <!-- 
        param:
        * actionName:指定 “目的地” 動作的名字。指定的是struts.xml檔案action標籤的name屬性的值
        * namespace:指定的是struts.xml檔案action對應的package下的namespace屬性的值
     -->
     <param name="actionName">helloWorldAction</param>
    <param name="namespace">/primer</param>
</result>

這裡寫圖片描述

struts_resulttype.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="resulttype" namespace="/resulttype" extends="struts-default">

        <action name="resulttypeAction" class="cn.itcast.resulttype.ResulttypeAction">
        <!-- 方法一
                預設為轉發 
                    * type:指定結果型別,預設為轉發"dispatcher"
            -->
            <!-- <result name="success" type="dispatcher">/resulttype/success.jsp</result> -->
            <!-- 方法二 :標準寫法 -->
            <!-- <result name="success" type="dispatcher">

                    param:引數
                        * name:引數的名稱為"location"
                            實際上,是struts2框架底層的StrutsResultSupport類的setLocation()提供的
                            public void setLocation(String location) {
                                this.location = location;
                            }
                        * 所謂的引數,應該是set方法或者get方法後面跟的名稱才是引數名


                <param name="location">/resulttype/success.jsp</param>
            </result> -->


            <!-- 
                重定向到jsp:org.apache.struts2.dispatcher.ServletRedirectResult
             -->
            <!--<result name="success" type="redirect">
                <param name="location">/resulttype/success.jsp</param>
            </result> -->

            <!-- 
                重定向到action:org.apache.struts2.dispatcher.ServletActionRedirectResult
                    * 無論是重定向到jsp還是重定向到action,底層程式碼都是一樣的
             -->


              <result name="success" type="redirectAction"> 
                <!-- 
                    param:
                        * actionName:指定 “目的地” 動作的名字。指定的是struts.xml檔案action標籤的name屬性的值
                        * namespace:指定的是struts.xml檔案action對應的package下的namespace屬性的值
                 -->
             <param name="actionName">helloWorldAction</param>
                <param name="namespace">/primer</param>
            </result>

        </action>

    </package>

</struts>

相關推薦

深度解析struts2結果型別之chain

   前一段時間,有關chain的機制著實困繞了許久.儘管網上有許多關於chain的解說,但要不是隻談大理論,不結合例項;要不就是隻有示例,沒有挖出示例背後的意義.     先解釋下chain吧:   Chain:基本用途是構造成一條動作鏈。前一個動作將控

Struts2之result結果型別

伺服器端跳轉   客戶端跳轉  <action name="r1" > <result type="dispatcher" >/r1.jsp</result> </action>

Struts2中的結果型別解析

在struts2-core-2.0.11.2.jar根目錄下的struts-default.xml中配置了struts2提供的一系列結果型別 struts2的結果型別實現了com.opensymphony.xwork2.Result介面 ~~~~~~~~~~~~~~~~~~~ ty

Struts2結果型別

result 每個 action 方法都將返回一個 String 型別的值, Struts 將根據這個值來決定響應什麼結果. 每個 Action 宣告都必須包含有數量足夠多的 result 元素, 每個 result 元素分別對應著 action 方法的一個

Struts2-結果結果型別

結果 在struts中,action封裝請求引數,處理請求,處理結束後僅僅返回一個字串,這個字串就是結果(檢視資源的名字),在struts.xml檔案中,配置了檢視資源。 result節點: name指定檢視資源的名稱,對應action的返回字元type

Struts2 自定義結果型別

1、編寫一個類,實現com.opensymphony.xwork2.Result介面。 在該方法中可以拿到ServletAPI去完成你的功能 2、宣告自定義的結果型別:先聲明後使用 3、使用 小技巧:自定義的結果檢視,大家都要用時

Struts2 結果結果類型

exe const 翻頁 決定 標準 標簽 local 1.0 數位 正如前面提到的,<results>標簽在Struts2的MVC框架的視圖中所扮演的角色。動作是負責執行業務邏輯。執行業務邏輯後,接下來的步驟是使用<results>標簽顯示的視

Struts2結果頁面的配置

1 結果頁面的配置 1.1 全域性結果頁面 全域性結果頁面:全域性結果頁面指的是,在包中配置一次,其他的在這個包中的所有的action只要返回了這個值,都可以跳轉到這個頁面。 針對這個包下的所有的action的配置都有效。 區域性的優先與全域性的

Struts2型別轉換器不起作用

    看了書上關於struts2的型別轉換器後覺得挺明白,結果一試一大堆bug。發現使用模型驅動時區域性配置一直不起作用,先貼程式碼: 登錄檔單: <%@ page language="java" contentType="text/html; charset=U

hibernate hql 查詢返回結果型別

hql和sql區別/異同 HQL ————————————SQL 類名/屬性 ————————— 表名/列名 區分大小寫,關鍵字不區分大小寫———— 不區分大小寫 別名————————————————別名 ?,從下標0開始計算位置(hi

struts2型別轉換

http沒有型別的概念。在html表單中,每一項表單輸入只可能是一個字串或者一個字元陣列,在伺服器端,必須把String轉為特定的資料型別。所以在struts2中,從一個表單到一個Action物件的過程中出現了型別轉換的概念。 struts2中有基本的資料轉換功能,如int

struts2檔案型別

'.a' : 'application/octet-stream', '.ai' : 'application/postscript', '.aif' : 'audio/x-aiff', '.aifc' : 'aud

struts2結果處理-4種結果處理方式

1.學習路線 接下來咱們一起來學一學struts2的幾種結果處理方式(關於struts2搭建、配置我會在之後慢慢發的),let`s go!                                                                 

Struts2型別轉換及輸入校驗(集合型別的使用)

action: package org.action; import java.util.List; import org.model.Tel; import com.opensymphony.xwork2.ActionSupport; public class MyTyp

Struts2返回型別

開始使用struts2的時候,想跳轉到另外一個action,而且要代引數過去,真是讓我費了一番周折,後來發現並沒有哪麼複雜,struts2幫我們定義了很多返回型別,我們去合理使用就可以了。chain:將一個action的執行與另外一個配置好的action串連起來。用第一個ac

Struts2型別轉換及輸入校驗(自定義型別轉換器)

typeconverter2.jsp <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <%@ taglib uri="/struts-tags" prefix="s"

MyBatis呼叫帶有返回結果之output引數型別的儲存過程

儲存過程示例: ALTER PROCEDURE [WebApi_Login_SendPhoneCode ] ( @Action int, --1:查詢 2:新增一條記錄 @PhoneNo varchar(20), @Smscode varchar(10), @SendType

第04講 struts2設定資料-屬性驅動-基本資料型別

1,在 HeadFirstStruts2chapter02 中,新建包com.cruise.model包,新建bean:User,屬性分別為:userName,password,package com.cruise.model;public class User { &

正確生成浮點型的方法,解決sqlachemy Float浮點型的坑,生成float型別時,長度和精度均為0,導致查詢不到結果

問題描述 在使用flask_sqlachemy時,給price欄位選擇了Float型別,資料庫用的mysql,生成資料庫表後,發現   from sqlalchemy import Float,Column price = Column(Float,default=0.00) &

Java中兩個byte型別相加結果賦值給byte型別的變數會報編譯錯誤,byte加byte的結果為什麼是int?

背景: 之前偶然看到有討論這個問題,在網上搜了半天,結果都不盡如人意,解釋沒有到位, 有的說byte加byte預設就是int,那為什麼這麼做呢? 這不是找麻煩麼?這種奇怪的預設還有哪些?帶來一些列疑問。。。。。。 有的說byte儲存的就是整型資料,這種說法的對錯姑且不論,至少我覺得難免有