[struts2中action的通配符]Struts2中Action的通配符使用方法

时间:2020-10-17  来源:Action  阅读:

在这篇《Struts2学习之配置单个Action多控制处理逻辑》文章中,讲到指定method属性时,列举了以下的配置代码:

 代码如下


   

   
       
            /login.jsp
            /error.jsp
            /success.jsp
       

       
            /regist.jsp
       
   

可以发现,上面配置的两个Action,有很大一部分是类似的,存在冗余的现象。在Struts2框架中,允许使用通配符的方式进行配置。下面就利用Struts2框架的这一特性对上述这段配置代码进行重构。

重构第一步

在配置元素时,允许在指定name属性时使用模式字符串(即用“*”代表一个或多个任意字符),接下来就可以在class、method属性及子元素中使用{N}的形式来代表前面第N个星号所匹配的子串。基于此,文章一开始的配置代码可以重构为以下这样:

 代码如下


   

   
       
            /{1}.jsp
            /error.jsp
            /success.jsp
       
   

上面的元素不是定义了一个普通Action,而是定义了一系列的逻辑Action。只要用户请求的URL是*Action.action的模式,都可以使用该Action来处理。配置该action元素时,还指定method属性,但该method属性使用了一个表达式{1},该表达式就是name属性值中第一个*的值。例如:如果用户请求的URL为loginAction.action,则调用对应的login方法;如果为registAction.action,则调用regist方法。对于子元素中使用的/{1}.jsp也是同样的道理。

重构第二步

更多时候,我们希望action对应的class属性也可以进行模式匹配,这样的话灵活性更高。比如现在有两个Action类,分别为:com.jellythink.practise.LoginAction和com.jellythink.practise.RegistAction,这两个类分别完成登陆与注册行为。当action的name匹配到loginAction时,则对应的class则为com.jellythink.practise.LoginAction;当匹配到registAction时,则对应的clas则为com.jellythink.practise.RegistAction。按照这样的需求,上述的配置代码又可以修改为这样:

 代码如下


   

   
       
            /{2}.jsp
            /error.jsp
            /success.jsp
       
   

在上述配置代码中,action的name属性为*_*,这需要我们在前台页面设置action的值时按照指定的规则进行设定,例如:类名_方法名。当用户请求的URL是Login_login.action的模式时,则{1}代表的值为Login,而对应的{2}代表的值为login;同理,当请求为Regist_regist.action的模式时,则{1}代表的值为Regist,而对应的{2}代表的值为regist。

通过这种方式,配置代码的灵活性更高,写法更简单。

到底使用哪个?

通过使用模式匹配的方式,就会引申出另一个问题。比如有下面这段配置代码:

 代码如下


   

   
       
       
            /{1}.jsp
            /error.jsp
            /success.jsp
       

       
       
            /error.jsp
            /success.jsp
       

       
       
            /success.jsp
       
   

问题是,如果客户端请求的URL是getBookInfoAction.action,那么到底匹配哪个Action呢?对于Struts2框架来说,规则是这样的:

如果请求URL是getBookInfoAction.action,如果struts.xml文件中有名为getBookInfoAction的Action配置,则一定由该Action来处理用户请求
如果struts.xml文件中没有名为getBookInfoAction的Action配置,则搜寻name属性值能匹配getBookInfoAction的Action,例如name为Action或,*Action并不会比*更优先匹配getBookInfoAction的请求,这取决于这两个Action定义的先后顺序

例子

1、 ActionMethod:Action执行的时候并不一定要执行execute方法,可以在配置文件中配置action的时候用“method”属性来指定执行哪个方法,也可以在url地址中动态指定(动态方法调用DMI)Struts.xml文件的配置:

 代码如下
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">

   
   
       
            /user_add_success.jsp
       
       
            /user_add_success.jsp
            /user_delete_success.jsp
       
   


Index.jsp页面的内容:

 代码如下
<%@ page language="java" contentType="text/html; charset=GB18030"
    pageEncoding="GB18030"%>
<% String context = request.getContextPath(); %>




Insert title here


     /user/userAdd">添加用户

     /user/user!add">添加用户

     /user/user!delete">删除用户



UserAction的内容:

 代码如下 package com.bjsxt.struts2.user.action;
import com.opensymphony.xwork2.ActionSupport;
public class UserAction extends ActionSupport {
     public String add() {
         return SUCCESS;
     }
     public String delete(){
         return "delete";
     }   
}

2、 使用通配符
Strtus.xml文件的配置

 代码如下
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">

   
   
       
            /Student{1}_success.jsp
       
       
       
            /{1}_{2}_success.jsp
       
   


Action的内容:

 代码如下 public class CourseAction extends ActionSupport {
     public String add() {
         return SUCCESS;
     }
     public String delete() {
         return SUCCESS;
     }
}
public class StudentAction extends ActionSupport {
     public String add() {
         return SUCCESS;
     }
     public String delete() {
         return SUCCESS;
     }
}
public class TeacherAction extends ActionSupport {
     public String add() {
         return SUCCESS;
     }
     public String delete() {
         return SUCCESS;
     }
}

Index.jsp页面的内容:

 代码如下
<%@ page language="java" contentType="text/html; charset=GB18030"
     pageEncoding="GB18030"%>
<%String context = request.getContextPath();%>


    
        
         Insert title here
    
    
         使用通配符,将配置量降到最低

         /actions/Studentadd">添加学生
         /actions/Studentdelete">删除学生

         不过,一定要遵守"约定优于配置"的原则

         /actions/Teacher_add">添加老师
         /actions/Teacher_delete">删除老师
         /actions/Course_add">添加课程
         /actions/Course_delete">删除课程
    

相应的jsp页面有:
Course_add_seccess.jsp
Course_delete_success.jsp
Teacher_add_seccess.jsp
Teacher_delete_success.jsp
Studentadd_success.jsp
Studentdelete_success.jsp

总结

在日后的工作中,使用这样的技巧来重构代码,会带来很多好处,比如配置代码更加精简了,更加容易管理和维护了,更加容易读懂了等等。如果你说你不想用这些东西,那也好,至少你需要知道有这么个东西的存在,好让你去读懂别人写的代码。

[struts2中action的通配符]Struts2中Action的通配符使用方法

http://m.bbyears.com/flash/105177.html

推荐访问:struts2 action
相关阅读 猜你喜欢
本类排行 本类最新