TA的每日心情 | 衰 2021-2-2 11:21 |
---|
签到天数: 36 天 [LV.5]常住居民I
|
1.配置Action.
' c/ @* z, T' X. X/ G在struts.xml文件中,使用包来管理Action,定义一个Action节点时,必须指定name属性,且值为请求url的前半部分.class可以不写,默认为ActionSupport类.
, o2 O# b0 l! x2 T+ V, z# }Action只是一个控制器,并不能对客户端产生任何响应,只能将指定的视图资源返回给用户.通过配置其子节点<result>来定义逻辑视图和物理视图的关系.
- e/ K8 V. X, b# Z6 [<action name="add" class="com.action.myAction"> o9 g% B: @& k
<result name="input" type="redirect">/input.jsp</result>% ]! s( y* g0 |
</action>
) [/ t4 B* K: r4 {2 t* _
/ ^/ x o9 d+ U! `6 A, c5 L+ }3 J% Y2.动态方法调用.
# _) |, u1 K- ]2 }4 H. j* U要使用此功能,要在struts.properties文件中指定:
7 [( [) D. N% a1 d9 B. }7 Tstruts.enable.DynamicMethodInvocation=true
2 |+ S2 F$ D9 g0 I+ q6 Z& |将请求url定义为 actionName!methodName.action 如,FruitAction!add.action.stust.xml配置文件
6 w0 M5 _# x& J- B不需要改动,但在Action里必须定义一个add方法.这样就能访问FruitAction的add方法.' W* v+ k2 Y* [
% x4 a9 U) Q8 w- s9 l, W3.为action指定method属性.
/ _, z1 _! F& L7 g# O" X' Y同动态方法调用的功能一样,但此种方法,在struts.xml文件中,将一个Action处理类定义成了多个逻辑Action5 p# P/ f8 S- D/ i7 u, z1 o# k
<action name="login" class="com.ac.UserAction" method="loginM"/></action>+ e4 O" o1 L' `7 p; `
<action name="regist" class="com.ac.UserAction" method="registM"/></action>
" r- L7 B! C5 W这样,Action类的每个方法都被映射成一个Action.. A. X9 ^- D+ J( C6 @( T
但,这中方法让action的定义相当冗余,所以struts2.0提供了另一种形式的方法调用,即使用通配符.1 |. \* L% J+ |' V) y S) P) h
5 L9 s) v% |8 F" k7 ^: B$ z
4.使用通配符.
e5 w" F' B% M4 y7 d# z) h4 V, t <Action>的name,class,method三个属性都能使用通配符.3 U& W5 ]" g" D( \& _$ V* p
<action name="*Action" class="com.ac.UserAction" method="{1}">
' H4 ^# D' z' |6 g! S5 D7 E 这种定义方式就好比定义了多个action,method="{1}",表示"*"的值.
8 u: {8 m, J. Z <action name="*Action" class="com.ac.{1}Action" method="{1}">& u) L) Z+ c" G# b: g |
<action name="*_*" class="com.ac.{1}Action" method="{2}">
8 | x w0 o- I7 |. mstruts2还允许<result>中使用表达式.如<result>/{1}.jsp</result>
! d1 I# [) G/ Y' a9 x1 w" h<action name="*Page">
' G, \9 D$ c; J: J) _ <result>/{1}.jsp</result>( b& p: C; J' T6 P' d1 X/ m3 T
</action>9 {/ _; T2 X$ i# o
由于没有指定class,则默认有ActionSupport处理,而ActionSupport的execute方法返回success,所以会跳到*.jsp页面.1 g$ y. B. Z* Q. ~" }7 j+ f
问题来了,如果有一个这样的请求,aaaAction.action,在Struts.xml文件中定义了三个<action>% F$ I, z1 P4 V$ r
<action name="*">
1 z" Z4 X/ r0 u; B<action name="*Action">
" |/ u3 T4 W" b7 \% v) H# A<action name="aaaAction">
. d8 }3 H# D( x/ j# L8 R! z! `+ D那么将会匹配哪个<action>呢., U# L& F9 Y8 M% b+ E; |% p7 i O& y
首先,如果有一个<action>的name与请求完全匹配,那么就一定匹配该<action>,如果没有,则按顺序从上至下查找,如果能匹配,就映射该<action>,
+ q3 l% S: X/ N3 D: R例如,如果有一个aaaAction请求,则会匹配<action name="aaaAction">如果请求是aaAction,则会匹配<action name="*">,因为它在最先匹配.所以,一般将<action name="*">放到最后,范围最小的放前面.
) G) m; q5 @4 u( F/ [
. u- v' O7 K- D0 Z/ W5.默认Action
* d( z7 b+ y" D2 A0 ^ o1 ^# A9 Z, _ struts2允许你定义一个默认的Action,当容器找不到与请求Url相匹配的<action>是,将使用此默认action.
3 W; D, @; ]! R; h9 g+ `# O <default-action-ref name="aAction" >& g7 Q" z5 i' Y- R
<action name="aAction" class=......./>) H3 i4 }1 C' |5 [: H: A k
6.属性驱动和模型驱动.9 I' h! Z0 [, r1 n% e8 u/ J$ x) V
属性驱动,将需要从页面获取的属性和传递给下一个视图的属性定义为action的实例变量,并提供getter和setter方法.
( W% b' y2 H/ r3 G/ d模型驱动,则是向struts1.x那样,使用一个Pojo类来封装属性,但此pojo类不需要继承ActionForm,它就是一个普通的Pojo类.在Action中要实现ModelDriven接口,定义Pojo实例变量,并给其赋值(new),然后实现getModel()方法,返回pojo对象.
8 n- ~0 }$ e* V+ h( P- } R1 ~! [! K4 G0 q( M
) ]- u6 b2 _8 Y" t8 O+ @9 p7.异常机制
7 E, G6 K% _0 E/ [7 z) gStruts2.0提供了一种声明式的异常处理方式.' @1 U+ V# r8 c4 U% U
public String execute() throws Exception
+ q9 I) x$ b7 t3 QAction中的execute()能抛出所有Exception,将异常抛给了框架来处理,我们甚至不需要使用繁琐的try{}catch(){},我们只需要在struts.xml中配置<exception-mapping>异常映射,就能方便的处理各类异常.1 `9 w3 j7 I7 r V
它有两个属性,
0 D z4 I; Z* J# P$ ], gexception:指定该异常映射所设置的异常类型* U! t/ S- B, [( I* a; U4 @+ Y9 T
result:出现指定异常后,返回的结果.
9 U. T# l) ~. Y a! Q" n$ d8 ^. i全局异常:将<exception-mapping>元素作为<global-exception-mapping>元素的子元素
/ Z6 Q& @3 k% F" t局部异常:将<exception-mapping>元素作为<action>的子元素.
( }, A- a6 O$ ]9 e在页面输出异常信息:' C5 v' j" P8 N7 G+ R! c& G
<s:property value="exception"/> 如<s:property value="exception.message"/>
+ d1 z4 Z* L& e6 [9 b( E<s:property value="exceptionStack"/>
# r$ w5 F, c* e) F7 O0 l |
|