TA的每日心情 | 衰 2021-2-2 11:21 |
---|
签到天数: 36 天 [LV.5]常住居民I
|
1.配置Action.
4 {; p- X& V: g x- L" ~4 n6 n% F在struts.xml文件中,使用包来管理Action,定义一个Action节点时,必须指定name属性,且值为请求url的前半部分.class可以不写,默认为ActionSupport类.
, l9 j, F5 H, q6 _Action只是一个控制器,并不能对客户端产生任何响应,只能将指定的视图资源返回给用户.通过配置其子节点<result>来定义逻辑视图和物理视图的关系.) C4 Y4 |. e5 z
<action name="add" class="com.action.myAction">( G# \# @- e- g" b
<result name="input" type="redirect">/input.jsp</result>
/ W* F' T5 L! c9 X; U: q</action>9 p2 y/ Q& v; h6 U/ s( d) [1 i
. b' M3 Z0 L# w J
2.动态方法调用.
5 a( @) r! q6 I8 j3 y! c要使用此功能,要在struts.properties文件中指定:
3 _( l& o* r w& ~5 i3 lstruts.enable.DynamicMethodInvocation=true
% u- b$ `! j6 d2 k- W将请求url定义为 actionName!methodName.action 如,FruitAction!add.action.stust.xml配置文件
3 W8 Y# T7 ?9 n不需要改动,但在Action里必须定义一个add方法.这样就能访问FruitAction的add方法.9 M6 H% y# E* ]6 q& @* q& J* v, ^) K
) F$ m2 y; J- }3 o3.为action指定method属性.
, m* V9 f- }) z- l4 |同动态方法调用的功能一样,但此种方法,在struts.xml文件中,将一个Action处理类定义成了多个逻辑Action/ r7 M( T7 K& _+ G8 m* W+ B
<action name="login" class="com.ac.UserAction" method="loginM"/></action>
7 J; P# G, b( h& G8 G<action name="regist" class="com.ac.UserAction" method="registM"/></action>
' C# K5 B6 s# w I这样,Action类的每个方法都被映射成一个Action.1 V+ a H8 ]3 T& F
但,这中方法让action的定义相当冗余,所以struts2.0提供了另一种形式的方法调用,即使用通配符.: w z6 n* c7 S& `& _) m3 C% v% a
6 M: D3 O" _0 t! D
4.使用通配符.: {1 o! _5 Z9 H! g& i/ t
<Action>的name,class,method三个属性都能使用通配符.
* X6 e; Z% g; H& }6 P7 g: v9 S" A# M <action name="*Action" class="com.ac.UserAction" method="{1}">3 B1 j. q2 J* Z9 z& u
这种定义方式就好比定义了多个action,method="{1}",表示"*"的值.. W: d3 g1 P! m: p1 h+ u. R3 k
<action name="*Action" class="com.ac.{1}Action" method="{1}">/ X6 k! G2 G5 _% x* Y8 V9 ~
<action name="*_*" class="com.ac.{1}Action" method="{2}">
7 C$ U9 `8 U1 i5 A# s ^2 ustruts2还允许<result>中使用表达式.如<result>/{1}.jsp</result>
+ ^; k; p3 Q( a" Z' I<action name="*Page">6 T5 L2 g; T2 G; P' T- a
<result>/{1}.jsp</result>; F& c- x/ @. }; l" e' E
</action>
0 h$ P$ R+ g& T4 T( V由于没有指定class,则默认有ActionSupport处理,而ActionSupport的execute方法返回success,所以会跳到*.jsp页面.
4 U6 M6 u/ ^, g+ u3 R, z3 ?问题来了,如果有一个这样的请求,aaaAction.action,在Struts.xml文件中定义了三个<action>; j- n9 }' j5 f( W$ d
<action name="*">) v' Z$ n* b8 b5 {
<action name="*Action">7 p0 X; R: }, a
<action name="aaaAction">
+ E; c, F$ |; B0 x那么将会匹配哪个<action>呢.
% ]6 `, y A* j/ p首先,如果有一个<action>的name与请求完全匹配,那么就一定匹配该<action>,如果没有,则按顺序从上至下查找,如果能匹配,就映射该<action>,
% H- N# Z O3 P U( o: c# A3 j例如,如果有一个aaaAction请求,则会匹配<action name="aaaAction">如果请求是aaAction,则会匹配<action name="*">,因为它在最先匹配.所以,一般将<action name="*">放到最后,范围最小的放前面., S% h ^( X2 {9 R9 k
! |+ m2 ~+ O: \$ o: D0 `, X& r
5.默认Action
5 i+ T) S* ]8 j. z* y( x% ] struts2允许你定义一个默认的Action,当容器找不到与请求Url相匹配的<action>是,将使用此默认action.
4 @9 h' H( r' T7 n% V9 I0 Z <default-action-ref name="aAction" >
. y* c9 G0 I7 v2 k9 s8 p8 w <action name="aAction" class=......./>
- F! s z+ K* W5 o5 l5 f) b6.属性驱动和模型驱动./ g m0 w) Q: R$ L& \
属性驱动,将需要从页面获取的属性和传递给下一个视图的属性定义为action的实例变量,并提供getter和setter方法.
- t$ o* v9 \8 @0 n# S模型驱动,则是向struts1.x那样,使用一个Pojo类来封装属性,但此pojo类不需要继承ActionForm,它就是一个普通的Pojo类.在Action中要实现ModelDriven接口,定义Pojo实例变量,并给其赋值(new),然后实现getModel()方法,返回pojo对象.
[; e; n6 B6 Q- z& b
9 n, m0 G$ a. \8 G
' T' s/ m- z) s+ F( V# c7.异常机制
5 ]8 G/ J' a4 w% [/ ]/ E2 Z9 SStruts2.0提供了一种声明式的异常处理方式.
3 G) J; x/ j* {0 ^public String execute() throws Exception
; N3 \+ @+ c; Y; C' y3 ^& \Action中的execute()能抛出所有Exception,将异常抛给了框架来处理,我们甚至不需要使用繁琐的try{}catch(){},我们只需要在struts.xml中配置<exception-mapping>异常映射,就能方便的处理各类异常.6 ?5 D* P+ L* h
它有两个属性,; T; I* I; s' K2 V2 X" v
exception:指定该异常映射所设置的异常类型
* g3 K7 E4 b4 v2 @7 d. y% F- B. Aresult:出现指定异常后,返回的结果.5 M4 h. e O; U; k5 j: }) z. S# I
全局异常:将<exception-mapping>元素作为<global-exception-mapping>元素的子元素
5 r: v8 X3 a' ]/ @; Y8 D# R局部异常:将<exception-mapping>元素作为<action>的子元素.
; j) R$ Q" }2 }) w7 `' e. \" a在页面输出异常信息:
' n) F+ }; K% H8 ] x0 e. k, d<s:property value="exception"/> 如<s:property value="exception.message"/>$ N; i3 @* f4 ?& m0 o( O
<s:property value="exceptionStack"/>
" a+ A5 q$ A! J2 a1 }& ]$ j: o |
|