dispatcher 为默认跳转类型,用于返回一个视图资源(如:jsp)
2 D6 M4 O" D. }0 _Xml代码 :
<result name="success">/main.jsp</result> ! M$ u, ?6 K" ?( M5 ]1 f$ n
以上写法使用了默认,其完整的写法为:
$ O- g& L F' ]) y% j<result name="success" type="dispatcher">
9 p' E1 }& p& ^0 W5 y <param name="location">/maini.jsp</param> 4 B/ \5 T0 P1 v6 v* A+ n
</result>
用于页面转发,页面跳转过程一直是同一个线程,Action中的数据一直保存在。
2 Y1 q$ @& O5 w6 k( Xlocation只能是页面,不能是另一个action(可用type="chain"解决)。
; G2 r( T- b: }# s: q1 Mredirect 类型用于重定向到一个页面,另一个action或一个网址。
( f0 D/ x) q) }' PXml代码:
<result name="success" type="redirect">aaa.jsp</result>
, c6 _. H4 a0 z<result name="success" type="redirect">bbb.action</result> $ V" }: `5 {* k$ l# f1 W; m
<result name="success" type="redirect">www.52itstyle.com</result> 缺点:redirect把一个http返回码(SUCCESS)以及返回的页面位置一起重新发给web服务器,容纳后由web服务器产生一个新的HTTP请求,就会产生一个新的线程,保存在原来Action执行的线程中的数据就无法访问。- ?7 R! G7 h* N+ _
所以,result需要包含Action的数据,那么redirect不是一个可行的办法。因为新的HTTP请求时在Servlet容器的新的线程中处理的,ActionContext中的所有状态都不会存在。
处理方法:
(方法一):
* o6 _* ~* i# I% Y" z<result name="topic" type="redirect">/topicAction!findTopics.do?topicId=${topicId}</result>
0 i, J" ?+ V& M; c+ f6 Q(方法二):
* P7 m, r9 W; [# n( F+ b<result name="topic" type="redirect-action">
w5 ]+ G- B" o, A8 U8 y6 T/ v" S5 E<param name="actionName">findTopics</param>
7 `9 `+ F, t6 B# l3 s<param name="topicId">${topicId}</param> & z/ @2 D. r% A1 y; R
</result>
8 Y' i) B- b$ t$ I! q# }! t1 iredirect-action 结果类型使用ActionMapperFactory提供的ActionMapper来重定向请求到另外一个action
_1 u( X# A; [. u VXml代码:
<result name="err" type="redirect-action"> 5 I. |7 f' `$ f& V2 V+ y
<param name="actionName">重定向的Action名</param>
. }# F9 P6 {6 l U; e6 k# m& w/ \ <param name="namespace">重定向Action所在的名字空间</param> ( B) s W4 x/ ?* C1 Y& x" W
</result> & T& W3 ^8 v6 q' h5 ?+ J
redirect和redirect-action两种结果类型在使用上其实并没有什么区别,只是写法不同而已。
9 e9 \9 h; n) F; R5 e
chain 用于把相关的几个action连接起来,共同完成一个功能。
3 T V. A# r( O* [" mXml代码:
<action name="step1" class="test.Step1Action">
2 g" O/ B/ J3 w <result name="success" type="chain">step2.action</result> % y' o" A% y: T6 ~: V
</action> ' ?3 D9 Y, ]" Q! T; K, ]/ i* a
<action name="step2" class="test.Step2Action"> : m3 a$ |% m; k9 }
<result name="success">finish.jsp</result> 3 J+ v4 I6 {6 P, @8 h& o
</action>
/ t7 N- f, d# m; v" r* L" ^处于chain中的action属于同一个http请求,共享一个ActionContext
1 V; p8 t5 l3 k0 u
u6 p/ i4 o0 z, l1 l& P
plaintextj 结果类型用于直接在页面上显示源代码
Xml代码:
<result name="err" type="plaintext">
. l+ O9 n f/ L' N! h6 k <param name="location">具体的位置</param>
2 @9 r+ L" d, N7 v$ \" }5 V, \ <param name="charSet">字符规范(如GBK)</param>
5 \0 p9 i* M. h1 H</result>