dispatcher 为默认跳转类型,用于返回一个视图资源(如:jsp)
, ]; v' @2 W8 p- U7 e: dXml代码 :
<result name="success">/main.jsp</result> 7 K3 J; |- H' w% M8 o3 W! l( l: j z s
以上写法使用了默认,其完整的写法为: . O/ k3 B8 b. x! ~6 U1 e
<result name="success" type="dispatcher"> 1 X# U; o6 e+ d6 M, F9 b5 _# x% X
<param name="location">/maini.jsp</param> & |4 S* r; o- q0 h
</result>
用于页面转发,页面跳转过程一直是同一个线程,Action中的数据一直保存在。
# W5 A+ x' V0 x3 T$ h' p: f% }location只能是页面,不能是另一个action(可用type="chain"解决)。
: y, t h4 o" ~+ U3 ^& h! E; wredirect 类型用于重定向到一个页面,另一个action或一个网址。
7 L; J" A# t5 L. jXml代码:
<result name="success" type="redirect">aaa.jsp</result> 6 h0 h1 r' l+ t
<result name="success" type="redirect">bbb.action</result> 2 X& {' ?9 f+ P5 v
<result name="success" type="redirect">www.52itstyle.com</result> 缺点:redirect把一个http返回码(SUCCESS)以及返回的页面位置一起重新发给web服务器,容纳后由web服务器产生一个新的HTTP请求,就会产生一个新的线程,保存在原来Action执行的线程中的数据就无法访问。# i3 Z& }* A* V, J3 E/ q
所以,result需要包含Action的数据,那么redirect不是一个可行的办法。因为新的HTTP请求时在Servlet容器的新的线程中处理的,ActionContext中的所有状态都不会存在。
处理方法:
(方法一): 0 @2 p' B9 a: v- h# T
<result name="topic" type="redirect">/topicAction!findTopics.do?topicId=${topicId}</result> 1 y- J2 @' @9 \7 C, L: H/ {9 i
(方法二):
( j& b2 \, M7 o) F% l$ \<result name="topic" type="redirect-action"> + Q7 W' l1 R6 }- q, S$ }" V- c
<param name="actionName">findTopics</param>
; X& N' D0 @1 D7 k: Y<param name="topicId">${topicId}</param> q( i1 W4 p5 r% s6 _- y
</result>
+ Y2 X1 }7 N1 uredirect-action 结果类型使用ActionMapperFactory提供的ActionMapper来重定向请求到另外一个action
3 c3 F( T( t5 L% vXml代码:
<result name="err" type="redirect-action">
5 `+ I0 c) v: }5 T, p <param name="actionName">重定向的Action名</param>
, J; D$ G% t7 w <param name="namespace">重定向Action所在的名字空间</param> . d' A! W# v, A0 r7 v
</result>
1 _# g" J+ {3 J9 Aredirect和redirect-action两种结果类型在使用上其实并没有什么区别,只是写法不同而已。
- R2 c( I( q! K, g
chain 用于把相关的几个action连接起来,共同完成一个功能。 3 C7 J1 j* v$ G8 w) z- j/ h
Xml代码:
<action name="step1" class="test.Step1Action">
' u) W. Y8 L9 ] <result name="success" type="chain">step2.action</result> 2 X) |/ P! Q( n: ]7 `+ t; N* S1 r
</action>
# I+ f: N" k6 D% J* Y* b<action name="step2" class="test.Step2Action">
" U+ d* o& d8 Q q8 C; F% f3 E4 T& u<result name="success">finish.jsp</result> + X% E% I$ \3 Z# p2 M
</action>
- P# z h, o% i! Q. L2 O5 u处于chain中的action属于同一个http请求,共享一个ActionContext
2 o$ E: w4 X" e: q
$ `( k: j6 J. _( C+ Q" c
plaintextj 结果类型用于直接在页面上显示源代码
Xml代码:
<result name="err" type="plaintext">
2 E5 ^4 J$ Z z0 o <param name="location">具体的位置</param>
& c! K5 g" P. g2 |; t <param name="charSet">字符规范(如GBK)</param> 7 S, B) N S! v# v8 h5 h5 \
</result>