stucts2跳转总结

result的跳转有很多种

Chain Result Used for Action Chaining
Dispatcher Result Used for web resource integration, including JSP integration
FreeMarker Result Used for FreeMarker integration
HttpHeader Result Used to control special HTTP behaviors
Redirect Result Used to redirect to another URL (web resource)
Redirect Action Result Used to redirect to another action mapping
Stream Result Used to stream an InputStream back to the browser (usually for file downloads)
Velocity Result Used for Velocity integration
XSL Result Used for XML/XSLT integration
PlainText Result Used to display the raw content of a particular page (i.e jsp, HTML)
Tiles Result Used to provide Tiles integration

常用的为

result 

name="success"

type=redirect | redirectAction | chain  

======================================================================================================

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

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

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

view plain copy to clipboard print ?
  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>  
<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

view plain copy to clipboard print ?
  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>  
<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中取值的
下面是代码示例

view plain copy to clipboard print ?
  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>  

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

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

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

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

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

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

你可能感兴趣的:(跳转)