目前有很多MVC框架,其中Struts2是一个被广泛使用的开源框架。但是,它的前身并不是Struts1,而是另一个优秀的开源框架WebWork,Struts2综合了Struts1和WebWork两大框架的优点。其全新的Struts 2的体系结构与Struts 1的体系结构的差别巨大。Struts 2以WebWork为核心,采用拦截器的机制来处理用户的请求,这样的设计也使得业务逻辑控制器能够与Servlet API完全脱离开,所以Struts 2可以理解为WebWork的更新产品。虽然从Struts 1到Struts 2有着太大的变化,但是相对于WebWork,Struts 2只有很小的变化。目前,Struts已经分化成了两个框架:第一个是在传统的Struts1的基础上,融合了另外的一个优秀的Web框架WebWork的Struts2。Struts2虽然是在Struts1的基础上发展起来的,但是实质上是以WebWork为核心的。Struts2为传统的Struts1注入了WebWork的先进的设计理念,统一了Struts1和WebWork两个框架。Struts1分化出来的另外一个框架是Shale。这个框架远远超出了Struts1原有的设计思想,与原有的Struts1关联很少,使用了全新的设计思想。Shale更像一个新的框架而不是Struts1的升级。
下面看一下Struts2的工作原理图:
结合这个工作原理图,我们说一下具体的工作流程。
(1)客户端向服务器端提交请求,服务器端容器初始化HttpServletRequest请求对象。
(2)请求对象被一系列的Servlet过滤器过滤。Struts 2中的过滤器有三种:
①ActionContextCleanUp过滤器:是一个可选的过滤器,主要用来集成其他的框架。
②其他插件的核心过滤器:如SiteMesh插件的过滤器。
③FilterDispatcher过滤器,是Struts 2API中提供的过滤器,必须使用。
(3)FilterDispatcher过滤器调用ActionMapper,决定该请求是否需要调用某个Action。
(4)如果请求需要调用某个Action,ActionMapper将通知FilterDispatcher过滤器把请求的处理交给ActionProxy来处理。
(5)ActionProxy通过Configuration Manager解析框架的配置文件struts.xml,找到需要调用的Action类。
(6)ActionProxy将创建一个ActionInvocation实例。
(7)ActionInvocation实例使用命令模式回调Action中的excute方法,Action调用业务逻辑类完成业务逻辑。在调用Action的前后,将调用该Action涉及到的相关拦截器(Interceptor)。
(8)Action执行完毕后,ActionInvocation根据struts.xml中的配置找到对应的返回结果(Result),通常是JSP,FreeMaker等模板文件。