struts2的初始化主线
struts2的初始化主线发生在web应用程序启动之初,由入口程序的init方法驱动执行完成:
仅在web应用启动时执行一次——这条主线由Filter中的init方法驱动执行,执行完毕后,该主线结束
init方法的执行失败将导致整个web应用启动失败——如果在init方法执行的过程中发生异常,整个web应用将无法启动。
struts2的http请求处理主线
struts2的http请求处理主线是struts2的核心主线,包含了struts2处理http请求、进行必要的数据处理和处理数据返回的全部过程。这条主线将在任何满足web.xml中所指定的URL Pattern的http请求发生时进行响应,由doFilter方法负责驱动执行。该主线又可以划分成两个不同的执行阶段:
第一阶段——http请求预处理
在这个阶段中,程序执行的控制权在struts2手上。这个阶段的主要工作是针对每个http请求进行预处理,为真正的业务逻辑执行做必要的数据环境和运行环境的准备。
程序代码在这个阶段有一个非常显著的特点:依赖于web容器,并时时刻刻将与web容器打交道作为主要工作。
第二阶段——XWork执行业务逻辑
在这个阶段,程序执行的控制权被移交给了XWork。struts2在完成http请求的预处理后,将http请求中的数据封装成普通的java对象,并由XWork负责执行具体的业务逻辑。
程序代码在这个阶段的特点和第一阶段完全相反:不依赖于web容器,完全由XWork框架驱动整个执行的过程。
从struts2对于http请求的处理过程中,我们可以看出struts2的核心设计理念在于解耦。所谓解耦,实际上是尽可能地消除核心程序对外部运行环境的依赖,从而保证核心程序能够更加专注于应用程序的逻辑本身。在struts2中,我们所说的外部运行环境就是web容器。
在解耦方面,struts2也确实做到了2个不同的层面,从而使整个设计更加凸显出其优秀之处 :
从代码上进行物理解耦——struts2将第一阶段的代码整合到struts2-core.jar,而将第二阶段中的代码整合到xwork-core.jar
将逻辑分配到不同的执行阶段——struts2将处理数据的逻辑和处理业务的逻辑分配到2个不同的执行阶段,使得我们对于代码逻辑的关注点更为清晰
总结
因此,严格意义上的struts2,实际上由2个不同的框架所组成。一个是真正意义上的struts2,另外一个是XWork。从职务上来说,XWork才是真正实现MVC的框架,struts2的工作是在对http请求进行一定处理后,委托XWork完成真正的逻辑处理。将web容器和MVC实现分离,是struts2区别去其他web框架的最重要的特性,也是最值得我们品味的一个宏观设计思路。
参考:整理归纳自《struts2技术内幕——深入解析struts2架构设计与实现原理》