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

如果不设置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

或者使用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

客户端跳转中的参数传递 
若第二个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

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

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

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

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

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一、准备工作及实例 3 1.解压struts-2.1.6-all.zip 3 2.六个基本包 3 3.初识struts2配置文件 4 (1).web.xml文件 4 (2).struts.xml文件 4 (3).struts.properties(参default.properties) 4 (4)struts-default.xml 4 (5)其它配置文件 4 4.让MyEclipse提示xml信息 4 5.如何使用alt+/提示 4 6.实例 4 7.开启struts2自带的开发模式常量 6 8.vo传参模式 7 9.ModerDriven传参模式(不建议采用) 7 10.为什么要使用struts2代替struts1.x 7 二、struts.xml配置及例程 7 1.配置文件的优先级 7 2.配置形式 8 3.package配置相关 8 4.分工合作include:指定多个配置文件 10 5.tomcat认证访问 10 6.初识拦截器 11 7.Action的method属性 12 8.使用ForwardAction实现页面屏蔽。 13 8.使用default-Action配置统一访问 14 小结Action 14 9.使用通配符 14 10.使用0配置:ZERO Annotation 15 11.Result配置详解 15 探讨type类型: 16 Type类型值 16 作用说明 16 对应类 16 chain 16 用来处理Action链 16 com.opensymphony.xwork2.ActionChainResult 16 dispatcher 16 用来转向页面,通常处理JSP 16 org.apache.struts2.dispatcher.ServletDispatcherResult 16 redirect 16 重定向到一个URL 16 org.apache.struts2.dispatcher.ServletRedirectResult 16 redirectAction 16 重定向到一个Action 16 org.apache.struts2.dispatcher.ServletActionRedirectResult 16 plainText 16 显示源文件内容,如文件源码 16 org.apache.struts2.dispatcher.PlainTextResult 16 freemarker 16 处理FreeMarker模板 16 org.apache.struts2.views.freemarker.FreemarkerResult 16 httpheader 16 控制特殊http行为的结果类型 16 org.apache.struts2.dispatcher.HttpHeaderResult 16 stream 16 向浏览器发送InputSream对象,通常用来处理文件下载,还可用于返回AJAX数据。 16 org.apache.struts2.dispatcher.StreamResult 16 velocity 16 处理Velocity模板 16 org.apache.struts2.dispatcher.VelocityResult 16 xslt 16 处理XML/XLST模板 16 org.apache.struts2.views.xslt.XSLTResult 16 全局result: 17 动态Result:了解 18 12.异常处理 18 三、在Action获取Scope对象 19 方式一、与Servlet解耦合的非IOC方式 20 方式二、与Servlet解耦合的IOC方式 21 方式三、与Servlet耦合的非IOC方式 21 方式四、与Servlet耦合的IOC方式 22 四、OGNL与ValueStack(VS) 22 1.值栈入门 22 2.OGNL入门 24 3.普通方法访问 24 4.静态方法访问 24 5.默认类Math的访问 24 6.调用普通类的构造方法 25 7.集合对象初步 25 8.集合对象进阶 25 9.N语法top语法 26 10.获取Stack Context的信息 26 11.总结$ # %的区别 27 12.总结OGNL[重点] 27 五、拦截器 28 1.概述strust2的拦截器 28 2.自定义拦截器 28 方式一,实现Interceptor接口。 28 方式二、继承AbstractInterceptor抽象类 29 方式三、继承MethodFilterInteceptor类 30 3.使用来MethodFilterInterceptor灵活拦截 32 4.使用默认的execAndWait拦截器 33 5.

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值