TA的每日心情 | 衰 2021-2-2 11:21 |
---|
签到天数: 36 天 [LV.5]常住居民I
|
1.配置Action.
M7 ~7 o5 I/ Y) l( f$ H6 q在struts.xml文件中,使用包来管理Action,定义一个Action节点时,必须指定name属性,且值为请求url的前半部分.class可以不写,默认为ActionSupport类.
+ ?( x3 k ~! f1 p+ kAction只是一个控制器,并不能对客户端产生任何响应,只能将指定的视图资源返回给用户.通过配置其子节点<result>来定义逻辑视图和物理视图的关系.3 G2 l+ @6 Q+ x6 X. W
<action name="add" class="com.action.myAction">$ x8 X9 c; b ]0 F& ~( q
<result name="input" type="redirect">/input.jsp</result>" d% R9 G7 O( S( i# t/ b0 m i+ N$ y
</action>9 y7 h0 T+ Y; `$ ~3 Z! j7 Q
$ v' O4 D p, l. U2.动态方法调用.
8 n! Y& u, N g+ ^/ `要使用此功能,要在struts.properties文件中指定:# N) u" z7 u! A% M. D+ ?9 a/ M
struts.enable.DynamicMethodInvocation=true* j8 s& Y) |3 s9 g q# h
将请求url定义为 actionName!methodName.action 如,FruitAction!add.action.stust.xml配置文件, k! l1 [* R- H- _
不需要改动,但在Action里必须定义一个add方法.这样就能访问FruitAction的add方法.$ Y* y1 |% ]0 A
2 N4 J0 F4 ]. @; c2 @1 Y
3.为action指定method属性.6 V6 H6 L9 p: T
同动态方法调用的功能一样,但此种方法,在struts.xml文件中,将一个Action处理类定义成了多个逻辑Action0 x* ]" f% C5 u7 r, I9 O
<action name="login" class="com.ac.UserAction" method="loginM"/></action>0 q' }$ o `0 M" s% `$ J
<action name="regist" class="com.ac.UserAction" method="registM"/></action>' c4 s$ f+ F6 o: X
这样,Action类的每个方法都被映射成一个Action., N% O6 R: m3 X; @, j+ _9 ^
但,这中方法让action的定义相当冗余,所以struts2.0提供了另一种形式的方法调用,即使用通配符.
6 g5 N1 y4 M9 y& X7 }5 M. E; S7 ~. O
4.使用通配符.3 K7 p A, b: j0 _, a
<Action>的name,class,method三个属性都能使用通配符." `4 y7 i5 L6 w; Q: s$ ?9 C
<action name="*Action" class="com.ac.UserAction" method="{1}">
3 V6 T( a) d: T9 n- t- c0 D8 e 这种定义方式就好比定义了多个action,method="{1}",表示"*"的值.
$ A4 B- ~+ Q( k <action name="*Action" class="com.ac.{1}Action" method="{1}">1 T% U4 _: y0 @% H5 w$ _
<action name="*_*" class="com.ac.{1}Action" method="{2}">, N; B* l# m7 e+ m: \4 ?
struts2还允许<result>中使用表达式.如<result>/{1}.jsp</result>: q8 I2 p2 u5 F, X" G
<action name="*Page">
2 Q9 n8 k: [+ ]3 q <result>/{1}.jsp</result>. u3 D6 A" O1 j/ t; n# S
</action>- @' N/ C9 |- M8 z. r7 ]; s
由于没有指定class,则默认有ActionSupport处理,而ActionSupport的execute方法返回success,所以会跳到*.jsp页面.4 D G5 g4 |. t( h
问题来了,如果有一个这样的请求,aaaAction.action,在Struts.xml文件中定义了三个<action>' n; s T9 N# a7 [! V
<action name="*">5 l i$ e, S' G2 P
<action name="*Action">6 k: I# H6 O% k9 ~4 C- t8 @+ u
<action name="aaaAction">
/ @ X y: b6 Q1 n% Q8 v那么将会匹配哪个<action>呢.
- E/ Q3 d* ] I( {/ y% `首先,如果有一个<action>的name与请求完全匹配,那么就一定匹配该<action>,如果没有,则按顺序从上至下查找,如果能匹配,就映射该<action>," X, ^! `/ B$ q0 @
例如,如果有一个aaaAction请求,则会匹配<action name="aaaAction">如果请求是aaAction,则会匹配<action name="*">,因为它在最先匹配.所以,一般将<action name="*">放到最后,范围最小的放前面., R* _+ f. {/ K
: L! {$ t8 Q& d# U
5.默认Action
7 e9 d% d9 W& t* ] struts2允许你定义一个默认的Action,当容器找不到与请求Url相匹配的<action>是,将使用此默认action.
6 }$ B* u7 D* I <default-action-ref name="aAction" >* s4 U7 j) _# e4 c I
<action name="aAction" class=......./>" W( F! ^" e! Y L
6.属性驱动和模型驱动.
) ]- d0 i6 |' U; |属性驱动,将需要从页面获取的属性和传递给下一个视图的属性定义为action的实例变量,并提供getter和setter方法." i7 _" L/ s8 A& C* N% k
模型驱动,则是向struts1.x那样,使用一个Pojo类来封装属性,但此pojo类不需要继承ActionForm,它就是一个普通的Pojo类.在Action中要实现ModelDriven接口,定义Pojo实例变量,并给其赋值(new),然后实现getModel()方法,返回pojo对象.
- ?% p6 P, V1 s% J6 u
; U4 s7 P; y3 W9 ^' K
+ a. ?# [9 b. Q& t* L1 [- C; x7.异常机制4 y) E: |# F* @( L1 n
Struts2.0提供了一种声明式的异常处理方式.5 u& p0 A6 s; ?: I( q1 @
public String execute() throws Exception; x& z5 N6 @5 c8 Z0 d8 q: X
Action中的execute()能抛出所有Exception,将异常抛给了框架来处理,我们甚至不需要使用繁琐的try{}catch(){},我们只需要在struts.xml中配置<exception-mapping>异常映射,就能方便的处理各类异常.
t: K% k% u& h6 D# J: i) Y; s它有两个属性,0 ~: [+ D6 {; C6 R0 h5 \- T( z
exception:指定该异常映射所设置的异常类型
: D7 t, G M( T! x$ l1 Tresult:出现指定异常后,返回的结果.$ R. D- o0 h3 ~& Y
全局异常:将<exception-mapping>元素作为<global-exception-mapping>元素的子元素
) \; G# x: E* |, U) n局部异常:将<exception-mapping>元素作为<action>的子元素.
( t- P( Q' O$ n7 s U在页面输出异常信息:
. j5 P3 L! [5 r% T<s:property value="exception"/> 如<s:property value="exception.message"/>
0 @, W# b7 a+ X<s:property value="exceptionStack"/>
8 Z- Q p! t- b" m! u' w |
|