我的日常

登录/注册
您现在的位置:论坛 盖世程序员(我猜到了开头 却没有猜到结局) 盖世程序员 > struts2中如何配置action
总共48086条微博

动态微博

查看: 2098|回复: 0

struts2中如何配置action

[复制链接]
admin    

1244

主题

544

听众

1万

金钱

管理员

  • TA的每日心情

    2021-2-2 11:21
  • 签到天数: 36 天

    [LV.5]常住居民I

    管理员

    跳转到指定楼层
    楼主
    发表于 2014-09-18 10:08:58 |只看该作者 |倒序浏览
    1.配置Action.) O- o; ]1 {8 ~4 W7 q
    struts.xml文件中,使用包来管理Action,定义一个Action节点时,必须指定name属性,且值为请求url的前半部分.class可以不写,默认为ActionSupport类.
    ) ~$ @: f. I; b* q# qAction只是一个控制器,并不能对客户端产生任何响应,只能将指定的视图资源返回给用户.通过配置其子节点<result>来定义逻辑视图和物理视图的关系.
    & z3 A' h# q5 R1 l% p+ `; i, D# V( \<action name="add" class="com.action.myAction">; s0 G; r" n$ i& Z8 G' m
           <result name="input" type="redirect">/input.jsp</result>
    & G* x2 Y9 O. [/ y</action>% M8 D, G) r8 H$ ?0 o1 E

    9 P9 a( V8 _7 B9 G& R# @- u2.动态方法调用., c# V9 I8 F' k6 ^/ r" c. n1 G
    要使用此功能,要在struts.properties文件中指定:0 F* K1 Z' Q" Q2 V+ P/ t; c
    struts.enable.DynamicMethodInvocation=true" `$ x: _+ H; i9 z. `
    将请求url定义为 actionName!methodName.action 如,FruitAction!add.action.stust.xml配置文件
    1 v6 ]! ~- J! h% H8 X& k1 B不需要改动,但在Action里必须定义一个add方法.这样就能访问FruitAction的add方法.: D* o7 g/ t3 y6 c( t
    % y! ]- U; g- N- L
    3.为action指定method属性.2 v8 n1 e7 L& E+ U
    同动态方法调用的功能一样,但此种方法,在struts.xml文件中,将一个Action处理类定义成了多个逻辑Action
    ' H$ Z* V5 r% l; U- x% ~+ N<action name="login" class="com.ac.UserAction" method="loginM"/></action>6 P: K0 G$ _  n3 j% c" s; P& X/ r
    <action name="regist" class="com.ac.UserAction" method="registM"/></action>6 _8 n& s& [6 m  x$ e0 ]3 S
    这样,Action类的每个方法都被映射成一个Action.
    + }: l- o3 B# p$ C6 y) W) i但,这中方法让action的定义相当冗余,所以struts2.0提供了另一种形式的方法调用,即使用通配符.
    : _) B* Q6 }4 D3 f0 X3 S7 n
    : N+ S6 ]& n4 w4 h$ V/ t4.使用通配符.
    % x: s; ^* G, N2 m: [     <Action>的name,class,method三个属性都能使用通配符.
    / Q+ i# v! Z  x4 C& M+ C+ D7 T: M# r$ G$ x        <action name="*Action" class="com.ac.UserAction" method="{1}">
    1 ]! ]+ O$ S, r1 V2 g" u; m% Q- ?    这种定义方式就好比定义了多个action,method="{1}",表示"*"的值.
    $ q, y- ^6 j5 h+ R       <action name="*Action" class="com.ac.{1}Action" method="{1}">
      c; ]( M/ e( b& ~) v       <action name="*_*" class="com.ac.{1}Action" method="{2}">
    3 l3 B) T- D. r3 m" \6 ^struts2还允许<result>中使用表达式.如<result>/{1}.jsp</result>" S5 s' g7 C/ ?* C2 ]
    <action name="*Page">( `3 F6 h0 r; ^4 r- y5 V8 L6 }+ u: n8 ^
         <result>/{1}.jsp</result>
    1 q6 o( v) p3 k" q</action>
    - l( F# }4 H+ b. F( ~, p1 H由于没有指定class,则默认有ActionSupport处理,而ActionSupport的execute方法返回success,所以会跳到*.jsp页面.( Q- b3 E1 k' \$ X
    问题来了,如果有一个这样的请求,aaaAction.action,在Struts.xml文件中定义了三个<action>+ k, J/ y2 @5 T; ]$ }/ ~' |0 o% `
    <action name="*">
    0 H6 y/ _2 T' F8 a8 q( ^& |$ @<action name="*Action">$ T. d$ c! L: p9 d
    <action name="aaaAction">. Y- w% X; l! j' w* |0 h
    那么将会匹配哪个<action>呢.
    ( G. n( [, C- ~7 Z: N首先,如果有一个<action>的name与请求完全匹配,那么就一定匹配该<action>,如果没有,则按顺序从上至下查找,如果能匹配,就映射该<action>,
    3 Q5 y( h  d6 M+ q+ y例如,如果有一个aaaAction请求,则会匹配<action name="aaaAction">如果请求是aaAction,则会匹配<action name="*">,因为它在最先匹配.所以,一般将<action name="*">放到最后,范围最小的放前面.
    " V6 n: Z6 S' c* h# I* f  V; D$ y( v2 {6 ^5 N
    5.默认Action2 j7 {& p  _0 Q& @- i4 T3 H
           struts2允许你定义一个默认的Action,当容器找不到与请求Url相匹配的<action>是,将使用此默认action.! ?$ o& X% M7 E; |
              <default-action-ref name="aAction" >
    : F6 Y: X: Z7 y$ L) f  {$ y; \3 d          <action name="aAction" class=......./>% n& b; s* n) }
    6.属性驱动和模型驱动.
    # V4 p# |- P8 H/ Z属性驱动,将需要从页面获取的属性和传递给下一个视图的属性定义为action的实例变量,并提供getter和setter方法.; p# z; q+ W1 W  j% i6 q4 O
    模型驱动,则是向struts1.x那样,使用一个Pojo类来封装属性,但此pojo类不需要继承ActionForm,它就是一个普通的Pojo类.在Action中要实现ModelDriven接口,定义Pojo实例变量,并给其赋值(new),然后实现getModel()方法,返回pojo对象.0 E/ e# N( X! P- J& }
    ; M1 _7 ]/ N4 M3 o

    ( W  o  L; a1 w: [. a" ?7.异常机制
    + y( d+ e2 w9 t6 b5 n( cStruts2.0提供了一种声明式的异常处理方式.5 q" v9 X" S+ ~& Z- a; H* `$ v
    public String execute() throws Exception
    4 t2 l" F1 L1 [9 |0 p* bAction中的execute()能抛出所有Exception,将异常抛给了框架来处理,我们甚至不需要使用繁琐的try{}catch(){},我们只需要在struts.xml中配置<exception-mapping>异常映射,就能方便的处理各类异常.- Y& v. c# s$ j" \! ~# B
    它有两个属性,2 r- D5 c3 {- k4 N0 C# K! e# @1 b
    exception:指定该异常映射所设置的异常类型! f$ h8 s* M8 q9 R: w  ?- o. r6 g# S
    result:出现指定异常后,返回的结果.: l, H0 c/ ?0 c
    全局异常:将<exception-mapping>元素作为<global-exception-mapping>元素的子元素
    # Y7 x1 T1 f" O5 d$ s7 h( Y局部异常:将<exception-mapping>元素作为<action>的子元素.
    2 r$ D, T$ _1 F1 {4 P2 U7 N! q6 \在页面输出异常信息:
    4 Z! T9 Y4 H- y# p0 y6 l$ M, H5 N: s<s:property value="exception"/> 如<s:property value="exception.message"/>( s' W/ K* j4 ]: B0 N1 M
    <s:property value="exceptionStack"/>
    - Y3 V9 q/ q0 Y" A2 ~+ g; k

    科帮网 1、本主题所有言论和图片纯属会员个人意见,与本社区立场无关
    2、本站所有主题由该帖子作者发表,该帖子作者与科帮网享有帖子相关版权
    3、其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者和科帮网的同意
    4、帖子作者须承担一切因本文发表而直接或间接导致的民事或刑事法律责任
    5、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责
    6、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除并致以最深的歉意
    7、科帮网管理员和版主有权不事先通知发贴者而删除本文


    JAVA爱好者①群:JAVA爱好者① JAVA爱好者②群:JAVA爱好者② JAVA爱好者③ : JAVA爱好者③

    快速回复
    您需要登录后才可以回帖 登录 | 立即注册

       

    关闭

    站长推荐上一条 /1 下一条

    发布主题 快速回复 返回列表 联系我们 官方QQ群 科帮网手机客户端
    快速回复 返回顶部 返回列表