zoukankan      html  css  js  c++  java
  • struts2中的跳转详解【转】

    http://zhanglinkuaile.blog.sohu.com/163221989.html

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

    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结果类型的使用示例

    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

    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中取值的
    下面是代码示例

    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>
  • 相关阅读:
    React的状态管理工具
    Ant Design
    Mac 10.12安装专业抓包工具Wireshark
    Mac 10.12安装飞鸽传书IPMessager
    Mac 10.12安装XMind
    Mac 10.12安装SVN工具SmartSVM 7.6
    Mac 10.12安装Windows远程桌面工具Microsoft Remote Desktop
    Mac 10.12安装Office 2011
    Mac 10.12安装迅雷2.7.2
    Mac 10.12安装虚拟机软件VMware Fusion 12
  • 原文地址:https://www.cnblogs.com/laj12347/p/3046874.html
Copyright © 2011-2022 走看看