了解一个框架,必须得深刻理解其内部执行流程,也就是所谓的工作原理,对于struts来说,了解它的工作流程尤为重要
首先有一个图可以大致展现这些流程的关联
1.视图:采用JSP页面;(就是JSP文件)
2.控制器:采用Java Servlet,负责视图与模型之间的交互;(就是struts-config.xml文件)
控制器的每个入口点都由名为struts-config.xml的配置文件设置,该文件把来自视图的请求映射为特定的Java类以进行处理,控制器还可以指定下一个视图的位置;
3.模型:采用JavaBean, (就是java文件)
例如:FormBean用来存储来自视图请求的表单信息;
ActionBean用来处理表单信息,实现业务处理逻辑功能;
具体执行流程
1. 读取配置(初始化ModuleConfig对象)
采用Struts框架的Web应用,在Web应用启动时就会加载并初始化ActionServlet,在ActionServlet初始化ModuleConfig的时候,调用initModuleConfigFactory()初始化配置工厂,然后由配置工厂通过initModuleConfig("", config)获得ModuleConfig对象。
通过ModuleConfig对象调用下列方法去初始化相关模块。
initModuleMessageResources(moduleConfig);
initModuleDataSources(moduleConfig);
initModulePlugIns(moduleConfig);
这些方法的功能就是:容器在加载Struts应用程序时,会先加载web.xml中与Struts相关的一些配置参数,找到struts-config.xml文件,然后通过循环来读取此文件和解析里面的内容,并初始化相关对象。
2. 用户请求
用户提交表单或调用url向Web应用程序服务器提交一个请求,请求的数据用HTTP协议上传给Web服务器。
3. 填充FormBean
填充FormBean的过程包括实例化、复位、填充数据、校验、保存等操作。根据*.do请求从ActionConfig中找出对应该请求的Action子类,如有对应的Action且这个Action有一个相应的ActionForm,则ActionForm被实例化并用HTTP请求的数据填充其属性,并保存在ServletContext中,这样它们就可以被其他Action对象或JSP调用。如果没有对应的Action,控制器则直接转发给JSP或静态页面。
4. 转发请求
控制器根据配置信息ActionConfig将请求派发到具体的Action,与请求相应的FormBean将一并传给这个Action对象。
5. 处理业务
Action一般只包含一个execute()方法,它负责执行相应的业务逻辑。执行完毕后返回一个ActionForward对象,控制器通过该ActionForward对象进行转发工作。
6. 返回响应
Action根据业务处理的不同结果返回一个响应对象给总控制器,该目标响应对象对应一个具体的JSP页面或另一个Action。
7. 查找响应
总控制器根据业务功能Action返回的目标响应对象找到对应的资源对象,通常是一个具体的JSP页面。
8. 响应用户
目标响应对象将结果展现给用户目标响应对象,即具体的JSP页面,这样客户就得到响应的结果。
这里只是从使用Struts的角度对它的工作原理作了分析,在后面的章节中还会深入分析ActionMapping对象、ActionForm对象及Action对象的初始化过程。下面通过一个示例来加深对Struts工作原理的理解。