dispatcher 为默认跳转类型,用于返回一个视图资源(如:jsp)
$ k- Z l8 |4 Q& i7 |3 n2 J8 s( dXml代码 :
<result name="success">/main.jsp</result>
6 C+ D& D) N9 J" g! s& H以上写法使用了默认,其完整的写法为: ( a/ e9 u z: X0 P2 Q1 D) t
<result name="success" type="dispatcher">
; b' v% ]8 I+ y5 H8 y; ]7 { <param name="location">/maini.jsp</param>
% @/ T4 v5 ^: C( Q. ]7 E</result>
用于页面转发,页面跳转过程一直是同一个线程,Action中的数据一直保存在。& @& A( p5 ^8 ~ M
location只能是页面,不能是另一个action(可用type="chain"解决)。
0 b# r% S2 x. fredirect 类型用于重定向到一个页面,另一个action或一个网址。
! {$ ?( g$ O) W$ Y3 B5 n- L$ VXml代码:
<result name="success" type="redirect">aaa.jsp</result>
" K7 R& s- b% q( d+ U7 ~# P+ b4 ]: ~<result name="success" type="redirect">bbb.action</result> % ^& U- u& E$ O: \: S
<result name="success" type="redirect">www.52itstyle.com</result> 缺点:redirect把一个http返回码(SUCCESS)以及返回的页面位置一起重新发给web服务器,容纳后由web服务器产生一个新的HTTP请求,就会产生一个新的线程,保存在原来Action执行的线程中的数据就无法访问。
0 I! U5 @$ b# z7 H! {+ Y1 U7 b所以,result需要包含Action的数据,那么redirect不是一个可行的办法。因为新的HTTP请求时在Servlet容器的新的线程中处理的,ActionContext中的所有状态都不会存在。
处理方法:
(方法一):
8 G& s+ L! z- F<result name="topic" type="redirect">/topicAction!findTopics.do?topicId=${topicId}</result>
$ R& \4 v6 s0 \3 A, ?6 A1 c9 c6 s(方法二): , [* q8 m9 `8 {+ Y/ w6 b; J, z
<result name="topic" type="redirect-action">
5 Z: I: b5 B5 e7 p<param name="actionName">findTopics</param> * c4 z# {9 b- Q* d% ^
<param name="topicId">${topicId}</param>
2 q4 }8 V4 T9 o% b& p6 R0 \) C</result>
$ r/ B3 p% L" V( V
redirect-action 结果类型使用ActionMapperFactory提供的ActionMapper来重定向请求到另外一个action
1 M3 q- x0 }2 {# a8 i( R" `5 nXml代码:
<result name="err" type="redirect-action"> + N+ n% M0 R% h5 h$ s" }6 g) P
<param name="actionName">重定向的Action名</param>
. x* l6 e6 q6 |. {% b <param name="namespace">重定向Action所在的名字空间</param> " K" Z7 k" R7 D4 S
</result> ) ~6 b& J- _; c0 b" f! P+ [3 ^
redirect和redirect-action两种结果类型在使用上其实并没有什么区别,只是写法不同而已。
" X& S; G* J, E/ `: v5 V
chain 用于把相关的几个action连接起来,共同完成一个功能。
0 d; g& K j; a( i* g) `3 k( f( JXml代码:
<action name="step1" class="test.Step1Action"> & ?; b) ?" z1 S7 {# ]& Y
<result name="success" type="chain">step2.action</result> / {# {8 J$ C4 q f- c' b* ]
</action> # ]! x% o9 ~- g( B6 ]! Q. f
<action name="step2" class="test.Step2Action">
" ?! m5 _8 U7 `# ]<result name="success">finish.jsp</result>
4 ?3 P& s& [% w4 R* C5 s, u+ Y6 e( u" K</action>
" a U# o" o& U7 U4 d! ~! G处于chain中的action属于同一个http请求,共享一个ActionContext 9 H9 m; E6 F+ w' Z- N$ x
# l( d2 I1 I, r) Y% n/ Z- D3 oplaintextj 结果类型用于直接在页面上显示源代码
Xml代码:
<result name="err" type="plaintext"> - @" U( Z% X" @1 w2 T$ T
<param name="location">具体的位置</param> 0 l! Q" e3 W7 e! T1 ]5 |2 I
<param name="charSet">字符规范(如GBK)</param> $ t& W9 R$ M- i2 N
</result>