`
jaybril
  • 浏览: 49783 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

struts2中的跳转详解 ----“请求转发”和“重定向”之间的区别(转)

 
阅读更多

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属性以解决中文显示时的乱码问题

  1. <result name="success" type="plainText">  
  2.     <param name="location">/testSuc.jsp</param>  
  3.     <param name="charSet">GBK</param>  
  4. </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作为一个链来处理
而使用chainredirectAction的好处就是:它会按照框架的默认后缀去自动匹配后缀
而chain和redirectAction的区别与dispatcher和redirect的区别是一样的
即同样是跳转到一个Action上,但chain是服务器跳转,而redirectAction是客户端跳转
服务器跳转的过程中,可以共享数据,这时后面的Action就可以接收前面Action中的属性信息进行二次处理


以下是chain结果类型的使用示例

  1. <action name="firstchain" class="com.jadyer.action.FirstAction">  
  2.     <result type="chain">secondchain</result>  
  3. </action>  
  4. <action name="secondchain" class="com.jadyer.action.SecondAction">  
  5.     <result type="chain">thirdchain</result>  
  6. </action>  
  7. <action name="thirdchain" class="com.jadyer.action.ThirdAction">  
  8.     <result type="plainText">/chainResult.jsp</result>  
  9. </action>  

或者使用<result type="redirect">secondchain.action</result>即手工添加 .action 亦可正常访问
但不建议这么做,因为若修改应用的Action后缀,这里也需手动的把后缀改掉,麻烦得很
尽管在官方帮助文档的案例中,曾使用过这种方式来执行下一个Action,但这是不严谨的

 


下面的例子是访问不同命名空间下的Action

  1. <package name="test" extends="struts-default" namespace="/">  
  2.     <action name="test" class="cn.jadyer.action.TestAction">  
  3.         <result name="success" type="redirectAction">  
  4.             <!--这里也可将两行<param/>写成一行,即<param name="actionName">/xx/test1</param> -->  
  5.             <param name="actionName">test1</param>  
  6.             <param name="namespace">/xx</param>  
  7.         </result>  
  8.     </action>  
  9. </package>  
  10. <package name="test1" extends="struts-default" namespace="/xx">  
  11.     <action name="test1" class="cn.jadyer.action.Test1Action">  
  12.         <result name="success" type="redirect">/test1Suc.jsp?name=${name}</result>  
  13.     </action>  
  14. </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中取值的
下面是代码示例

  1. <action name="test" class="cn.jadyer.action.TestAction">  
  2.     <result name="success" type="redirectAction">  
  3.         <param name="actionName">test1</param>  
  4.     </result>  
  5. </action>  
  6. <action name="test1" class="cn.jadyer.action.Test1Action">  
  7.     <result name="success" type="redirect">/test1Suc.jsp?name=${username}</result>  
  8. </action>  

转自:http://blog.csdn.net/jadyer/article/details/5887509

分享到:
评论

相关推荐

    struts2重定向实例源码

    在Struts2中,Action的执行结果可以被导向到不同的视图,这其中包括了"redirect"和"redirectAction"两种重定向结果类型。这两种结果类型在实际应用中有着重要的作用,特别是对于处理URL重写、防止重复提交等问题。 ...

    Struts2开发详解

    Struts2是一个强大的Java web应用程序框架,用于构建和维护可扩展、易于维护的Web应用程序。它是Apache软件基金会的Apache Struts项目的一部分,基于MVC(Model-View-Controller)设计模式,提供了一种组织应用程序...

    struts2 result配置详解

    Struts2 Result 配置详解 Struts2 框架中 Result 配置是一种非常重要的配置,它直接影响着应用程序的执行结果。Result 配置通常用于定义 Action 的执行结果,例如将结果.redirect 到一个新的 URL,或者将结果....

    Struts2基础总结-1

    ##### 1-2、struts.xml的配置 - **添加约束**:为了确保`struts.xml`文件格式正确且易于维护,需要在文件开头添加DTD声明。例如: ```xml &lt;!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts ...

    STRUTS2跳转示意图

    在Struts2中,Action是核心组件,负责处理用户的请求并执行业务逻辑,而Result则是Action执行后的跳转结果。本篇将深入讲解Struts2中的Action和Result,以及它们如何协同工作来实现页面跳转。 首先,让我们理解...

    struts1和struts2源代码详解

    2. **Action类**:在Struts2中,Action类不再是必须继承特定父类,而是可以实现Action接口或使用注解。Action的执行方法默认为execute(),但可以通过注解自定义。 3. **配置方式**:Struts2的配置更加灵活,可以...

    Struts-config.xml配置详解

    在Struts中,转发操作可以是服务器内部的,也可以是带有客户端重定向的。通过配置global-forwards,开发者可以在不修改业务逻辑代码的情况下,全局调整应用程序的URL导航规则。 5. &lt;action-mappings&gt;元素:该元素是...

    Struts2 英文教程

    Struts2中的`ResultTypes`定义了不同的结果处理方式,例如可以重定向到另一个页面或执行特定的动作。拦截器(Interceptors)则是在动作执行前后进行的预处理或后处理操作,如权限验证、数据绑定等。Struts2通过定义...

    struts2 详解文档

    7. **Result配置**:Result类型包括dispatcher(转发至JSP页面)、stream(处理文件下载)、redirect(重定向)等,用于定义Action执行后的跳转逻辑。 8. **属性注入**:Struts2支持使用OGNL从请求参数向Action属性...

    struts2配置过滤器

    ### Struts2配置过滤器详解 #### 一、概述 Struts2是基于MVC模式的一个开源框架,它能够帮助开发者构建出结构清晰且易于维护的Web应用。在实际开发过程中,为了实现某些功能(例如用户认证、权限控制等),往往...

    ·Struts2配置文件介绍 超级详细

    - **Interceptor**:在`package`元素内部,可以定义拦截器或引用拦截器堆栈,拦截器是Struts2中非常重要的组件,用于在Action执行前后进行一系列的前置和后置处理操作,比如登录验证、数据校验等。 - **Result ...

    struts2.pdf

    2. **路由决策**:核心控制器`FilterDispatcher`根据URL中的Action名和配置文件(struts.xml)中的定义来确定应调用哪个Action。 3. **执行拦截器链**:在调用具体的Action之前,会首先经过一系列的拦截器。这些拦截...

    Struts2详解(介绍)

    1. **Action类**:在Struts2中,Action类是业务逻辑的载体,负责处理用户的请求。每个Action类通常对应一个特定的页面操作。 2. **配置文件**:Struts2的配置文件(如struts.xml)定义了Action类与URL的映射,以及...

    Struts2.应用开发详解(第一讲)

    2. **Action类**:在Struts2中,Action类是处理用户请求的核心,它实现了`com.opensymphony.xwork2.Action`接口或其子接口,用于执行业务逻辑并返回结果。 3. **配置文件**:Struts2使用XML配置文件(struts.xml)...

    struts 2完全学习手册

    2. **拦截器**:拦截器是Struts 2中用于预处理和后处理请求的一种机制,可以用来实现诸如参数绑定、验证、异常处理等功能。 - **自定义拦截器**:开发者可以通过实现`Interceptor`接口来自定义拦截器,以满足特定的...

    研磨Struts2

    ActionContext是Struts2中管理请求范围数据的对象,它包含了当前请求的所有信息。 #### 6.2 ServletActionContext ServletActionContext提供了访问Servlet API的方法,例如获取HttpServletRequest和...

    beginning Apache struts from Novice To Professional struts基础教程

    - ActionForward:定义请求转发,可以是内部页面跳转,也可以是外部URL重定向。 6. **ActionForm**: - 包含用户输入的数据,通过表单提交到服务器。 - 使用`validate()`方法进行客户端验证,减少无效请求。 7....

Global site tag (gtag.js) - Google Analytics