dispatcher 为默认跳转类型,用于返回一个视图资源(如:jsp)
" W: K+ k- E' f6 _$ d3 L1 Y% wXml代码 :
<result name="success">/main.jsp</result>
' q1 V B: ~ Z3 C4 O+ p( {以上写法使用了默认,其完整的写法为: 5 w4 p: n) ~( t: d4 J8 F
<result name="success" type="dispatcher"> 4 h; r( _/ D9 N/ e/ ~
<param name="location">/maini.jsp</param>
+ r% N' |5 |4 B- o! ]- a* d</result>
用于页面转发,页面跳转过程一直是同一个线程,Action中的数据一直保存在。9 x0 l7 P4 m4 ]' j$ C( ^
location只能是页面,不能是另一个action(可用type="chain"解决)。
* W0 W0 m+ [( \; [8 e7 wredirect 类型用于重定向到一个页面,另一个action或一个网址。
8 K( i/ o. n8 `) e, l; `! i6 }; K3 vXml代码:
<result name="success" type="redirect">aaa.jsp</result>
- @; z# j1 m# z6 J* }<result name="success" type="redirect">bbb.action</result>
) ]% N" A! t: P4 T<result name="success" type="redirect">www.52itstyle.com</result> 缺点:redirect把一个http返回码(SUCCESS)以及返回的页面位置一起重新发给web服务器,容纳后由web服务器产生一个新的HTTP请求,就会产生一个新的线程,保存在原来Action执行的线程中的数据就无法访问。! A6 W- {+ Q! I' M$ L( a
所以,result需要包含Action的数据,那么redirect不是一个可行的办法。因为新的HTTP请求时在Servlet容器的新的线程中处理的,ActionContext中的所有状态都不会存在。
处理方法:
(方法一):
9 u x- h8 i7 V4 [( y+ J<result name="topic" type="redirect">/topicAction!findTopics.do?topicId=${topicId}</result> ' E8 U1 a0 |$ e( R* n" t F) d& i
(方法二): ) x( X0 P+ i9 [: p0 F
<result name="topic" type="redirect-action">
$ u9 _; V; [2 I+ E<param name="actionName">findTopics</param>
9 X# d' D! U& Q8 Q" k$ E<param name="topicId">${topicId}</param> * f/ @' d9 f2 z8 t c
</result>
d9 H5 a* X7 Y$ Y1 r$ t
redirect-action 结果类型使用ActionMapperFactory提供的ActionMapper来重定向请求到另外一个action
8 u; v4 e% x/ R4 [8 F* K5 nXml代码:
<result name="err" type="redirect-action"> ) L/ _# F2 P6 _2 \ h4 x2 e
<param name="actionName">重定向的Action名</param>
! O, q; L8 J6 r8 c w) n; F <param name="namespace">重定向Action所在的名字空间</param>
0 A/ D% C4 f: ?0 H</result> , s7 {4 I0 C. W! U+ k
redirect和redirect-action两种结果类型在使用上其实并没有什么区别,只是写法不同而已。
! G9 s( N! c& N$ H; N& J# ^
chain 用于把相关的几个action连接起来,共同完成一个功能。 8 _8 ]+ @1 D% \ ^: {
Xml代码:
<action name="step1" class="test.Step1Action"> 0 d& C6 t$ [& D8 r, W5 f# i' j
<result name="success" type="chain">step2.action</result>
: S) J5 O$ w+ {% ?</action>
0 |/ q o9 Y& W9 m8 b: h<action name="step2" class="test.Step2Action"> ( E( d- U+ K3 B) `& E f6 n, W
<result name="success">finish.jsp</result>
0 e( B" {" N5 ^& E C3 l</action> + c3 V* m: S3 F+ c6 ^) I1 D- L5 ~
处于chain中的action属于同一个http请求,共享一个ActionContext
" i; A+ u+ m$ `- u0 i
* H, ~+ m( u, w! f/ ]plaintextj 结果类型用于直接在页面上显示源代码
Xml代码:
<result name="err" type="plaintext">
2 V9 h) X: h- C' R& Q7 X <param name="location">具体的位置</param>
: b) f- O8 q8 } E9 |5 t <param name="charSet">字符规范(如GBK)</param>
% r1 c3 v8 \1 @9 V! [</result>