Struts2的ResultType和Action处理链
Struts2的结果类型
在struts-default.xml中定义了Struts2内置的所有可用的<result-type/>
所有的Struts2结果处理类都要直接或间接的实现com.opensymphony.xwork2.Result接口
在struts-default.xml中的<result-types/>里面,有这样一行声明
Deprecated name form scheduled for removal in Struts 2.1.0. The camelCase versions are preferred.
即:不建议使用以下两种结果类型,在Struts-2.1.0中它们将被移除,应采用Java命名规则,即骆驼命名方式,也即驼峰命名规则
另外Struts2还有一些插件,这些插件还支持一些其它结果类型,这里暂时先不涉及它们
结果类型为input的页面的作用
Struts2应用在运行过程中若发现addFieldError()中有信息或者类型转换失败或着输入校验失败等情况
那么它会自动跳转到name为input的<result/>,然后转到INPUT所对应的页面
若JSP页面中表单是用普通<form>编写的,发生错误而返回该页面时,则原数据将消失
若JSP页面中表单是用<s:form/>编写的,发生错误而返回该页面时,则原数据仍存在
若没有提供name值为input的<result/>,那么发生错误时,将直接在浏览器中提示404错误
结果类型中的httpheader
httpheader结果类型很少使用到,它实际上是返回一个HTTP响应的头信息
若单纯的设置<result type="httpheader">/result.jsp</result>,执行时控制台会报如下错误
Caught OgnlException while setting property 'status' on type 'org.apache.struts2.dispatcher.HttpHeaderResult'.
java.lang.NoSuchMethodException: setStatus(java.lang.String)
翻译:应用程序在设置status属性时捕获了OgnlException异常
查看HttpHeaderResult类源代码发现,它果然定义了private int status = -1
它代表的是一个状态码,较常见的状态码如下
200对应OK
404对应File Not Found或者requested resource() is not available
500对应服务器内部错误
这时我们在<action/>中修改为<result type="httpheader"><param name="status">404</param></result>即可
这样当Action执行完毕,就会转向到SUCCESS结果,所以页面就会显示404错误提示
关于httpheader结果类型,了解即可,平时很少用到的不是很多
结果类型中的plainText
当设定为type="plainText"之后,就可以显示原始文件内容,例如文件源代码
<result name="success" type="plainText">/testSuc.jsp</result>
这时访问应用,当跳转到testSuc.jsp页面后,右键就可以查看到它的Java代码了
它比较适用于Java教学网站,但若仅设置type="plainText"的话,页面中显示中文时会乱码
这时就可以借助它的charSet属性以解决中文显示时的乱码问题
- <result name="success" type="plainText">
- <param name="location">/testSuc.jsp</param>
- <param name="charSet">GBK</param>
- </result>
<result name="success" type="plainText"> <param name="location">/testSuc.jsp</param> <param name="charSet">GBK</param> </result> 如果不设置charSet属性,反而去配置struts.i18n.encoding全局属性,是不能解决问题的设置charSet属性的目的就是让JSP页面的编码与明文显示时的编码一致
结果类型中redirect和redirectAction的区别
redirect是在处理完当前Action之后,重定向到另外一个实际的物理资源
redirectAction也是重定向,但它重定向到的是另外一个Action
只要是重定向,那么之前凡是保存在request里面的东西就全都消失了
因为重定向实际是发送第二个请求,故请求中的东西也就不会出现在第二个请求里面了
也就是说重定向是不共享request的东西,重定向后的页面中无法接收request里的东西
另外dispatcher结果类型的default属性为TRUE,故<result-type/>缺省为dispatcher
所以如果没有设置type属性的话,那么默认的是请求转发,即浏览器显示的是*.action
但是在设置type="redirect"属性后,就可以重定向了,即浏览器显示的是/login2.jsp
Struts2的Action处理链
从一个Action跳转到另一个Action,有两种办法,即将type设置为chain或者redirectAction
chain结果类型表示将多个Action作为一个链来处理
而使用chain和redirectAction的好处就是:它会按照框架的默认后缀去自动匹配后缀
而chain和redirectAction的区别与dispatcher和redirect的区别是一样的
即同样是跳转到一个Action上,但chain是服务器跳转,而redirectAction是客户端跳转
服务器跳转的过程中,可以共享数据,这时后面的Action就可以接收前面Action中的属性信息进行二次处理
以下是chain结果类型的使用示例
- <action name="firstchain" class="com.jadyer.action.FirstAction">
- <result type="chain">secondchain</result>
- </action>
- <action name="secondchain" class="com.jadyer.action.SecondAction">
- <result type="chain">thirdchain</result>
- </action>
- <action name="thirdchain" class="com.jadyer.action.ThirdAction">
- <result type="plainText">/chainResult.jsp</result>
- </action>
<action name="firstchain" class="com.jadyer.action.FirstAction"> <result type="chain">secondchain</result> </action> <action name="secondchain" class="com.jadyer.action.SecondAction"> <result type="chain">thirdchain</result> </action> <action name="thirdchain" class="com.jadyer.action.ThirdAction"> <result type="plainText">/chainResult.jsp</result> </action> 或者使用<result type="redirect">secondchain.action</result>即手工添加 .action 亦可正常访问但不建议这么做,因为若修改应用的Action后缀,这里也需手动的把后缀改掉,麻烦得很尽管在官方帮助文档的案例中,曾使用过这种方式来执行下一个Action,但这是不严谨的
下面的例子是访问不同命名空间下的Action
- <package name="test" extends="struts-default" namespace="/">
- <action name="test" class="cn.jadyer.action.TestAction">
- <result name="success" type="redirectAction">
- <!--这里也可将两行<param/>写成一行,即<param name="actionName">/xx/test1</param> -->
- <param name="actionName">test1</param>
- <param name="namespace">/xx</param>
- </result>
- </action>
- </package>
- <package name="test1" extends="struts-default" namespace="/xx">
- <action name="test1" class="cn.jadyer.action.Test1Action">
- <result name="success" type="redirect">/test1Suc.jsp?name=${name}</result>
- </action>
- </package>
<package name="test" extends="struts-default" namespace="/"> <action name="test" class="cn.jadyer.action.TestAction"> <result name="success" type="redirectAction"> <!--这里也可将两行<param/>写成一行,即<param name="actionName">/xx/test1</param> --> <param name="actionName">test1</param> <param name="namespace">/xx</param> </result> </action> </package> <package name="test1" extends="struts-default" namespace="/xx"> <action name="test1" class="cn.jadyer.action.Test1Action"> <result name="success" type="redirect">/test1Suc.jsp?name=${name}</result> </action> </package>
客户端跳转中的参数传递
若第二个Action使用type="redirect",那么在页面中将无法接收Action中所共享的数据
但在客户端跳转中,我们可以在链接上传参。比如result写成/test1Suc.jsp?name=${username}
在Struts2的XML文件中可以使用${}表达式,它会自动的取出Action中所有可用的属性,作为参数传递到下一页面
这里${}不是EL表达式,实际上它的本质上是OGNL表达式
由于从链接中取值,故用<%=request.getParameter("name")%>或者${param.name},这里param相当于request.getParameter("")
注意也不能使用${name},因为它是用来从page、request、session、application中取值的
并且页面中也不能使用<s:property value="name"/>接收参数值,因为它是从ValueStack中取值的
下面是代码示例
- <action name="test" class="cn.jadyer.action.TestAction">
- <result name="success" type="redirectAction">
- <param name="actionName">test1</param>
- </result>
- </action>
- <action name="test1" class="cn.jadyer.action.Test1Action">
- <result name="success" type="redirect">/test1Suc.jsp?name=${username}</result>
- </action>
分享到:
相关推荐
按照Struts1.x的程序开发步骤,我们可以逐一对应到Struts2中: 1. **安装Struts2:** - 不同于Struts1的Servlet配置,Struts2需要配置Filter。在`web.xml`中添加Struts2的Filter配置,如: ```xml ...
Ognl(Object-Graph Navigation Language)是Struts2中的默认表达式语言,用于在Action和视图之间传递数据。Ognl表达式可以方便地访问对象属性,执行运算和方法调用。Struts2的标签库,如s:form、s:textfield等,...
在Struts2中,文件上传功能是常见的需求,比如用户可能需要上传个人照片、文档或者其他类型的文件。在这个"Struts2之struts2文件上传详解案例struts011"中,我们将深入探讨如何实现这一功能。 首先,我们需要了解...
Struts2 Result 配置详解 Struts2 框架中 Result 配置是一种非常重要的配置,它直接影响着应用程序的执行结果。Result 配置通常用于定义 Action 的执行结果,例如将结果.redirect 到一个新的 URL,或者将结果....
7. `s:action`: 用于执行一个Struts2 Action,可以包含在页面跳转和条件逻辑中。 8. `s:property`: 显示Action或session中的属性值,是展示数据常用标签。 9. `s:if` 和 `s:else`: 条件判断标签,类似于Java的if-...
在深入详解Struts2的课本代码中,我们可以看到一系列章节对应的不同代码示例,包括`ch01`、`ch02`、`ch03_1`、`ch03_2`、`ch03_3`和`ch03_4`。这些章节通常会涵盖以下几个重要的知识点: 1. **Struts2基础概念**:...
Struts2的配置主要在struts.xml文件中进行,包括Action配置、结果类型配置、拦截器配置等。Action配置定义了Action类及其关联的URL,结果类型配置决定了Action执行后的跳转逻辑,拦截器配置则允许在Action执行前后...
不同于Struts1中的ActionServlet,Struts2中的FilterDispatcher是基于Java Servlet过滤器(Filter)来实现的。 2. **Action**:在Struts2中,Action不再直接与Servlet API耦合,而是通过拦截器(Interceptors)进行...
在Struts2中,Action是核心组件,负责处理用户的请求并执行业务逻辑,而Result则是Action执行后的跳转结果。本篇将深入讲解Struts2中的Action和Result,以及它们如何协同工作来实现页面跳转。 首先,让我们理解...
在Struts2中,模型通常是通过JavaBean来实现的,这些Bean通常称为Action类,它们负责执行具体的业务操作,并将结果返回给控制器。 ##### 2. 视图(View) 视图层主要用于展示数据,即用户界面部分。Struts2提供了...
2. **Action类**:在Struts2中,Action类不再是必须继承特定父类,而是可以实现Action接口或使用注解。Action的执行方法默认为execute(),但可以通过注解自定义。 3. **配置方式**:Struts2的配置更加灵活,可以...
### Struts2 注解详解 #### 一、Struts2 Convention 插件介绍与使用 在 Struts2 框架的发展过程中,随着版本的更新和技术的演进,其配置方式也发生了变化。从 Struts2.1 版本开始,官方不再推荐使用 Codebehind ...
在Struts2中,Action承担了Controller的角色,而Model通常是JavaBean,View则可以是JSP、Freemarker或其他模板技术。通过Action,我们可以将用户请求与业务逻辑解耦,提高代码的可维护性和可测试性。 Struts2的例子...
在Struts2中,控制器的角色由Struts2框架本身承担,它根据配置文件(struts.xml)解析请求,调用相应的Action执行业务逻辑,并决定跳转到哪个视图。 三、Struts2核心概念 1. Action:每个Action代表一个业务操作,...
OGNL是Struts2中的表达式语言,用于在Action和视图之间传递数据。它允许在JSP中直接访问Action属性,简化了视图层的代码。 8. **插件体系**: Struts2具有强大的插件支持,如Struts2-convention插件可以自动根据...
1. **Action类**:在Struts2中,Action类是业务逻辑处理的中心,它对应于控制器部分。Action类负责接收用户请求,处理业务逻辑,并通过返回值决定页面跳转的方向。 2. **配置文件**:Struts2的配置文件通常为struts...
### Struts1 框架详解 #### 一、Struts1 基础与架构 **1.1 J2EE技术栈** Struts1框架是基于Java2平台企业版(J2EE)构建的,它依赖于以下技术: - **Servlet**:处理HTTP请求的基础接口,用于创建Web应用中的...
本文将详细介绍Struts2中的标签库,帮助读者更好地理解和应用Struts2。 #### 二、Struts2标签库概述 Struts2标签库是由一系列预定义的HTML标签组成,这些标签可以执行复杂的操作而无需编写大量的Java或JSP代码。...
本深入详解将探讨Struts2的核心概念、工作原理、优势以及如何在实际项目中应用它。 Struts2是Apache软件基金会的一个开源项目,它在Struts1的基础上进行了许多改进,提供了更灵活的架构、更好的类型安全性和更丰富...