Struts2的通配符配置方式

Struts2的通配符配置方式

Struts2的Action类很有意思,你可以使用3种方式来实现具体的Action类:

  1. 让你的Action类继承自ActionSupport类(项目中最常用这种方式,因为ActionSupport类中定义了很多帮助方法)
  2. 让你的Action类实现Action接口
  3. 使用POJO的方式来实现,只要Action类中有一个返回值为String的execute方法就好了(这种方式使Action类最容易被测试)

以上三种Action的实现方式都可以被struts2框架自动识别,如果你在struts.xml里面配置了一个action块但是没有配置action类的路径,这样框架默认使用ActionSupport来处理请求。

但是在实际使用struts2的过程中我发现了一个问题,一个Action只有一个execute方法来处理一类请求,如果我开发的某块功能有100个不同的请求那我岂不是要写100个Action类,每个类实现一个execute方法,这样虽然满足了一个类一个责任的设计原则,但是会不会造成“类爆炸”?后来看了struts2的文档才知道,其实我们可以使用struts2灵活的通配符配置来达到减少action类的目的:

先来看看一个简单的时序图

www.zeeklog.com  - Struts2的通配符配置方式

请求从这个页面发起,只是简单的两个链接

www.zeeklog.com  - Struts2的通配符配置方式
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<a href="infoadd">ADD INFO</a><br>
<a href="infodel">DEL INFO</a><br>
</body>
</html>
www.zeeklog.com  - Struts2的通配符配置方式

请求的控制转发是在struts.xml里面配置的

www.zeeklog.com  - Struts2的通配符配置方式
<struts>
    <constant name="struts.enable.DynamicMethodInvocation" value="true" />
    <package name="mypack" extends="struts-default">
        <action name="info*" class="com.stone.struts2.action.MyFirstAction" method="{1}">
            <result>/{1}info.jsp</result>
            <allowed-methods>add,del</allowed-methods>
        </action>
    </package>
</struts>

注:add,del是 方法名,也是jsp名称前缀,必须创建addinfor.jsp和delinfo.jsp文件,

@Component
@Scope(value="prototype")
public class MyFirstAction extends ActionSupport {
   
       private  Connection conn = null;
        private  PreparedStatement pstmt = null;
        private  ResultSet  rs = null;
       
       
        private String username;
        public String getUsername(){
            return username;
        }

public void setUsername(String username){
            this.username = username;
        }


   
    public String addd() {
        getUsername();
        int num = queryCount();
        System.out.println("MyFirstActionaddrutsaaaaaaaaaa_______________________________====="+num);
        ActionContext.getContext().getSession().put("list", "威锋网"+num+username);
       
        return SUCCESS;
    }
   
    public String del() {
        return SUCCESS;
    }
   
}

www.zeeklog.com  - Struts2的通配符配置方式

上面这个XML的配置内容有几点需要注意:

  1. 我开启了struts2的RMI,apache struts基于安全性考虑,RMI默认是关闭的。
  2. 大家看到action name的值跟平常有点不一样,我使用了星号通配符用来匹配JSP中的两个链接:infoadd和infodel, 要配置method="{1}", 这样要被调用的method名字就分别是add和del了。
  3. result的JSP页面的名字也可以用通配符来配置,我分别定义了两个JSP,addinfo.jsp和delinfo.jsp,这样正好一一对应。
  4. 注意在struts2.5之后,基于安全性考虑struts2默认开启了SMI,必须显示定义Action中能被请求调用的方法,所以我有配置<allowed-methods>

看看这个Action类

www.zeeklog.com  - Struts2的通配符配置方式
public class MyFirstAction extends ActionSupport {
    
    public String add() {
        return SUCCESS;
    }
    
    public String del() {
        return SUCCESS;
    }
}