struts1源码分析(一)整体概览和核心组件
下面详细说明这几个核心组件类的作用。
1) ActionServlet
ActionServlet是整个Struts框架的入口,它继承HttpServlet类, 有两个重要职责:
1. 框架的初始化
初始化包括读取配置文件,完成各个组件和外部资源初始化等工作。 由于本身是一个servlet,这些工作都放在init()方法中完成,并只会运行一次。
2. 所有请求的入口
ActionServlet重载了doGet()和doPost()方法,负责完成对Http请求的处理。
ActionServlet承担了框架初始化和请求处理这两条主线的职责,而这两条主线的划分依据是以Servlet对象不同方法的生命周期,其他MVC框架也不例外,这正说明了Servlet规范是所有MVC框架的核心基础。一般情况下,在web.xml中配置ActionServlet,并将所有请求映射到该Servlet, 通过这种方式引入Struts框架。
?
2) RequestProcessor
Http请求的实际处理类。ActionServlet定义了请求处理入口,最终委托给RequestProcessor类进行处理。RequestProcessor将调用其他组件(ActionMapping/ActionForm/ActionForward/Action等)对请求进行处理,并返回处理结果。
?
3) Action
业务逻辑接口类, 使用者只需要遵循该接口来开发业务逻辑,不必关注框架的背后实现。Action类起到了适配器的作用,将 HttpServletRequest
转换为业务逻辑。这里看一下Action的请求处理接口声明:
?
?1. 用户在客户端发起请求,容器接收请求并交由ActionServlet处理(通过web.xml配置)。
2. ActionServlet在初始化时读取配置文件struts-config.xml, 完成各组件的初始化。ActionServlet将请求转交由RequestProcessor处理。
3.RequestProcessor根据请求路径信息,获取当前路径对应的ActionMapping对象,从ActionMapping中获取对应的ActionForm和Action配置。
4. RequestProcessor从请求中提取数据,生成并填充ActionForm对象。
5. RequestProcessor调用Action,开始业务逻辑调用。
6. Action从ActionForm中读取数据,完成请求数据读取和验证。
7. Action调用JavaBean,完成业务逻辑调用。
8. Action执行完毕后,返回ActionForward,交由RequestProcessor继续处理。
9. RequestProcessor依据Action返回结果将请求转发给用于展示的JSP页面。
10. JSP页面调用JavaBean填充页面展示时需要的数据。
11. 容器将请求处理结果返回给客户端。
?
?四、小结
本文概要介绍了Struts1涉及的几个核心组件类,通过例子说明这些组件类在请求处理过程中的作用。从今天角度看,Struts1在设计上有很多问题(如对servlet接口和框架的耦合等),但在当时背景下它是对MVC和Model2的一个有力的诠释。框架在不停的变化,背后的那些思想是我们需要仔细品味的。理解Struts1背后的故事,可以帮助我们更好的理解MVC框架的发展历程,以及为什么Struts2/Spring MVC等新的MVC框架能取而代之。后续将从初始化和请求处理两条主线来分析框架背后的实现。
?