1、package配置
在struts2中,是通过包配置来管理Action和拦截器的。在包中可以配置多个Action和拦截器。在struts.xml中,包是通过<package>来配置的。包配置在struts.xml中的格式如下:<package name="包名" extends="包名">......</package>
常用属性:
(1)name:指定包名,是提供其它包继承时使用的属性,必选项。
(2)extends:指定要继承的包名,可选项。
(3)namespace:定义包的名称空间,可选项。
(4)abstract:指定该包是否是一个抽象包,如果该包是抽象包,包中不能定义Action
extends属性用来指定该包继承于其他包,其值必须是另一个包的名字。通过继承,子包可以继承父包配置的Action和拦截器。struts-default是struts2框架的默认包。
namespace指定包的名称空间,当子包继承父包,拥有了多个同名的Action时,不会出错。当访问namespace为xxx的包中的login.action时,地址应为localhost:8080/项目名/xxx/login.action,即在Action前加上名称空间。请求首先会在指定名称空间中找对应的Action,如果没有找到再到默认的名称空间中找Action,默认名称空间为空,即没有指定namespace值。
2、struts2的核心控制器FilterDispatcher
FilterDispatcher是struts2框架的核心控制器,该控制器作为一个过滤器运行在Java Web项目中,它负责拦截所有的用户请求,当用户请求到达时,该过滤器会过滤用户请求。如果用户请求以action结尾,该请求将被转入struts2框架处理。struts2框架获得了*.action请求后,将根据*.action请求的前面部分决定调用哪个业务控制器组件,例如,对于login.action请求,struts2调用名为login的Action来处理该请求。struts2项目中的Action都被配置在struts.xml文件中,在该文件中配置Action时,配置了该Action的name属性和class属性,其中name属性决定了该Action处理哪个用户请求,class属性指定了该Action的实现类。struts2用于处理用户请求的Action实例,并不是用户实现的业务控制器,而是Action代理,因为用户实现的业务控制器并没有与Servlet API耦合,显然无法处理用户请求。而struts2框架提供了一系列拦截器,该一系列拦截器负责将HttpServletRequest请求中的请求参数解析出来,传入到Action中,并通过Action的execute()方法来处理用户请求。
3、struts2的业务控制器Action
为了能够开发出更加规范的Action类,struts2提供了Action接口,该接口定义了struts2中Action类应遵循的规范。
public interface Action{
public static final String SUCCESS = "success";
public static final String NONE = "none";
public static final String ERROR = "error";
public static final String INPUT = "input";
public static final String LOGIN = "login";
public String execute() throws Exception;
}
ActionSupport类是struts2框架中默认的Action实现类,该类提供了许多默认的方法。在编写业务控制器时继承ActionSupport类,将会大大简化业务控制器类的开发。在struts.xml中配置Action时,如果没有指定class属性,系统自动使用ActionSupport类作为业务控制器。
4、Action实现类
struts2中的Action就是一个普通的Java类,该类不要求继承任何的struts2父类,或者实现任何struts2接口,但是为了简化项目开发,可以继承ActionSupport类。Action类通常包含一个execute()方法,该方法没有任何参数,返回值类型是字符串类型。那么struts2中的Action是如何获取用户HTTP请求中的参数值的?一般情况下,Struts中的Action会直接封装HTTP请求中的参数,所以通常情况下Action中会包含与HTTP请求参数对应的属性,并提供该属性的getter和setter方法。在Action类中,execute()方法和其他方法都可以使用该属性值获取HTTP请求中的参数。将HTTP请求中的参数值赋值给相应属性,这是由struts2中的拦截器调用相应的setter方法实现的。