Action映射配置元素

http://book.51cto.com/art/200909/150998.htm

24.2.4  Action映射配置元素<action>

Action mappings是框架中的基本工作单元,框架通过对请求路径进行映射来决定由哪个Action来处理请求。Action mappings能指定一系列的Result、异常处理器及拦截器,<action>元素的所有属性中只有name属性是必需的,其他属性都是可选的。尽管对于<action>的命名很灵活,但是<action>的名字中最好不要出现斜线(/)、点号(.)、破折号(-),以免出现一些不可预知的错误。

按照作用的不同,可以配置5种类型的请求映射。

1)配置直接转发的请求

只有一个name属性来表示要匹配的映射地址,并在子元素<result>中配置要转发的页面。例如下面的映射可以匹配"http://localhost:8081/demo/index.do"的请求,用来转发到login.jsp页面:

 
 
  1. <action name="index">  
  2.     <result>login.jsp</result>  
  3. </action> 

2)最古老的方法-指定处理的Action类

除了要使用name属性来匹配映射地址外,还可以使用class属性来指定要使用的Action类名。如果使用Struts 2与Spring的集成,class的属性可以是Spring配置文件中<bean>组件的名字,在后面的开发中使用的就是这种形式。下面是一个使用Action类的配置实例,其class指向处理的Action类名:

 
 
  1. <action name="login" class="com.demo.struts2.actions.LoginAction">  
  2.     <result name="success">welcome.jsp</result>  
  3.     <result name="input">login.jsp</result>  
  4. </action> 

在上面的配置中添加了多个<result>,这表示Action类可能会有多个返回结果,在不同的条件下Action的处理函数将返回到不同的<result>的name属性,这样就会找到不同的JSP页面。你可以随意定义这里的name属性值,只要在Action中返回对应的字符串即可。例如,在上面的定义中,我们可以这么返回结果页面:

 
 
  1. public String execute() throws Exception {  
  2.     if(…) {  
  3.         return "success";  
  4.     } else {  
  5.         return "input";  
  6.     }  

不过要注意的是,Action的execute()方法中所返回的字符串必须在<result>列表中有定义,否则会出现找不到Result的错误。

3)最古老的方法-指定Action的处理方法

在上面的Action类中,会默认调用execute()函数来进行处理。假如我们有多个请求都要通过同一个Action类来处理,但是却只有一个execute()处理函数,显然不能够满足要求。而此时可以在<action>中添加method属性,指定要调用的函数名,如果不指定method属性,则默认使用execute()来执行。

例如下面的两个映射都指向了LoginAction类,而method值不同:

 
 
  1. <action name="login" class="com.demo.struts2.actions.  
  2. LoginAction" method="login">  
  3.     <result name="success">welcome.jsp</result>  
  4.     <result name="input">login.jsp</result>  
  5. </action>  
  6. <action name="logout" class="com.demo.struts2.actions.  
  7. LoginAction" method="logout">  
  8.     <result name="success">login.jsp</result>  
  9.     <result name="input">error.jsp</result>  
  10. </action> 

这样就需要编写如下两个函数来负责处理这两个请求:

 
 
  1. public String login() throws Exception {  
  2.     return "success";  
  3. }  
  4. public String logout() throws Exception {  
  5.     return "success";  

当然,如果类中不包含某一个方法,就不能够配置在method属性值中。

4)WebWork中的方法-通过请求地址来指定执行的函数

上面使用method进行配置有一个问题,就是需要为每一个请求与处理方法对之间配置一个<action>元素,如果我们要使用一个Action类处理多个请求,就需要为该Action类配置多个<action>元素来指向不同的函数,这显然会让我们眼花缭乱。要解决这个问题,我们可以不使用method属性,只需要将函数的选择放在请求地址中即可。

例如下面我们仅仅配置一个<action>执行一个Action类:

 
 
  1. <action name="login" class="com.demo.struts2.actions.LoginAction">  
  2.     <result name="success">welcome.jsp</result>  
  3.     <result name="input">login.jsp</result>  
  4. </action> 

然后可以分别使用下面的两个请求地址来实现对两个函数的调用。

执行登录的地址:http://localhost:8081/demo/login!login.do

执行退出的地址:http://localhost:8081/demo/login!logout.do

这里使用了一个感叹号"!",感叹号"!"之前的名字"login"是<action>中name属性的值,之后的名字login()、logout()分别是Action中的函数名。这样就解决了函数的选择问题,这与Struts 1.x中的DispatchAction实现的作用相同,但Action类并不需要继承任何类,这就是Struts 2带给我们的好处。

5)Struts 2中的方法-配置通配符映射

虽然我们可以使用POJO的Action类,但Struts 2在基于Action的校验机制中需要我们的Action类继承基类ActionSupport,并重写校验函数validate()。如果在该函数中检查到错误字段,Struts 2的框架将会自动将请求返回到Action.INPUT的页面。

在上面的<action>配置中,执行登录和退出的请求都将调用LoginAction类,也都将调用validate()函数进行表单校验,但是两者在校验出错时返回的页面不同:我们希望登录失败后返回到login.jsp,退出失败后返回到error.jsp。但是ActionSupport在执行完validate()后只会返回Action.INPUT,这样就不能够实现校验失败返回不同的页面了。

幸运的是,Struts 2的<action>允许我们使用通配符的配置来解决该问题,首先需要将struts.properties中的属性struts.enable.DynamicMethodInvocation设置为true(默认即为true),然后在name属性中添加一个星号"*",并在INPUT页面中引用这个变量值,如下所示:

 
 
  1. <action name="login*" class="com.demo.struts2.actions.  
  2. LoginAction">  
  3.     <result name="success">welcome.jsp</result>  
  4.     <result name="input">{1}.jsp</result>  
  5. </action> 

这样,我们在请求的地址中可以附带校验出错后返回页面的名字,此时就可以使用下面的地址了。

执行登录的地址:http://localhost:8081/demo/loginlogin!login.do

执行退出的地址:http://localhost:8081/demo/loginerror!logout.do

粗体的部分表示星号"*"匹配的名称,该名称将会传递到{1}中。这样,登录时的INPUT页面就是login.jsp,退出时的INPUT页面就是error.jsp了。上面的{1}使用的是第一个星号"*"匹配的字符,你可以在name属性中添加多个星号"*",这样可以分别使用{1}、{2}等来取得多个匹配的字符串了。

后面开发的办公自动化系统就是使用的第4和5种相结合的方法。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值