TA的每日心情 | 衰 2021-2-2 11:21 |
---|
签到天数: 36 天 [LV.5]常住居民I
|
1.配置Action.
0 ~1 i+ m7 K! O% r/ i' Q) J在struts.xml文件中,使用包来管理Action,定义一个Action节点时,必须指定name属性,且值为请求url的前半部分.class可以不写,默认为ActionSupport类.& S% Q3 g* W5 V1 I9 B
Action只是一个控制器,并不能对客户端产生任何响应,只能将指定的视图资源返回给用户.通过配置其子节点<result>来定义逻辑视图和物理视图的关系.% h1 z2 S8 M9 |" @6 r+ m, o
<action name="add" class="com.action.myAction">% M. L. y2 v* \* _: [
<result name="input" type="redirect">/input.jsp</result>
8 T; l9 K" @3 Y: ^- G</action>) g$ U7 z, j0 u# I8 {3 q& H
9 m. x% l6 h% w' R. z+ ~
2.动态方法调用.
1 v( ~! {8 k- c* L$ e9 G要使用此功能,要在struts.properties文件中指定:3 n @5 j7 m. R5 t; I1 S1 V, I/ {
struts.enable.DynamicMethodInvocation=true, a9 U& n: z( G+ m
将请求url定义为 actionName!methodName.action 如,FruitAction!add.action.stust.xml配置文件& Z: l0 z+ Q0 Y7 ], r' d' x0 L# M
不需要改动,但在Action里必须定义一个add方法.这样就能访问FruitAction的add方法.6 C% T1 n# D5 h
1 Y4 y, v4 H: C, \2 J5 h9 c2 c
3.为action指定method属性.3 X- k' |8 C4 |
同动态方法调用的功能一样,但此种方法,在struts.xml文件中,将一个Action处理类定义成了多个逻辑Action* O1 G7 L$ t# m
<action name="login" class="com.ac.UserAction" method="loginM"/></action>
5 U: C3 y0 m5 b! L6 z; U4 q1 N' A<action name="regist" class="com.ac.UserAction" method="registM"/></action>
; z; M0 ?$ J: p4 R6 D |这样,Action类的每个方法都被映射成一个Action.
6 d( O+ _5 U' v( f8 j$ e但,这中方法让action的定义相当冗余,所以struts2.0提供了另一种形式的方法调用,即使用通配符.
( L6 r! Y3 D2 |$ |- J9 y) a" K4 n# a/ p, z
4.使用通配符.4 i6 F- g& U( D }/ F4 J I
<Action>的name,class,method三个属性都能使用通配符.
: p& Q8 c& }7 B. }9 j) u# Z <action name="*Action" class="com.ac.UserAction" method="{1}">+ j8 |& S( i7 b6 Q# D
这种定义方式就好比定义了多个action,method="{1}",表示"*"的值.4 r* y% B, M" r
<action name="*Action" class="com.ac.{1}Action" method="{1}">* x1 x3 w+ O/ \7 D1 ?
<action name="*_*" class="com.ac.{1}Action" method="{2}">
0 w; r* l; P% D( V* f Pstruts2还允许<result>中使用表达式.如<result>/{1}.jsp</result>
$ D; F8 A2 R1 n" q' h<action name="*Page">
1 j4 S! n% d8 z' u- w! W3 ~1 z, e <result>/{1}.jsp</result>
0 C, o. }. l u1 S0 \: Z, |- G" Z& ~' C</action>* R4 `, k- s$ _' l. a4 o! l& D
由于没有指定class,则默认有ActionSupport处理,而ActionSupport的execute方法返回success,所以会跳到*.jsp页面.7 ^7 T, N( N# Q1 J* @. d$ w
问题来了,如果有一个这样的请求,aaaAction.action,在Struts.xml文件中定义了三个<action>
! y, L2 R j7 \$ q7 _$ Z g6 s<action name="*">% x) F c( [& r4 w3 p/ w0 n2 L
<action name="*Action">
1 E9 ]9 \/ r8 j2 k4 P<action name="aaaAction">" Z; c% G+ n6 e$ F
那么将会匹配哪个<action>呢.- Y3 P. y; ^! f/ d& @, a
首先,如果有一个<action>的name与请求完全匹配,那么就一定匹配该<action>,如果没有,则按顺序从上至下查找,如果能匹配,就映射该<action>,
2 q. X) G: l$ ^: S例如,如果有一个aaaAction请求,则会匹配<action name="aaaAction">如果请求是aaAction,则会匹配<action name="*">,因为它在最先匹配.所以,一般将<action name="*">放到最后,范围最小的放前面.# [$ | A7 _$ {5 I3 h
+ n& m. i2 q" l+ a9 o) I
5.默认Action
+ m; J* i8 ^% {9 _( U$ y struts2允许你定义一个默认的Action,当容器找不到与请求Url相匹配的<action>是,将使用此默认action.4 ?& [$ w4 n8 e4 i& l. Z+ y K
<default-action-ref name="aAction" >: w s- |0 p1 `+ X2 L
<action name="aAction" class=......./>
; n/ W u4 h/ ]/ n# h% n6.属性驱动和模型驱动.
# s/ j. @) ]9 j) D( q9 i- V属性驱动,将需要从页面获取的属性和传递给下一个视图的属性定义为action的实例变量,并提供getter和setter方法.$ h U3 @) O) |
模型驱动,则是向struts1.x那样,使用一个Pojo类来封装属性,但此pojo类不需要继承ActionForm,它就是一个普通的Pojo类.在Action中要实现ModelDriven接口,定义Pojo实例变量,并给其赋值(new),然后实现getModel()方法,返回pojo对象.( r4 v0 D" G- ~$ z
8 W& k6 ^! R: _/ h; K( b" j' E" I t- j! G
7.异常机制+ x- a" G% T' S# w
Struts2.0提供了一种声明式的异常处理方式.
; [# d. O% s! c6 _: w' _public String execute() throws Exception! M3 [: v2 ]3 c+ X2 h
Action中的execute()能抛出所有Exception,将异常抛给了框架来处理,我们甚至不需要使用繁琐的try{}catch(){},我们只需要在struts.xml中配置<exception-mapping>异常映射,就能方便的处理各类异常.- w2 x6 }" Q5 Z0 i- w0 }& E
它有两个属性,
3 |+ l' W9 S+ E2 n1 Y% T9 Oexception:指定该异常映射所设置的异常类型. o$ p: p2 N! E h* Z0 \8 c4 [1 b
result:出现指定异常后,返回的结果.
" m% Z$ N5 @9 _$ j. v2 x全局异常:将<exception-mapping>元素作为<global-exception-mapping>元素的子元素
! r; C4 K" {7 C% o4 L6 i局部异常:将<exception-mapping>元素作为<action>的子元素.
6 E- {- j5 N8 [) Z! w! D在页面输出异常信息: L$ M4 j5 B0 |4 Q/ K- x+ I% A. L% D
<s:property value="exception"/> 如<s:property value="exception.message"/>6 J0 X8 O2 y. W! s Q5 e
<s:property value="exceptionStack"/># [8 A! x+ P |! P; f& e, Y
|
|