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{@Overridepublic String execute() throws Exception {System.out.println("ResulttypeAction ************ execute()");//struts2框架将request封装成一个map集合,通过struts2框架提供工具类ServletActionContext的getRequest()方法来获取requestHttpServletRequest 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的结果类型相关推荐

  1. Struts2中 Result类型配置详解

    一个result代表了一个可能的输出.当Action类的方法执行完成时,它返回一个字符串类型的结果码,框架根据这个结果码选择对应的result,向用户输出. 在com.opensymphony.xwo ...

  2. Struts2中Result类型介绍

    1.在Struts2中,Result类型有12种,分别为dispatcher,redirect,chain,redirectAction,freemarker,httpheader,stream,ve ...

  3. struts2 action 返回类型分析

    struts2中action的某个方法,可以返回某个字符串(String),例如:ActionSupport中存在的SUCCESS,ERROR等字符串,也可以不返回数据(方法返回类型为void): 通 ...

  4. Struts2 返回结果类型为Redirect时注意问题

    Struts2 业务控制器返回结果type类型为Redirect时注意问题: Redirect 相当于重新发送一次请求,和在网页上直接输入URL请求一样,所以它是不可以重定向到 WEB-INF 下面的 ...

  5. Struts2中自定义类型转换器

    Struts2虽然提供了强大的类型转换机制,但是有的情况还是需要程序员手动去转换. 同样拿经典的用户登录功能: <h2>局部类型转换器</h2><s:form actio ...

  6. struts2 跳转类型 result type=chain、dispatcher、redirect

    转自: dispatcher 为默认跳转类型,用于返回一个视图资源(如:jsp) Xml代码 : <result name="success">/main.jsp< ...

  7. 第八篇——Struts2的处理结果类型

    Struts2处理结果类型 1.SUCCESS:表示Action正确的执行完成,返回相应的视图,success是name属性的默认值: 2.ERROR:表示Action执行失败,返回到错误处理视图: ...

  8. struts2学习笔记之十一:struts2的类型转换器

    Struts2的类型转换器 如何实现Struts2的类型转换器? * 继承StrutsTypeConverter * 覆盖convertFromString和convertToString 注册类型转 ...

  9. struts2拦截器_Struts2 学习笔记(二)

    1. Struts2的Servlet API的访问 在使用Struts2的框架的过程中,发现Struts2和Servlet的API是解耦合的.在实际开发中,经常使用到Servlet的API,比如进行登 ...

最新文章

  1. 【怎样写代码】确保对象的唯一性 -- 单例模式(六):扩展案例
  2. 关于error:Cannot assign to 'self' outside of a method in the init family
  3. 每天一道LeetCode-----只可能有'.'和'*'的字符串正则匹配
  4. 分布式 ID的 9 种生成方式
  5. 外设驱动库开发笔记37:S1336-5BQ光敏二极管作为光度计驱动
  6. java rsa算法_求RSA算法JAVA实现源代码(带界面的)
  7. arm 基于qcamera实现_面向HPC和笔记本市场 ARM发Cortex A78C增强版
  8. 网站静态化处理--总述(1)
  9. 计算机组成原理第四章中,计算机组成原理第四章..ppt
  10. 从sql2016导出数据库到sql2014
  11. 股票数据库接口是什么意思?
  12. 《深度学习之美》推荐序:通俗也是一种美德
  13. linux 查看vcf文件,vcf文件扩展名,vcf文件怎么打开?
  14. uniapp实现设备对接wifi功能
  15. 如何提高数据处理中的准确性
  16. seo常用工具,seo常用工具搜行者SEO
  17. 做微商洗发水怎么做引流?洗发水类微商怎么引流精准客户?
  18. 如何将svg格式图片转换为其他格式图片,如png
  19. English语法_定语从句 - 限定性与非限定性
  20. DNS服务器故障纠错

热门文章

  1. 【JAVA】接入苹果授权登录
  2. linux qq 登录失败 错误码 -1,下载最新pidgin2.0.1源代码解决登录QQ提示密码错误
  3. Python金融数据挖掘 第7章 复习思考题 3
  4. 多渔:第一桶金启示录
  5. Ubuntu20.04 sudo免密码
  6. mac上投屏android_MacOS+Android,如何用上投屏控制软件scrcpy
  7. 工作之路 - 南京滕楷通訊科技有限公司
  8. 函数式编程思想:不变性
  9. 指尖创客机器人_IRM国际机器人创客选拔赛落幕 30名小选手将代表重庆前往上海参赛...
  10. 工信部计算机二级怎么报名,计算机证书问题