dispatcher 为默认跳转类型,用于返回一个视图资源(如:jsp) $ Y; K4 `3 j6 E! c/ m3 [
Xml代码 :
<result name="success">/main.jsp</result>
% s( E) J: B" u3 ^以上写法使用了默认,其完整的写法为:
7 k C. p4 \. M$ g& M7 P; P<result name="success" type="dispatcher"> + \$ L% E$ r8 l3 R1 m
<param name="location">/maini.jsp</param>
7 i4 W2 J3 K- P& {, W' f5 z</result>
用于页面转发,页面跳转过程一直是同一个线程,Action中的数据一直保存在。
% v9 D- E. i" w& zlocation只能是页面,不能是另一个action(可用type="chain"解决)。
+ Y8 @8 |$ g% s% K+ {
redirect 类型用于重定向到一个页面,另一个action或一个网址。 ' i ^* i) C; _# n
Xml代码:
<result name="success" type="redirect">aaa.jsp</result>
% @- I; Q$ [: `+ N, \) g9 e<result name="success" type="redirect">bbb.action</result>
4 Y0 B2 |' \$ Y* o% V<result name="success" type="redirect">www.52itstyle.com</result> 缺点:redirect把一个http返回码(SUCCESS)以及返回的页面位置一起重新发给web服务器,容纳后由web服务器产生一个新的HTTP请求,就会产生一个新的线程,保存在原来Action执行的线程中的数据就无法访问。8 b4 R7 ^# p4 h) C/ U) @, R8 l4 p
所以,result需要包含Action的数据,那么redirect不是一个可行的办法。因为新的HTTP请求时在Servlet容器的新的线程中处理的,ActionContext中的所有状态都不会存在。
处理方法:
(方法一):
3 M- t6 m& s1 ~8 t<result name="topic" type="redirect">/topicAction!findTopics.do?topicId=${topicId}</result> # Z- e2 G( `- [2 L0 k
(方法二): $ Z# z! X. r6 Q) b
<result name="topic" type="redirect-action"> - w! T$ A# [- }$ K1 w+ r4 g# S+ ~2 h
<param name="actionName">findTopics</param> 4 X: I1 }7 R& J: ^( `
<param name="topicId">${topicId}</param>
& Y& k+ k& D! s5 \</result>
/ L8 t; @ }, g; W+ v e4 i \
redirect-action 结果类型使用ActionMapperFactory提供的ActionMapper来重定向请求到另外一个action
+ o) _4 q, a7 N/ ~1 {6 GXml代码:
<result name="err" type="redirect-action">
' e: t7 T H. \, D- b1 L <param name="actionName">重定向的Action名</param>
; k4 c) z/ \' e! v3 `4 l5 M <param name="namespace">重定向Action所在的名字空间</param> # x- J6 y% }( E- \& ?
</result> " I9 K7 t& X D) u7 K) B- e
redirect和redirect-action两种结果类型在使用上其实并没有什么区别,只是写法不同而已。
' u, V) ? O8 @, W% }
chain 用于把相关的几个action连接起来,共同完成一个功能。 / f- a7 s7 |6 F. o) X
Xml代码:
<action name="step1" class="test.Step1Action">
1 \2 F" A; m# {& ]6 s <result name="success" type="chain">step2.action</result>
, h! J K5 i, p5 S+ Z: m</action> : I& u( r, d( K+ c
<action name="step2" class="test.Step2Action">
9 a; X4 A; G/ K<result name="success">finish.jsp</result>
1 R% k: D$ ?! R( @+ r0 i$ o% p</action> / M4 h5 K, y2 c( P& r
处于chain中的action属于同一个http请求,共享一个ActionContext
& p) e7 j2 z( E& E5 a) [
$ L+ ]2 C4 b( E4 f; b6 x! ?plaintextj 结果类型用于直接在页面上显示源代码
Xml代码:
<result name="err" type="plaintext"> * f& E( t) D+ H6 x: `- u
<param name="location">具体的位置</param>
5 V; Z3 z1 d" w! D* Q1 p <param name="charSet">字符规范(如GBK)</param>
; j; r! g( b& x# s) S</result>