TA的每日心情 | 衰 2021-2-2 11:21 |
---|
签到天数: 36 天 [LV.5]常住居民I
|
1.配置Action.: a Q/ i: o" h+ ?+ f# l! z
在struts.xml文件中,使用包来管理Action,定义一个Action节点时,必须指定name属性,且值为请求url的前半部分.class可以不写,默认为ActionSupport类.. n$ D+ u7 ]% G6 J6 a+ {
Action只是一个控制器,并不能对客户端产生任何响应,只能将指定的视图资源返回给用户.通过配置其子节点<result>来定义逻辑视图和物理视图的关系.; Z* S. I5 q4 r- K& |
<action name="add" class="com.action.myAction">7 O. r/ h" u& o' r' h* K2 Y
<result name="input" type="redirect">/input.jsp</result>
! W/ x+ Y+ g7 N+ f [</action>3 U/ {8 i% `9 W
: p' T9 d, {9 | B2.动态方法调用.
; K. p2 I% S9 _要使用此功能,要在struts.properties文件中指定:* @ S( S5 i* s9 L$ ~/ C
struts.enable.DynamicMethodInvocation=true7 u. i5 e2 L& X/ L
将请求url定义为 actionName!methodName.action 如,FruitAction!add.action.stust.xml配置文件& z7 g/ Z @; u1 n
不需要改动,但在Action里必须定义一个add方法.这样就能访问FruitAction的add方法.
- R7 _2 P8 \- P( q" B( ?
$ k; s0 V: T/ O9 v1 S3 m3.为action指定method属性.
3 [+ k) X$ c8 o同动态方法调用的功能一样,但此种方法,在struts.xml文件中,将一个Action处理类定义成了多个逻辑Action9 ^# U; G1 l& e. L" d6 w6 l o
<action name="login" class="com.ac.UserAction" method="loginM"/></action>& ?/ T3 e1 Y" N" u! x1 w6 ^
<action name="regist" class="com.ac.UserAction" method="registM"/></action>* I* c( S& ~; }
这样,Action类的每个方法都被映射成一个Action.5 `4 }$ R9 s9 Z1 F) h0 f5 ~/ h
但,这中方法让action的定义相当冗余,所以struts2.0提供了另一种形式的方法调用,即使用通配符.7 k) U- L8 p8 \9 l8 o
0 `# B, c. a% K6 u% {- \2 D% v' E2 e4.使用通配符.5 k8 s' x' S; L* D; ]& p, {: g
<Action>的name,class,method三个属性都能使用通配符.
- ~0 S- d: S# g: R" _ <action name="*Action" class="com.ac.UserAction" method="{1}">7 c' w* C" R% F4 d1 ]( ]
这种定义方式就好比定义了多个action,method="{1}",表示"*"的值.' X; A4 j0 z; v+ O: F7 q1 n+ ~1 Z
<action name="*Action" class="com.ac.{1}Action" method="{1}">
0 I8 F* S' M O/ G! Y0 m8 ^ <action name="*_*" class="com.ac.{1}Action" method="{2}">
- V! S# e6 O7 q, X9 `" \struts2还允许<result>中使用表达式.如<result>/{1}.jsp</result>
' V! u, I4 d3 B5 Q7 Y1 b<action name="*Page">
+ w7 V. @% _( I u9 P <result>/{1}.jsp</result>
. y+ L7 S$ \- }" M. q</action>) ~8 F8 {& [& A* f( d% b
由于没有指定class,则默认有ActionSupport处理,而ActionSupport的execute方法返回success,所以会跳到*.jsp页面.- D z/ N9 Y6 O% N
问题来了,如果有一个这样的请求,aaaAction.action,在Struts.xml文件中定义了三个<action>
_' u5 P8 c, p. c0 J2 N# q<action name="*">+ S1 u& @+ h8 s, a9 r" F7 z
<action name="*Action">
6 n: i) ^" I% {2 F. x- L1 _; {<action name="aaaAction">
9 [" ]& }8 J& o1 ?$ C1 v那么将会匹配哪个<action>呢.% m# g- ~* ^9 O: {$ m! x
首先,如果有一个<action>的name与请求完全匹配,那么就一定匹配该<action>,如果没有,则按顺序从上至下查找,如果能匹配,就映射该<action>,0 x% g; v. P4 x* b, z% b1 v
例如,如果有一个aaaAction请求,则会匹配<action name="aaaAction">如果请求是aaAction,则会匹配<action name="*">,因为它在最先匹配.所以,一般将<action name="*">放到最后,范围最小的放前面.2 m2 F; b" U* S$ o) k+ I
f+ @5 {& v8 a9 D; E5 ]/ X
5.默认Action
8 N$ P& i6 H/ l' _$ D$ g7 R5 O struts2允许你定义一个默认的Action,当容器找不到与请求Url相匹配的<action>是,将使用此默认action.
/ b9 `, w- {" D0 c <default-action-ref name="aAction" >* r+ a& K- d" B. m; A) H
<action name="aAction" class=......./> l4 c. n+ I! s
6.属性驱动和模型驱动.
7 X( Q: H7 e) Q属性驱动,将需要从页面获取的属性和传递给下一个视图的属性定义为action的实例变量,并提供getter和setter方法.7 ]. L" s" m. s( q, n: _( I
模型驱动,则是向struts1.x那样,使用一个Pojo类来封装属性,但此pojo类不需要继承ActionForm,它就是一个普通的Pojo类.在Action中要实现ModelDriven接口,定义Pojo实例变量,并给其赋值(new),然后实现getModel()方法,返回pojo对象.' F- q2 m2 V9 r9 J$ l1 p7 r
0 j9 _) T8 c) L7 o5 `
8 X! Y) u2 H0 c9 F* p6 ?
7.异常机制
. A' d; p6 o7 r1 b3 _Struts2.0提供了一种声明式的异常处理方式.8 T* o- q0 ~. _
public String execute() throws Exception
3 V7 Y) n, }0 V$ a8 o" F4 o7 A; P; yAction中的execute()能抛出所有Exception,将异常抛给了框架来处理,我们甚至不需要使用繁琐的try{}catch(){},我们只需要在struts.xml中配置<exception-mapping>异常映射,就能方便的处理各类异常.
9 T8 D: ]: C6 W& b5 ]" H它有两个属性,
1 ?3 |5 l+ L# S3 J4 texception:指定该异常映射所设置的异常类型
1 K, o8 ~2 I8 [; i' Vresult:出现指定异常后,返回的结果.$ h4 w) i% _# o* T
全局异常:将<exception-mapping>元素作为<global-exception-mapping>元素的子元素
4 v: \* Q% g) A: u/ L# y局部异常:将<exception-mapping>元素作为<action>的子元素.
) ?! n2 p; @' R; B$ B, ?, t f" L% c在页面输出异常信息:
0 b( ] n% [ \3 X5 Z" ~( T* ^<s:property value="exception"/> 如<s:property value="exception.message"/>% B1 |! C+ I& L$ V% Q9 z# O
<s:property value="exceptionStack"/>
0 {! r* |6 e' ~% u# | |
|