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
- 查看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>