struts2中转发和重定向详解

Struts2的ResultType和Action处理链 
Struts2的结果类型 
在struts-default.xml中定义了Struts2内置的所有可用的 
所有的Struts2结果处理类都要直接或间接的实现com.opensymphony.xwork2.Result接口 
在struts-default.xml中的里面,有这样一行声明 
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的,然后转到INPUT所对应的页面 
若JSP页面中表单是用普通编写的,发生错误而返回该页面时,则原数据将消失 
若JSP页面中表单是用编写的,发生错误而返回该页面时,则原数据仍存在 
若没有提供name值为input的,那么发生错误时,将直接在浏览器中提示404错误

结果类型中的httpheader 
httpheader结果类型很少使用到,它实际上是返回一个HTTP响应的头信息 
若单纯的设置/result.jsp,执行时控制台会报如下错误 
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对应服务器内部错误 
这时我们在中修改为404即可 
这样当Action执行完毕,就会转向到SUCCESS结果,所以页面就会显示404错误提示 
关于httpheader结果类型,了解即可,平时很少用到的不是很多

结果类型中的plainText 
当设定为type=”plainText”之后,就可以显示原始文件内容,例如文件源代码 
/testSuc.jsp 
这时访问应用,当跳转到testSuc.jsp页面后,右键就可以查看到它的Java代码了 
它比较适用于Java教学网站,但若仅设置type=”plainText”的话,页面中显示中文时会乱码 
这时就可以借助它的charSet属性以解决中文显示时的乱码问题 
view plaincopy to clipboardprint?

<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>
   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

如果不设置charSet属性,反而去配置struts.i18n.encoding全局属性,是不能解决问题的 
设置charSet属性的目的就是让JSP页面的编码与明文显示时的编码一致 
结果类型中redirect和redirectAction的区别 
redirect是在处理完当前Action之后,重定向到另外一个实际的物理资源 
redirectAction也是重定向,但它重定向到的是另外一个Action 
只要是重定向,那么之前凡是保存在request里面的东西就全都消失了 
因为重定向实际是发送第二个请求,故请求中的东西也就不会出现在第二个请求里面了 
也就是说重定向是不共享request的东西,重定向后的页面中无法接收request里的东西 
另外dispatcher结果类型的default属性为TRUE,故缺省为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结果类型的使用示例 
view plaincopy to clipboardprint?

<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>
   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

或者使用secondchain.action即手工添加 .action 亦可正常访问 
但不建议这么做,因为若修改应用的Action后缀,这里也需手动的把后缀改掉,麻烦得很 
尽管在官方帮助文档的案例中,曾使用过这种方式来执行下一个Action,但这是不严谨的 
下面的例子是访问不同命名空间下的Action 
view plaincopy to clipboardprint?

<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>
<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>
   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

客户端跳转中的参数传递 
若第二个Action使用type=”redirect”,那么在页面中将无法接收Action中所共享的数据 
但在客户端跳转中,我们可以在链接上传参。比如result写成/test1Suc.jsp?name= usernameStruts2XML使 {}表达式,它会自动的取出Action中所有可用的属性,作为参数传递到下一页面 
这里 ELOGNL< {param.name},这里param相当于request.getParameter(“”) 
注意也不能使用${name},因为它是用来从page、request、session、application中取值的 
并且页面中也不能使用接收参数值,因为它是从ValueStack中取值的 
下面是代码示例 
view plaincopy to clipboardprint?

<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>  
   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

—-“请求转发”和“重定向”之间的区别

让浏览器获得另外一个URL所指向的资源可以使用请求转发(RequestDispatcher.forward)或则是重定向技术(HttpServletResponse.sendRedirect),但是两者的内部机制有很大的区别:

1 请求转发只能将请求转发给同一个WEB应用中的组件,而重定向还可以重新定向到同一站点不同应用程序中的资源,甚至可以定向到一绝对的URL。

2 重定向可以看见目标页面的URL,转发只能看见第一次访问的页面URL,以后的工作都是有服务器来做的。

3 请求响应调用者和被调用者之间共享相同的request对象和response对象,重定向调用者和被调用者属于两个独立访问请求和响应过程。

4 重定向跳转后必须加上return,要不然页面虽然跳转了,但是还会执行跳转后面的语句,转发是执行了跳转页面,下面的代码就不会在执行了。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值