ActionServlet类是Struts框架的内置核心控制器组件,它继承了javax. servlet.http.HttpServlet类,Struts的启动一般从加载ActionServlet开始,因此它在MVC模型中扮演中央控制器的角色。
在具体实现时,它首先要判断Action对象是否存在,如果不存在则先创建该对象;在请求被接收后,控制器会将其传递给一个Action实例,这一过程同样会判断实例是否存在,如果不存在则需先创建该实例的execute()方法。
ActionServlet是一个标准的Servlet,在web.xml文件中配置,该Servlet用于拦截所有的HTTP请求。因此,应将Servlet配置成自启动Servlet,即为该Servlet配置load-on-startup属性
用户提交表单时,一个配置好的ActionForm对象被创建,并被填入表单相应的数据,ActionServlet根据Struts-config.xml文件配置好的设置决定是否需要表单验证,如果需要就调用ActionForm的Validate()验证后选择将请求发送到哪个Action,如果Action不存在,ActionServlet会先创建这个对象,然后调用Action的execute()方法。Execute()从ActionForm对象中获取数据,完成业务逻辑,返回一个ActionForward对象,ActionServlet再把客户请求转发给ActionForward对象指定的jsp组件,ActionForward对象指定的jsp生成动态的网页,返回给客户。
下面时Struts的三大主要组件
ActionServlet组件:充当Struts框架的中央控制器
RequestProcessor组件:充当每个子应用模块的请求处理器
Action组件:真正来处理一项具体的业务.
一. Struts的init()方法
Struts应用中只存在ActionServlet的一个实例,Servlet容器在启动时,或者用户首次请求ActionServlet时加载ActionServlet类.在这两种情况下,servlet容器都会在ActionServlet容器被加载后立即执行它的init()方法,这可以保证ActionServlet处理用户请求时已经被初始化
将各个子模块应用(除了默认的)的前缀存到一个字符数组中,并放到servletcontext中,对于默认的子应用模块,在appclication范围内存放他的MoudleConfig实例的key为“org.apache.struts.action.MODULE”,其他模块如/account,存放的key为org.apache.struts.action.MODULE/account,消息,数据源和插件等部分存在servletcontext的key和上述方法类似,不在说明.
二.ActionServlet的process方法
当ActionServlet接受到HTTP请求后,在doget()或doPost()方法中都会调用process()方法来处理请求.
三. 扩展ActionServlet类
从Struts1.1开始,为减轻ActionServlet的负担,多数功能已经移到RequestProcessor类中,所以基本不用扩展ActionServlet类
如果需要创建自己的ActionServlet,则可以创建一个它的子类.覆盖init()方法(或其他方法),可以写一些自己的操作,但要先调用super.init();
扩展完类后,还应该在web.xml文件中如下配置: