TA的每日心情 | 衰 2021-2-2 11:21 |
|---|
签到天数: 36 天 [LV.5]常住居民I
|
1.配置Action.
; }# a4 U5 a' P( j& ^在struts.xml文件中,使用包来管理Action,定义一个Action节点时,必须指定name属性,且值为请求url的前半部分.class可以不写,默认为ActionSupport类.; P$ L! m5 h2 a
Action只是一个控制器,并不能对客户端产生任何响应,只能将指定的视图资源返回给用户.通过配置其子节点<result>来定义逻辑视图和物理视图的关系./ `# _' b) P! u; N& k
<action name="add" class="com.action.myAction">
" E) a: i5 M6 D6 k: y, u <result name="input" type="redirect">/input.jsp</result>- M( u; @, J! Y- N; ^8 i
</action>3 f- i: g: w" {5 R+ Q
( M* W% _) s6 l% W: q
2.动态方法调用.
r: j5 f2 A, R8 @4 Y要使用此功能,要在struts.properties文件中指定:4 B, s) _; j1 n8 E/ B7 ~- m
struts.enable.DynamicMethodInvocation=true
& C7 z+ J- ~5 \. u; i X' X. a: z将请求url定义为 actionName!methodName.action 如,FruitAction!add.action.stust.xml配置文件
4 F6 Z+ d! G1 V& I不需要改动,但在Action里必须定义一个add方法.这样就能访问FruitAction的add方法.
/ G1 J" L/ |' W8 O' N/ h
i" w9 |3 Y$ B" v3.为action指定method属性.
% @: O; w* g+ E同动态方法调用的功能一样,但此种方法,在struts.xml文件中,将一个Action处理类定义成了多个逻辑Action$ p! c( l( h6 U
<action name="login" class="com.ac.UserAction" method="loginM"/></action>8 W9 I [# e/ X- y! C% `
<action name="regist" class="com.ac.UserAction" method="registM"/></action>, c8 h6 N) [0 L$ F1 G5 O8 D
这样,Action类的每个方法都被映射成一个Action.' Q% E' Q1 w, A- Q
但,这中方法让action的定义相当冗余,所以struts2.0提供了另一种形式的方法调用,即使用通配符.0 M6 G7 q0 N2 P# j7 i$ f3 l' q
; L2 m$ N6 U4 n8 j) `
4.使用通配符./ c6 q4 p/ p8 L! y8 n: B9 z
<Action>的name,class,method三个属性都能使用通配符.
) l! Y3 W+ c, b2 X <action name="*Action" class="com.ac.UserAction" method="{1}">
# H% \5 e; s$ s: Z+ w9 ?7 U 这种定义方式就好比定义了多个action,method="{1}",表示"*"的值.
( O, }$ ~- `. g, y% _ <action name="*Action" class="com.ac.{1}Action" method="{1}">7 U- D. U; W/ \; Z! p: a
<action name="*_*" class="com.ac.{1}Action" method="{2}">
1 F9 q& ~- s" ]- |: sstruts2还允许<result>中使用表达式.如<result>/{1}.jsp</result>1 }$ U+ h1 q* f( j
<action name="*Page">
! }9 ^1 I( b$ N5 ^* k <result>/{1}.jsp</result>0 w- s# e- c: B/ H+ i* ~( t* w
</action>
) W" z: K! |2 ^- q/ Y+ W( N8 L' J由于没有指定class,则默认有ActionSupport处理,而ActionSupport的execute方法返回success,所以会跳到*.jsp页面.
. f: G. A" |9 v2 Y( r$ v问题来了,如果有一个这样的请求,aaaAction.action,在Struts.xml文件中定义了三个<action>
, @) q3 K( F* E( P<action name="*">% P5 N& e4 M6 M" i& C% ^8 `
<action name="*Action">1 Q, W, f; N! Q$ W5 y4 K+ V
<action name="aaaAction"> E1 o: [ l* Q' I2 f
那么将会匹配哪个<action>呢.6 E' l( U4 I4 C1 l
首先,如果有一个<action>的name与请求完全匹配,那么就一定匹配该<action>,如果没有,则按顺序从上至下查找,如果能匹配,就映射该<action>,
5 D, q, q8 P" O: \1 W0 @* X2 Y例如,如果有一个aaaAction请求,则会匹配<action name="aaaAction">如果请求是aaAction,则会匹配<action name="*">,因为它在最先匹配.所以,一般将<action name="*">放到最后,范围最小的放前面.& G; |: v; K& Y: q6 U+ l
+ }" Y8 n5 L9 u0 c5.默认Action
$ [8 T, \/ e4 a v struts2允许你定义一个默认的Action,当容器找不到与请求Url相匹配的<action>是,将使用此默认action.) F9 [7 b" g+ O
<default-action-ref name="aAction" >
; N) N! ]( S% y$ l. B" W <action name="aAction" class=......./>
+ O/ |0 h8 W) H9 P3 @# }. i, v6 L6.属性驱动和模型驱动.
$ Y/ {! p, e! V5 `2 Y9 A+ O4 W4 F8 h属性驱动,将需要从页面获取的属性和传递给下一个视图的属性定义为action的实例变量,并提供getter和setter方法." j2 Z1 R8 I) S0 f2 X3 _: O
模型驱动,则是向struts1.x那样,使用一个Pojo类来封装属性,但此pojo类不需要继承ActionForm,它就是一个普通的Pojo类.在Action中要实现ModelDriven接口,定义Pojo实例变量,并给其赋值(new),然后实现getModel()方法,返回pojo对象.
q# N0 Y: _7 a# u, x% u$ j4 f1 }9 E+ ]' Y1 `, T4 [8 v; O% A* g) V
]) D O; j f4 ^! Z/ `7.异常机制
+ v, h# c( C8 w- _! b- yStruts2.0提供了一种声明式的异常处理方式.
5 N# s( Z0 H# x3 K! f6 P! i5 Npublic String execute() throws Exception/ e e- r1 {# A7 W: s5 e8 i' O# u
Action中的execute()能抛出所有Exception,将异常抛给了框架来处理,我们甚至不需要使用繁琐的try{}catch(){},我们只需要在struts.xml中配置<exception-mapping>异常映射,就能方便的处理各类异常. k! Y0 e0 W4 L9 K
它有两个属性,5 A1 x0 R5 |! @& y+ L/ I) z
exception:指定该异常映射所设置的异常类型9 n* L# m! |; J* j1 P: `* |. M. k
result:出现指定异常后,返回的结果.
" Y. j9 [2 N% q) h0 t7 a) f全局异常:将<exception-mapping>元素作为<global-exception-mapping>元素的子元素, y, x# K: }+ C) d* F+ q
局部异常:将<exception-mapping>元素作为<action>的子元素.
* W( O! l: j4 T' H在页面输出异常信息:. ~9 F. \+ j! x3 n* a1 `2 m4 C0 @
<s:property value="exception"/> 如<s:property value="exception.message"/>
+ v% R1 j/ }; h! t<s:property value="exceptionStack"/>
" {8 ]% K6 o3 ^7 L3 [# V: x. ?2 f |
|