TA的每日心情 | 衰 2021-2-2 11:21 |
---|
签到天数: 36 天 [LV.5]常住居民I
|
1.配置Action.
1 e/ T! G- B* B, n在struts.xml文件中,使用包来管理Action,定义一个Action节点时,必须指定name属性,且值为请求url的前半部分.class可以不写,默认为ActionSupport类.
0 c& _4 c+ B$ t. Z0 ]2 kAction只是一个控制器,并不能对客户端产生任何响应,只能将指定的视图资源返回给用户.通过配置其子节点<result>来定义逻辑视图和物理视图的关系.
* @, {' L h6 d1 w<action name="add" class="com.action.myAction">
" [( h% q/ f2 X9 [, W# h/ Q <result name="input" type="redirect">/input.jsp</result>
4 Y# g3 n/ c Y</action>
* {# y5 [% W$ t. t2 x, l
; Q; V( ~; u4 [: C( R2.动态方法调用.
$ J. `) E) v% u, K8 m要使用此功能,要在struts.properties文件中指定:
3 s& X9 C/ S K7 A* r/ bstruts.enable.DynamicMethodInvocation=true# x9 T3 M/ Q4 l1 |$ ?5 B7 y
将请求url定义为 actionName!methodName.action 如,FruitAction!add.action.stust.xml配置文件
/ J# u/ {8 r9 \- C% J( S6 n不需要改动,但在Action里必须定义一个add方法.这样就能访问FruitAction的add方法.8 K. f# U/ ^* k) [, U' d& v9 `- C4 ?
, c. z# ^! [9 B8 I5 {( F0 x* T
3.为action指定method属性.
& m/ @! W$ ?6 L2 h, d7 ]同动态方法调用的功能一样,但此种方法,在struts.xml文件中,将一个Action处理类定义成了多个逻辑Action
5 p6 Y: i- t) W5 P' x: |, z<action name="login" class="com.ac.UserAction" method="loginM"/></action>) f2 o; t) ]. i" \
<action name="regist" class="com.ac.UserAction" method="registM"/></action>9 y0 V+ b: u1 ^
这样,Action类的每个方法都被映射成一个Action.5 _: t) ?6 {) y
但,这中方法让action的定义相当冗余,所以struts2.0提供了另一种形式的方法调用,即使用通配符.9 d# Y ]6 w$ [7 M3 J
1 }, U3 h2 s, @4.使用通配符.
+ Z5 k) P# X1 [" J <Action>的name,class,method三个属性都能使用通配符. f# o. F5 L" |# r2 |6 N
<action name="*Action" class="com.ac.UserAction" method="{1}">) A/ e# ^2 j( a
这种定义方式就好比定义了多个action,method="{1}",表示"*"的值.8 b" H" }) M0 H6 S7 T7 u
<action name="*Action" class="com.ac.{1}Action" method="{1}">
/ s& @7 n1 Z0 C% u <action name="*_*" class="com.ac.{1}Action" method="{2}">0 V t+ R& W* J' V
struts2还允许<result>中使用表达式.如<result>/{1}.jsp</result>
# F. f* B w+ P: Z. S<action name="*Page">, Q/ U% Y6 e+ W, T8 J( H
<result>/{1}.jsp</result>
7 y& _- G! U: D# x0 _, i</action>
+ O. \) m" x0 Z: k* S( `由于没有指定class,则默认有ActionSupport处理,而ActionSupport的execute方法返回success,所以会跳到*.jsp页面.
4 D8 r; E7 {# ^4 E) R0 u问题来了,如果有一个这样的请求,aaaAction.action,在Struts.xml文件中定义了三个<action>0 E% U5 }1 a3 z% q
<action name="*">0 q( f$ N& q! b0 V! N
<action name="*Action"># F, \7 i: V% o
<action name="aaaAction">2 q& y- _8 O) t% |) R
那么将会匹配哪个<action>呢.: J, {. n3 M- a! a
首先,如果有一个<action>的name与请求完全匹配,那么就一定匹配该<action>,如果没有,则按顺序从上至下查找,如果能匹配,就映射该<action>,
; X7 M, x5 z, M$ _: P3 m5 r例如,如果有一个aaaAction请求,则会匹配<action name="aaaAction">如果请求是aaAction,则会匹配<action name="*">,因为它在最先匹配.所以,一般将<action name="*">放到最后,范围最小的放前面.
& n8 B9 ~- `6 T' S3 S
L% F' m k5 o6 D& N6 I) j5.默认Action& l- U# h' v. ? [% e J* H
struts2允许你定义一个默认的Action,当容器找不到与请求Url相匹配的<action>是,将使用此默认action.$ U3 B2 O! D( [& j2 V/ g1 h
<default-action-ref name="aAction" >( ]* d' B0 m: \! b. D. u+ m! M
<action name="aAction" class=......./>
3 U* m( T3 h& N1 ^+ I+ f/ T6.属性驱动和模型驱动.: _6 M: P) l s& }1 S# ~ f
属性驱动,将需要从页面获取的属性和传递给下一个视图的属性定义为action的实例变量,并提供getter和setter方法.
' A, i6 a8 v- U+ |3 Q模型驱动,则是向struts1.x那样,使用一个Pojo类来封装属性,但此pojo类不需要继承ActionForm,它就是一个普通的Pojo类.在Action中要实现ModelDriven接口,定义Pojo实例变量,并给其赋值(new),然后实现getModel()方法,返回pojo对象.
9 M& k7 r* R0 |) J
* D/ X7 V- L( u/ t2 ?: T$ Y' Z2 l2 a! N* Y' P
7.异常机制# @4 n- V+ P u8 H- |, b# G
Struts2.0提供了一种声明式的异常处理方式.( e. x, x" ^" M7 r+ a0 a @1 D; X! O
public String execute() throws Exception
& J: ~/ z) z" h! G, k' IAction中的execute()能抛出所有Exception,将异常抛给了框架来处理,我们甚至不需要使用繁琐的try{}catch(){},我们只需要在struts.xml中配置<exception-mapping>异常映射,就能方便的处理各类异常.
! ?3 m U& v) ?1 q" i* A它有两个属性,
& x. h* }4 x+ x/ Aexception:指定该异常映射所设置的异常类型
9 C1 v y; C' b8 t0 Kresult:出现指定异常后,返回的结果.' T" E) d. |: F# p/ f( y# c7 t
全局异常:将<exception-mapping>元素作为<global-exception-mapping>元素的子元素
6 \8 K3 @8 m7 |2 s局部异常:将<exception-mapping>元素作为<action>的子元素.
3 J' Z) o- M9 [( b在页面输出异常信息:! H/ d" p: T# Z9 M# A2 f- h( ?
<s:property value="exception"/> 如<s:property value="exception.message"/>: B$ J; K s; ^! H. z0 q
<s:property value="exceptionStack"/>
( p6 |! L% [7 F5 |/ B |
|