dispatcher 为默认跳转类型,用于返回一个视图资源(如:jsp) 4 [7 F. z3 K% t: u9 }$ T* g5 C
Xml代码 :
<result name="success">/main.jsp</result> 6 I: Y, Z3 ]0 ~+ k$ F6 l1 L
以上写法使用了默认,其完整的写法为: ( L! x9 M! x& {, Y$ h% W) v+ u7 \) R* f: w
<result name="success" type="dispatcher">
$ L# y8 V! B1 v6 \1 t% u <param name="location">/maini.jsp</param> ) p v3 C. n8 @" y3 y
</result>
用于页面转发,页面跳转过程一直是同一个线程,Action中的数据一直保存在。
% F: E) ?0 Y, M% `; _7 Rlocation只能是页面,不能是另一个action(可用type="chain"解决)。
$ K$ G* R" x9 k1 [0 f6 ?
redirect 类型用于重定向到一个页面,另一个action或一个网址。 / ^# [# S0 N/ L& R/ n; v7 I# u- [* W
Xml代码:
<result name="success" type="redirect">aaa.jsp</result> 5 `+ K# ? n1 G
<result name="success" type="redirect">bbb.action</result>
% y$ q4 ~" m, c8 g# S( \<result name="success" type="redirect">www.52itstyle.com</result> 缺点:redirect把一个http返回码(SUCCESS)以及返回的页面位置一起重新发给web服务器,容纳后由web服务器产生一个新的HTTP请求,就会产生一个新的线程,保存在原来Action执行的线程中的数据就无法访问。
. z- d: o x' |" \: e% T, \: p所以,result需要包含Action的数据,那么redirect不是一个可行的办法。因为新的HTTP请求时在Servlet容器的新的线程中处理的,ActionContext中的所有状态都不会存在。
处理方法:
(方法一): ) X" ^: B) ^5 U
<result name="topic" type="redirect">/topicAction!findTopics.do?topicId=${topicId}</result> ) J% C+ b3 \9 Z
(方法二): * C, x% D/ A8 q) C
<result name="topic" type="redirect-action"> ) o2 D- A$ A! R7 D
<param name="actionName">findTopics</param>
: F6 ^! E2 b7 I* e" u p! l<param name="topicId">${topicId}</param>
5 T2 p* W. D9 z) \! G& m; u2 d' F</result>
' J5 x/ [( n+ o0 X: d ^( ^% g6 b
redirect-action 结果类型使用ActionMapperFactory提供的ActionMapper来重定向请求到另外一个action
! G% ?: ?" C, w, JXml代码:
<result name="err" type="redirect-action">
5 v9 M. Y: z$ K: T- M' _$ Q, n <param name="actionName">重定向的Action名</param> : N- h! I: v, Q& j/ W3 N% @
<param name="namespace">重定向Action所在的名字空间</param>
4 u) _( T9 K( b8 S0 y4 M$ s& F5 R6 m</result> 3 a7 {( v; T E+ T& T6 @
redirect和redirect-action两种结果类型在使用上其实并没有什么区别,只是写法不同而已。
' }0 B! [. R" [8 P: L: @! d
chain 用于把相关的几个action连接起来,共同完成一个功能。 : u6 m: N4 `# u% m, Q$ c0 E
Xml代码:
<action name="step1" class="test.Step1Action">
h! F6 r) a7 Q <result name="success" type="chain">step2.action</result>
3 \6 h' ~3 t+ _, d+ X( v5 K- k</action> + ]; j1 ?9 @9 {, a
<action name="step2" class="test.Step2Action">
* @/ |" X1 U- t* I6 m, f0 i8 \2 e<result name="success">finish.jsp</result> & E; x7 K1 ]# L s: ?- j- E
</action>
, k1 v; e4 \& q0 H9 V/ f7 I处于chain中的action属于同一个http请求,共享一个ActionContext ' Y. m6 U8 r1 b. H" {( _/ P
- x+ N3 t" K) b9 ]- u9 j# w2 r/ Jplaintextj 结果类型用于直接在页面上显示源代码
Xml代码:
<result name="err" type="plaintext">
, P9 j: j4 M; @ <param name="location">具体的位置</param> @. P; Q9 B) |0 j& ?4 h8 N1 L
<param name="charSet">字符规范(如GBK)</param> , L) x1 P3 o8 K5 V" M& Y' s4 b5 c
</result>