dispatcher 为默认跳转类型,用于返回一个视图资源(如:jsp) " R4 z1 [( O: u4 \% w2 u: F
Xml代码 :
<result name="success">/main.jsp</result>
, l- k r- L3 n4 o9 q/ l6 B5 g. _4 A以上写法使用了默认,其完整的写法为: 5 h6 v( k& s0 J3 r7 q" D7 K
<result name="success" type="dispatcher">
: Y3 Z; \8 n0 m2 r5 [ <param name="location">/maini.jsp</param> $ d9 o+ F) g% {3 i, r. H+ V
</result>
用于页面转发,页面跳转过程一直是同一个线程,Action中的数据一直保存在。8 R; ^8 C9 d! D) C; U) X
location只能是页面,不能是另一个action(可用type="chain"解决)。
$ E7 i4 Z1 `9 K5 |8 F5 l# J" Z! c9 Y& [
redirect 类型用于重定向到一个页面,另一个action或一个网址。 4 Z+ b" C* r* i
Xml代码:
<result name="success" type="redirect">aaa.jsp</result>
' j9 ~7 o; w: k! W; W. ?9 C<result name="success" type="redirect">bbb.action</result> * [+ T4 r7 g' c1 N! J, l
<result name="success" type="redirect">www.52itstyle.com</result> 缺点:redirect把一个http返回码(SUCCESS)以及返回的页面位置一起重新发给web服务器,容纳后由web服务器产生一个新的HTTP请求,就会产生一个新的线程,保存在原来Action执行的线程中的数据就无法访问。& y- u! d/ A/ Z: d4 @& d
所以,result需要包含Action的数据,那么redirect不是一个可行的办法。因为新的HTTP请求时在Servlet容器的新的线程中处理的,ActionContext中的所有状态都不会存在。
处理方法:
(方法一):
) h8 ~' N; o) t4 p" K! Z0 H0 Y<result name="topic" type="redirect">/topicAction!findTopics.do?topicId=${topicId}</result>
2 M' }2 H3 k6 Q o7 B(方法二):
- l+ I7 W* A* N0 y! m8 _<result name="topic" type="redirect-action">
: b" B$ z# j; t# ~2 m<param name="actionName">findTopics</param> , b! ], j/ U3 N% P
<param name="topicId">${topicId}</param>
7 O6 X$ d6 {% `- ~, I; v, c1 c, l+ [</result>
6 r+ c' {; j6 y" s
redirect-action 结果类型使用ActionMapperFactory提供的ActionMapper来重定向请求到另外一个action 9 l8 P9 c0 ?$ O( Q
Xml代码:
<result name="err" type="redirect-action">
! k& t- { n7 W: P4 U+ o# P <param name="actionName">重定向的Action名</param>
' }3 L! j% P* j- g/ ^& Y+ ?( t+ L <param name="namespace">重定向Action所在的名字空间</param>
8 \! U8 ]$ \5 O1 ?</result> ( o, w9 i6 d) o6 a
redirect和redirect-action两种结果类型在使用上其实并没有什么区别,只是写法不同而已。
3 `' n2 A" E, U& x( X
chain 用于把相关的几个action连接起来,共同完成一个功能。
, O/ }. |4 W$ P) c1 W3 m0 EXml代码:
<action name="step1" class="test.Step1Action">
2 v u* b# {6 l7 u9 M6 | ~' c7 [1 B <result name="success" type="chain">step2.action</result> / c Q3 R( r3 C' _. f# C
</action> 9 H1 U2 q0 J5 o, I- `7 |
<action name="step2" class="test.Step2Action"> . X* q% f: V2 O. T3 }
<result name="success">finish.jsp</result>
3 d0 G- S5 o) X! L! q% I# M8 ~$ `/ [</action>
/ j6 g ?& o, n* B处于chain中的action属于同一个http请求,共享一个ActionContext
$ R6 q& X# e8 a4 u
0 L& I6 ]( T: Cplaintextj 结果类型用于直接在页面上显示源代码
Xml代码:
<result name="err" type="plaintext"> 9 |6 Z! y5 X; U6 f" D( Y
<param name="location">具体的位置</param>
9 ^/ T8 @; T1 ?+ i3 c1 k* } <param name="charSet">字符规范(如GBK)</param>
+ O1 Y& O# i3 h" l& E3 l5 s</result>