最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

Struts2的结果类型

旗下网站admin29浏览0评论

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"
    ".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"
    ".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"
    ".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"
    ".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>
发布评论

评论列表(0)

  1. 暂无评论