dispatcher 为默认跳转类型,用于返回一个视图资源(如:jsp) " ?: Q, b# D0 _7 B+ P& i( v) j
Xml代码 :
<result name="success">/main.jsp</result>
8 N& K& a4 k$ n# S) o/ ~以上写法使用了默认,其完整的写法为:
9 {$ b6 Z: E5 u d/ Z<result name="success" type="dispatcher"> 4 d. i* Q; M9 J
<param name="location">/maini.jsp</param> 0 T" U0 X3 e s( F2 f0 o( [
</result>
用于页面转发,页面跳转过程一直是同一个线程,Action中的数据一直保存在。1 K5 n. i) l4 D, e7 f
location只能是页面,不能是另一个action(可用type="chain"解决)。
6 E. p* Z$ F3 d7 Z% L5 y* w
redirect 类型用于重定向到一个页面,另一个action或一个网址。 5 @; N4 ?/ L1 f
Xml代码:
<result name="success" type="redirect">aaa.jsp</result> 9 P7 h: m" f' K1 z9 @$ F3 M( j p
<result name="success" type="redirect">bbb.action</result>
" ^3 z6 L% V% c5 q9 Q<result name="success" type="redirect">www.52itstyle.com</result> 缺点:redirect把一个http返回码(SUCCESS)以及返回的页面位置一起重新发给web服务器,容纳后由web服务器产生一个新的HTTP请求,就会产生一个新的线程,保存在原来Action执行的线程中的数据就无法访问。
& C1 T# ^7 p6 i! W4 m所以,result需要包含Action的数据,那么redirect不是一个可行的办法。因为新的HTTP请求时在Servlet容器的新的线程中处理的,ActionContext中的所有状态都不会存在。
处理方法:
(方法一): + s. b( x( b/ {2 B; P) p* y
<result name="topic" type="redirect">/topicAction!findTopics.do?topicId=${topicId}</result>
- I% b9 a% i0 M(方法二):
" H3 ~6 m. H0 l, y+ u3 f- I0 `<result name="topic" type="redirect-action">
1 p! Y) V0 A- p. y1 }& P/ \/ J/ W4 v3 _<param name="actionName">findTopics</param>
5 Y' V0 e. J, |: p7 {<param name="topicId">${topicId}</param> ( k. e S3 z ?* [) L3 K \& ?
</result>
8 f; ?; b8 D; n4 t$ a
redirect-action 结果类型使用ActionMapperFactory提供的ActionMapper来重定向请求到另外一个action
+ B+ H% {* ] c' M- X, T; ^Xml代码:
<result name="err" type="redirect-action"> * c. o; n1 Z3 r" i
<param name="actionName">重定向的Action名</param>
3 b8 j, E/ V: Z8 r" v6 {$ A <param name="namespace">重定向Action所在的名字空间</param>
+ D3 a5 l6 |5 T9 D2 [/ {( E/ X</result> 7 S1 O: h9 S3 P! B7 t* l g( M6 Z
redirect和redirect-action两种结果类型在使用上其实并没有什么区别,只是写法不同而已。
7 M3 `) \+ l% x @" |, J$ B* Vchain 用于把相关的几个action连接起来,共同完成一个功能。
, @4 h, U. |7 i" g. n* j+ [Xml代码:
<action name="step1" class="test.Step1Action"> * V w* R! G' M3 w& y, u, x" `
<result name="success" type="chain">step2.action</result>
! S- o% p% k0 S3 R6 ]3 C</action> 8 M, z+ o2 l2 D; u/ M
<action name="step2" class="test.Step2Action">
0 P# ?+ N* v5 Y( ?+ w6 A# A9 ^2 l/ R<result name="success">finish.jsp</result>
7 s; Q" i/ Q5 N+ g( c) D</action> ! @8 w7 L/ N0 g+ y+ H
处于chain中的action属于同一个http请求,共享一个ActionContext
( ^. z/ X5 X Z' G/ m( n y
, M& V+ l J7 `1 Hplaintextj 结果类型用于直接在页面上显示源代码
Xml代码:
<result name="err" type="plaintext"> 1 L/ g: s0 q) s3 W2 B; H
<param name="location">具体的位置</param> 9 f9 L' n" v c- g- K- n
<param name="charSet">字符规范(如GBK)</param>
7 ~4 L v4 h5 H& w2 `# `</result>