TA的每日心情 | 衰 2021-2-2 11:21 |
---|
签到天数: 36 天 [LV.5]常住居民I
|
1.配置Action.- y/ o# o2 H; N6 y6 G% S
在struts.xml文件中,使用包来管理Action,定义一个Action节点时,必须指定name属性,且值为请求url的前半部分.class可以不写,默认为ActionSupport类.6 X9 P. p G3 ^# G" w+ J5 |
Action只是一个控制器,并不能对客户端产生任何响应,只能将指定的视图资源返回给用户.通过配置其子节点<result>来定义逻辑视图和物理视图的关系.
E5 S3 E. v7 R% V. b. F<action name="add" class="com.action.myAction">" K" J1 ^, |' N. J9 j! B. R8 y+ B
<result name="input" type="redirect">/input.jsp</result>! I/ C2 ]# E6 R r$ H S0 H
</action>$ \& ~: d0 b) u9 a6 Y
$ ^8 w+ ^5 d+ d
2.动态方法调用.7 A( M) U" i0 V% @# e8 H
要使用此功能,要在struts.properties文件中指定:
U5 A0 V8 v- V% r8 a+ ?struts.enable.DynamicMethodInvocation=true0 ^7 C$ S/ a: s1 _
将请求url定义为 actionName!methodName.action 如,FruitAction!add.action.stust.xml配置文件
: S/ L9 D& F c& m5 H) M不需要改动,但在Action里必须定义一个add方法.这样就能访问FruitAction的add方法.
1 U; Q5 j; ?* n; A
& } p! }3 Q- g* ~9 C6 I3.为action指定method属性.3 _7 x9 o4 {: R9 E2 D
同动态方法调用的功能一样,但此种方法,在struts.xml文件中,将一个Action处理类定义成了多个逻辑Action
& K/ i+ K9 d2 H, g<action name="login" class="com.ac.UserAction" method="loginM"/></action>
+ G; A! {8 d. ~! q<action name="regist" class="com.ac.UserAction" method="registM"/></action>
- b" P7 n* ]/ f/ e- e! p1 o7 J这样,Action类的每个方法都被映射成一个Action.
) \5 ?% M3 i& }$ r但,这中方法让action的定义相当冗余,所以struts2.0提供了另一种形式的方法调用,即使用通配符.* Z5 i& O) Z+ Q: K) F! D
7 m0 s- \# N& Q. k9 _
4.使用通配符.5 K. V& {% d; C3 V
<Action>的name,class,method三个属性都能使用通配符.0 O6 D# \% |1 U1 k1 D
<action name="*Action" class="com.ac.UserAction" method="{1}">
0 m! m A4 z. l/ J7 `7 N 这种定义方式就好比定义了多个action,method="{1}",表示"*"的值.# I. z# Q+ d" Q _! Y5 }; J
<action name="*Action" class="com.ac.{1}Action" method="{1}">1 V( x9 G+ B. X1 E+ @
<action name="*_*" class="com.ac.{1}Action" method="{2}">- w* J! c6 _5 u
struts2还允许<result>中使用表达式.如<result>/{1}.jsp</result>0 H% r8 |5 \1 [2 O8 n+ s C! y
<action name="*Page">( \8 J$ P5 Z8 d( h" _7 O
<result>/{1}.jsp</result>
F! K) d, h& K' u# A</action>
/ q( M o- C9 ?" i7 C由于没有指定class,则默认有ActionSupport处理,而ActionSupport的execute方法返回success,所以会跳到*.jsp页面.
4 ^0 o9 [( C' H4 \* J( M问题来了,如果有一个这样的请求,aaaAction.action,在Struts.xml文件中定义了三个<action>- }' M) P0 b( z
<action name="*">/ T/ c- N# I& m+ \
<action name="*Action">
1 l U5 T, b1 F! x1 L: S" F<action name="aaaAction">6 f5 Z, ^% {# M6 u" S% G: [
那么将会匹配哪个<action>呢.
6 b& _' Q# c: `; T" f; O. o, J& V1 A首先,如果有一个<action>的name与请求完全匹配,那么就一定匹配该<action>,如果没有,则按顺序从上至下查找,如果能匹配,就映射该<action>,& K: r9 j( S6 {
例如,如果有一个aaaAction请求,则会匹配<action name="aaaAction">如果请求是aaAction,则会匹配<action name="*">,因为它在最先匹配.所以,一般将<action name="*">放到最后,范围最小的放前面.# L; E5 p+ s/ Z( E# V
) }1 b5 G$ r9 N
5.默认Action4 A6 E3 A% H, X2 j: }
struts2允许你定义一个默认的Action,当容器找不到与请求Url相匹配的<action>是,将使用此默认action.0 j% B2 G4 S8 y0 K+ \
<default-action-ref name="aAction" > _- s. {! a6 ^0 B7 k' c) B9 G
<action name="aAction" class=......./>
; j: N0 \( Y0 Y( V1 z6.属性驱动和模型驱动.* s9 G' O7 u. H# H9 S
属性驱动,将需要从页面获取的属性和传递给下一个视图的属性定义为action的实例变量,并提供getter和setter方法.
0 \- A1 q$ h( ?. H9 A8 r模型驱动,则是向struts1.x那样,使用一个Pojo类来封装属性,但此pojo类不需要继承ActionForm,它就是一个普通的Pojo类.在Action中要实现ModelDriven接口,定义Pojo实例变量,并给其赋值(new),然后实现getModel()方法,返回pojo对象.0 o. {6 D R6 e8 N- g" r$ i8 T
5 _& h/ ~) ]4 `/ t0 l' d# u$ r" k' t; s' U' ~+ g$ y' I
7.异常机制7 O5 j& \" ~4 w8 _4 A W
Struts2.0提供了一种声明式的异常处理方式.* |( y% c4 {) V0 p
public String execute() throws Exception4 s. \2 w& @+ O4 u# B$ m
Action中的execute()能抛出所有Exception,将异常抛给了框架来处理,我们甚至不需要使用繁琐的try{}catch(){},我们只需要在struts.xml中配置<exception-mapping>异常映射,就能方便的处理各类异常.
/ u2 \' i0 E" S& K$ w ^) p它有两个属性,
+ ^6 V. L# t/ C9 A- ^5 kexception:指定该异常映射所设置的异常类型/ q' m; z- ^5 K
result:出现指定异常后,返回的结果.
( C r' t8 y% N# {1 n G% u全局异常:将<exception-mapping>元素作为<global-exception-mapping>元素的子元素
; G$ ^8 ^2 \7 h# K( c" ]% r局部异常:将<exception-mapping>元素作为<action>的子元素.$ v9 S& J# B4 L$ D2 w
在页面输出异常信息:" ?2 L5 ~# H7 @9 L3 z
<s:property value="exception"/> 如<s:property value="exception.message"/>" A. w3 _: s% Z' Q Q) p8 P" h
<s:property value="exceptionStack"/>* T: o; m! T7 S% `! y N6 P
|
|