struts学习---ActionSservlet(1)
在介绍struts的时候已经提到过struts是实现了MVC模式的应用框架.前一段时间我把又把struts
方面的资料翻了出来通读了一遍,对struts的控制器颇有感受,所以我想把自己对struts的控制器方面的一些理解与大家一同分享.
首先需要解释的是struts的控制器部分仍然是用servlet实现的.struts框架中默认的中心servlet是org.apache.struts.action.ActionServlet类.一般情况下ActionServlet类可以满足应用的需求,当然特殊情况下,你也可以使用自定义的中心servlet替代ActionServlet.
web容器会在首次启动或struts应用的第一个请求到达时加载ActionServlet.ActionServlet在第一次被加载后,其init()方法被调用以执行必要的初始化工作.为了让大家充分理解struts的控制流程我将简单的描述一下init()方法做了哪些工作.(这对于想深入理解struts的人来说也是有必要的)
ActionServlet的init()方法所执行的操作:
(1).通过调用initInternal()方法,初始化框架包的内部消息资源.
(2).通过调用initOther()方法,从web.xml文件中加载控制着ActionServlet类不同行为的初始化参数,例如:config,debug,detail等.
(3).通过调用initServlet()方法,从web.xml文件中加载并初始化ActionServlet的映射信息.在这里ActionServlet类作为中心Servlet,将所有的请求信息映射到ActionServlet.
(4).调用initModuleConfig()方法,加载并初始化默认应用模块的struts配置数据,这些数据是配置初始化参数指定的.默认的ModuleConfig对象被创建并存储在应用上下文环ServletContext中.
(5).调用initModuleMessageResources()方法,根据每个消息资源元素指定的键属性,在默认应用模块的struts配置文件中指定的消息资源都将被加载初始化并存储在应用上下文环境ServletContext中,如果没有明确指定,存储到ServletContext中的消息资源的键值未org.apache.struts.action.MESSAGE.应为键值是唯一的所以只有一个消息资源被当作默认值存储.
(6).调用initModuleDateSource(),加载并初始化在struts文件申明的每个数据源,如果没有在配置文件中指定数据源,这一步将跳过.
(7).调用initModulePlugins()方法,加载并初始化在配置文件中指定的插件,每个插件调用各自的init()方法初始化.
(8).当默认的应用模块正确初始化后,如果有其他子应用模块,则对每个模块都重复(4)-(7)的操作分别进行初始化.
到此ActionServlet的init()方法所执行的操作就已经全部完成了.不过这只是刚刚开始,AcionServlet所做的工作还有很多.理解ActionServlet的最好方法就是查看它的源码,应为仅仅参考一些资料上的文字介绍是不够的,但又是有必要的.
下面我就简单介绍一下ActionServlet在接受到请求后是怎样扮演一个控制器身份的.
首先检索和用户请求匹配的ActionMapping实例,如果不存在,就返回用户请求路径无效的错误(ActionMapping会在以后专门介绍),如果ActionForm配置了form,则获取相应范围内的ActionForm实例,如果不存在ActionForm实例,就创建一个ActionForm实例,并将表单中的数据存放在ActionForm对象中.下一步根据ActionMapping配置信息决定是否要验证表单,ActionServlet根据ActionMapping实例包含的映射信息决定将请求转发给哪个Action,如果该Action实例不存在则创建一个Action,然后调用该Action实例的execute()方法,ActionServlet根据返回的ActionForword对象转发到指向的组建,通常是一个jsp或其他的Action.
下次将会介绍ActionServlet的详细工作过程,并结合自己的理解对ActionServlet做一个剖析.
推荐文章 |
