Struts 2
Struts 2是基于MVC模式的Web框架,主要包括控制器组件==>C(包括核心控制器StrutsPrepareAndExecuteFilter、业务控制器Action)、模型组件==>M(包括业务逻辑组件和数据库访问组件)和视图组件==>V。
模型组件==>M:主要是由JavaBean或者是EJB(Enterprise JavaBean)组成。
视图组件==>V:主要是由html、jsp、Struts2标签等视图技术。
控制器组件==>C:主要是由核心控制器和业务控制器组成。
核心控制器:过滤器类StrutsPrepareAndExecuteFilter称为Struts2的核心控制器;
业务控制器:业务控制器Action,负责处理业务特定请求的类。
Struts 2的架构:
(1)StrutsPrepareAndExecuteFilter是Struts 2的核心控制器,根据ActionMapper的结果来决定是否处理请求,如果ActionMapper指出该URL应该被Struts 2处理,那么就执行Action处理,并停止过滤器链上还没执行的过滤器。
(2)ActionMapper提供了http请求与Action执行之间的映射,即ActionMapper判断请求是否应该被Struts 2处理,若需要,则ActionMapper需要返回一个对象来描述对应的ActionInvocation的信息。
(3)ActionProxy是一个特别的中间层,位于Action与xwork之间,可以根据需求来引入更多的实现方式,如WebService来实现等。
(4)ConfigurationManager 是xwork配置的管理中心,可以理解为struts.xml配置文件在内存中的对应。
(5)struts.xml是Struts 2的应用配置文件,负责URl与Action之间映射的配置,以及执行后页面跳转的Result配置等。
(6)ActionInvocation:调用并执行Action,它拥有一个Action实例和这个Action所依赖的拦截器实例。actionInvocation执行拦截器链、Action及相应的Result.
(7)Interceptor(拦截器):自动拦截Action,提供了再Action运行之前或在Result运行之后可能需要执行的某些功能代码。类似于javax.servlet.Filter。
(8)Action:是执行Struts 2中的动作执行单元,用来处理用户请求,并封装业务所需要的数据。
(9)Result:是不同视图类型的抽象封装类型,不同的视图类型会对应不同的Result实现,Struts 2中支持多种视图类型,如jsp、FreeMarker等.
(10)Templates:各种视图类型的页面模板,如jsp页面。
(11)TagSubSystem:Struts 2 的标签库,它抽象了3种不同的视图技术:jsp、velocity和freemarker,可以再不同的视图技术中直接使用这些标签。
Struts 2的工作流程:
Struts 2框架的核心控制器负责拦截由<url-pattern>/*</url-pattern>指定的所有用户请求,当用户请求到达时,该Filter会过滤用户的请求。当请求转入Struts 2框架处理时会先经过一系列的拦截器,然后再转到Action。Struts 2对用户的每一次请求都会创建一个Action并运行,根据其返回值,按照Result配置信息,跳转到新的服务(进入视图或Action)。
流程:
(1)用户发送请求给核心控制器StrutsPrepareAndExecuteFilter。
(2)StrutsPrepareAndExecuteFilter询问ActionMapper,是否是一个Struts 2的请求(是否返回一个非空的ActionMapper对象)。
(3)若ActionMapper认为该请求是Struts 2请求,那么让核心控制器StrutsPrepareAndExecuteFilter将请求转交给ActionProxy处理。
(4)ActionProxy通过Configuration Manager 询问框架的配置文件,确定需要调用Action类及Action方法。
(5)ActionProxy创建一个Configuration的实例,进行初始化。
(6)ActionInvocation实例在调用Action的过程前后,涉及相关拦截器(Interpretor)的调用。
(7)Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到相应的返回结果。调用结果的execute方法(或者配置指定的方法),渲染结果。
(8)执行各个拦截器invocation.invoke()之后的代码。
(9)把结果发送到客户端。