dispatcher 为默认跳转类型,用于返回一个视图资源(如:jsp) * |( C, ^4 `# o2 y
Xml代码 :
<result name="success">/main.jsp</result> 9 P9 W$ N; b5 ] l; i! Q0 T8 _2 ?
以上写法使用了默认,其完整的写法为: 4 R! K' a# k1 \, H' w; a4 I* [
<result name="success" type="dispatcher"> 3 _7 h. y# {8 [7 |- \
<param name="location">/maini.jsp</param>
* S3 \; r2 O% o" I</result>
用于页面转发,页面跳转过程一直是同一个线程,Action中的数据一直保存在。2 E2 G: `: k* t- t4 C& w2 o; M
location只能是页面,不能是另一个action(可用type="chain"解决)。
7 `' a: y; L. U6 [. {0 Zredirect 类型用于重定向到一个页面,另一个action或一个网址。 / e. T4 |% e1 V
Xml代码:
<result name="success" type="redirect">aaa.jsp</result> ' D {' d) E2 @" N; x1 \
<result name="success" type="redirect">bbb.action</result> 8 `: t1 m; q1 u$ b' h3 V- o% [- g: H
<result name="success" type="redirect">www.52itstyle.com</result> 缺点:redirect把一个http返回码(SUCCESS)以及返回的页面位置一起重新发给web服务器,容纳后由web服务器产生一个新的HTTP请求,就会产生一个新的线程,保存在原来Action执行的线程中的数据就无法访问。
+ t' @0 R( A: ~* a/ j$ }4 r# |# r所以,result需要包含Action的数据,那么redirect不是一个可行的办法。因为新的HTTP请求时在Servlet容器的新的线程中处理的,ActionContext中的所有状态都不会存在。
处理方法:
(方法一): * Y/ [7 M5 R1 F! q/ }$ i% e o
<result name="topic" type="redirect">/topicAction!findTopics.do?topicId=${topicId}</result> : @. ` z! M1 F* K2 ?: F
(方法二): 9 @' m w" x, }- ]
<result name="topic" type="redirect-action"> ' Z) d# y8 X3 ?/ n+ y# c2 w$ ]
<param name="actionName">findTopics</param>
* o% \# Y4 `) E6 W" Q<param name="topicId">${topicId}</param>
# Z, i: h0 f6 C% Y9 [+ s' B7 K- S</result>
7 Z o9 W! ^( \/ x- c3 S
redirect-action 结果类型使用ActionMapperFactory提供的ActionMapper来重定向请求到另外一个action # D# @0 M" M4 c; `, X5 L
Xml代码:
<result name="err" type="redirect-action"> $ ]0 O8 Y4 M6 N1 V$ W
<param name="actionName">重定向的Action名</param> / {' e3 N" f7 t0 Y" J; C$ T ^( c
<param name="namespace">重定向Action所在的名字空间</param> + i& m& J# [5 p. I5 l- \
</result> & t+ x O6 Y$ i2 v( ^1 |& O+ Z' \
redirect和redirect-action两种结果类型在使用上其实并没有什么区别,只是写法不同而已。
; p# p- G1 U- }chain 用于把相关的几个action连接起来,共同完成一个功能。 + U2 B/ d3 }' f" A
Xml代码:
<action name="step1" class="test.Step1Action"> 3 g5 z/ x: e/ N% d
<result name="success" type="chain">step2.action</result> - M4 k" h2 {& x; i C
</action> $ B) K& I# `& H! _6 T# `1 Y
<action name="step2" class="test.Step2Action">
( z! p5 d6 B; J* b+ r<result name="success">finish.jsp</result>
* @3 q1 s2 L: i+ }2 `</action>
. t9 f+ G! {6 P2 i处于chain中的action属于同一个http请求,共享一个ActionContext 9 E4 Y; h* m/ i0 i# n1 [% i- H
. E3 f8 t3 E9 g) P. Z+ K
plaintextj 结果类型用于直接在页面上显示源代码
Xml代码:
<result name="err" type="plaintext"> - r6 s b0 }" Y! X9 ]3 N
<param name="location">具体的位置</param>
0 r. Y9 w w" {% Q1 R/ } <param name="charSet">字符规范(如GBK)</param>
8 u$ ?8 F0 r+ q; `, g</result>