struts2中转发和重定向详解

来源:互联网 发布:培训矩阵 含义 编辑:程序博客网 时间:2024/05/16 13:05

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
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 苹果6id停用怎么办 ipad密码停用了怎么办 ipad永久停用了怎么办 ipad停用1小时怎么办 ipad停用无法关机怎么办 citizen手表坏了怎么办 服务器磁盘满了怎么办 百度地图定位不准怎么办 宝宝准生证丢了怎么办 fgo刷不到材料怎么办 行者轨迹未上传怎么办? 房贷少了几块钱怎么办 房贷少了2块怎么办 天天在我们家蹭饭怎么办? 亲戚天天来吃饭怎么办 cad找不到图了怎么办 新建没有工作表怎么办 Html打开是乱码怎么办 xp只读取消不了怎么办 手机地图信号弱怎么办 苹果定位不准确怎么办 苹果导航卡死怎么办 没有上传的发票怎么办 发票显示未上传怎么办 发票未上传怎么办 影响 公务员国考补录不合格的怎么办 车辆转入退档怎么办 校园网总是断网怎么办 校园网经常断网怎么办 身份证号姓名电话号码泄露怎么办 中国邮政银行短信通知怎么办 中通递送不到怎么办 智齿碎了一半怎么办 驾照扣50分怎么办 办不了租赁合同怎么办 收到佰仟律师函怎么办 佰仟律师打电话怎么办 右转车道右方路禁行怎么办 收费站没带现金怎么办 过收费站没有现金怎么办 高速收费站没有现金怎么办