TA的每日心情 | 衰 2021-2-2 11:21 |
---|
签到天数: 36 天 [LV.5]常住居民I
|
1.配置Action.
$ X$ I9 ^0 f8 p' i/ w在struts.xml文件中,使用包来管理Action,定义一个Action节点时,必须指定name属性,且值为请求url的前半部分.class可以不写,默认为ActionSupport类.0 H q {; m2 y& a
Action只是一个控制器,并不能对客户端产生任何响应,只能将指定的视图资源返回给用户.通过配置其子节点<result>来定义逻辑视图和物理视图的关系.
9 l- k3 q& x, I<action name="add" class="com.action.myAction">
, y2 J7 ?4 J) j: j8 g4 u <result name="input" type="redirect">/input.jsp</result>/ E4 u9 Y9 E$ i+ j
</action>2 W8 M: N% f9 V0 V1 \ {. b7 g8 B
' v0 e$ c7 o' ?( \6 o- R
2.动态方法调用.! Y0 i" W# q0 w6 l$ J* V' r5 A' ?# Q
要使用此功能,要在struts.properties文件中指定:
4 o# M: _# j. m# lstruts.enable.DynamicMethodInvocation=true
' Z# F8 a u* N* V4 u7 z5 C将请求url定义为 actionName!methodName.action 如,FruitAction!add.action.stust.xml配置文件
( z/ o' W$ D( E* J不需要改动,但在Action里必须定义一个add方法.这样就能访问FruitAction的add方法.
( ?- G7 P: |8 ?$ Y( G
- |2 v' O6 _* I+ D: P2 i3.为action指定method属性.
# j; [- r" j: y同动态方法调用的功能一样,但此种方法,在struts.xml文件中,将一个Action处理类定义成了多个逻辑Action% k# _. O5 i" O" s0 y
<action name="login" class="com.ac.UserAction" method="loginM"/></action>$ Q7 `, R. g6 z2 `
<action name="regist" class="com.ac.UserAction" method="registM"/></action> @* Q, }( O, {- c6 @
这样,Action类的每个方法都被映射成一个Action.
. k. q$ J& _9 W8 B但,这中方法让action的定义相当冗余,所以struts2.0提供了另一种形式的方法调用,即使用通配符., X9 P& [- V, c: L
! [2 F& ?& V7 S' I( M6 A3 C4.使用通配符.# ?3 h! S1 d7 X
<Action>的name,class,method三个属性都能使用通配符.8 e2 I. z* p) e& a6 U G; }
<action name="*Action" class="com.ac.UserAction" method="{1}">
6 M+ ^9 W7 Y! K" y 这种定义方式就好比定义了多个action,method="{1}",表示"*"的值.
( T6 A- t* K D4 e# b4 i& m <action name="*Action" class="com.ac.{1}Action" method="{1}">
; k+ n2 i7 k' E" l <action name="*_*" class="com.ac.{1}Action" method="{2}">
) D" I9 U! }, z1 Zstruts2还允许<result>中使用表达式.如<result>/{1}.jsp</result>: m# n, [1 e( w. H' O* Y
<action name="*Page">! c* R* o& Y. D1 C! W
<result>/{1}.jsp</result>
4 k+ x; b" H4 ~</action>
2 l/ P" Y+ `9 f, U: U* G由于没有指定class,则默认有ActionSupport处理,而ActionSupport的execute方法返回success,所以会跳到*.jsp页面.6 i6 _" s# y6 ^8 D8 c' ~/ z
问题来了,如果有一个这样的请求,aaaAction.action,在Struts.xml文件中定义了三个<action>
- i2 f$ l; ? y; W# t<action name="*">9 p5 R( }( l" l' F: {
<action name="*Action">
$ F8 n+ P/ k% k# {<action name="aaaAction">7 J/ V% P7 v4 W' W( h
那么将会匹配哪个<action>呢.
p- F0 D! e" k5 J/ ~6 k+ A: D6 x首先,如果有一个<action>的name与请求完全匹配,那么就一定匹配该<action>,如果没有,则按顺序从上至下查找,如果能匹配,就映射该<action>,
' S6 x- \) I& e0 {( ~例如,如果有一个aaaAction请求,则会匹配<action name="aaaAction">如果请求是aaAction,则会匹配<action name="*">,因为它在最先匹配.所以,一般将<action name="*">放到最后,范围最小的放前面.6 c0 P/ F& w% x$ o" m5 f5 I
( v) E0 e+ \/ C R2 Y5.默认Action& Q- B- n6 @. W, W3 F8 o0 |, W
struts2允许你定义一个默认的Action,当容器找不到与请求Url相匹配的<action>是,将使用此默认action.
. W5 ]; b Q3 R( B: y c <default-action-ref name="aAction" >
$ d% s' I) y) U( P <action name="aAction" class=......./>" L* G& i8 _& l! Y# z* {
6.属性驱动和模型驱动.
$ w: A7 @& f" G1 h属性驱动,将需要从页面获取的属性和传递给下一个视图的属性定义为action的实例变量,并提供getter和setter方法.& D1 Z/ l k$ H1 o
模型驱动,则是向struts1.x那样,使用一个Pojo类来封装属性,但此pojo类不需要继承ActionForm,它就是一个普通的Pojo类.在Action中要实现ModelDriven接口,定义Pojo实例变量,并给其赋值(new),然后实现getModel()方法,返回pojo对象.
$ A6 q( f5 W9 ?* t) [: A! n$ G0 Y3 _
/ k+ G' J Z! c( o$ h
7.异常机制
4 ^. c, Y) E& zStruts2.0提供了一种声明式的异常处理方式.
: q5 L9 \! @4 A- Q) N# u% m) Vpublic String execute() throws Exception* J5 V1 m+ L5 K& m! b( f
Action中的execute()能抛出所有Exception,将异常抛给了框架来处理,我们甚至不需要使用繁琐的try{}catch(){},我们只需要在struts.xml中配置<exception-mapping>异常映射,就能方便的处理各类异常.
( y9 p" ^3 P7 ?# d% y它有两个属性,
8 v: C! F, f5 G+ f1 |2 sexception:指定该异常映射所设置的异常类型
0 w6 u5 g$ W& h; C, f% Gresult:出现指定异常后,返回的结果.+ h/ l. o3 k. Y6 @9 w5 k5 s) m
全局异常:将<exception-mapping>元素作为<global-exception-mapping>元素的子元素8 O6 b! j( Q9 s1 m
局部异常:将<exception-mapping>元素作为<action>的子元素.
3 b, Q+ T" }1 ^在页面输出异常信息:% `- G1 m6 t ^& [
<s:property value="exception"/> 如<s:property value="exception.message"/>( u- |* ~1 {) J$ J2 ?
<s:property value="exceptionStack"/>" u) n! S% }; z' l7 J. p1 c
|
|