Struts2的工做原理

Struts2的工做原理

                       

上图来源于Struts2官方站点,是Struts 2 的总体结构。html



一个请求在Struts2框架中的处理大概分为如下几个步骤(可查看源码:https://github.com/apache/struts):
1 客户端初始化一个指向Servlet容器(例如Tomcat)的请求
2 这个请求通过一系列的过滤器(Filter)(这些过滤器中有一个叫作ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其余框架的集成颇有帮助,例如:SiteMesh Plugin) 
3 接着FilterDispatcher(现已过期)被调用,FilterDispatcher询问ActionMapper来决定这个请是否须要调用某个Action 
4 若是ActionMapper决定须要调用某个Action,FilterDispatcher把请求的处理交给ActionProxy 
5 ActionProxy经过Configuration Manager询问框架的配置文件,找到须要调用的Action类 
6 ActionProxy建立一个ActionInvocation的实例。
7 ActionInvocation实例使用命名模式来调用,在调用Action的过程先后,涉及到相关拦截器(Intercepter)的调用。 
8 一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。返回结果一般是(但不老是,也可 能是另外的一个Action链)一个须要被表示的JSP或者FreeMarker的模版。在表示的过程当中可使用Struts2 框架中继承的标签。在这个过程当中须要涉及到ActionMapper

在上述过程当中全部的对象(Action,Results,Interceptors,等)都是经过ObjectFactory来建立的。java

 

Struts开源架构很好的实现了MVC模式,MVC即Model-View-Controller的缩写,是一种经常使用的设计模式。MVC 减弱了业务逻辑接口和数据接口之间的耦合,以及让视图层更富于变化。MVC的工做原理,以下图1所示:mysql

                       

Struts 是MVC的一种实现,它将 Servlet和 JSP 标记(属于 J2EE 规范)用做实现的一部分。Struts继承了MVC的各项特性,并根据J2EE的特色,作了相应的变化与扩展。下面是Struts实现MVC的原理。以下图2所示:git

 

控制:经过图2你们能够看到有一个XML文件Struts-config.xml,与之相关联的是Controller, ,它能够称做为Struts神经中枢。github

       视图:主要由JSP生成页面完成视图,Struts提供丰富的JSP 标签库: Html,Bean,Logic,Template等,这有利于分开在Struts中,承担MVC中Controller角色的是一个Servlet,叫ActionServlet。ActionServlet是一个通用的控制组件。这个控制组件提供了处理全部发送到Struts的HTTP请求的入口点。它截取和分发这些请求到相应的动做类(这些动做类都是Action类的子类)。另外控制组件也负责用相应的请求参数填充 Action From(一般称之为FromBean),并传给动做类(一般称之为ActionBean)。动做类实现核心商业逻辑,它能够访问Java bean 或调用EJB。最后动做类把控制权传给后续的JSP 文件,后者生成视图。全部这些控制逻辑利用Struts-config.xml文件来配置。表现逻辑和程序逻辑。sql

       模型:模型以一个或多个Java bean的形式存在。这些bean分为三类:Action Form、Action、JavaBean or EJB。Action Form一般称之为FormBean,封装了来自于Client的用户请求信息,如表单信息。Action一般称之为ActionBean,获取从ActionSevlet传来的FormBean,取出FormBean中的相关信息,并作出相关的处理,通常是调用Java Bean或EJB等。数据库

       流程:在Struts中,用户的请求通常以*.do做为请求服务名,全部的*.do请求均被指向ActionSevlet,ActionSevlet根据Struts-config.xml中的配置信息,将用户请求封装成一个指定名称的FormBean,并将此FormBean传至指定名称的ActionBean,由ActionBean完成相应的业务操做,如文件操做,数据库操做等。每个*.do均有对应的FormBean名称和ActionBean名称,这些在Struts-config.xml中配置。apache

 

       核心:Struts的核心是ActionSevlet,ActionSevlet的核心是Struts-config.xml。设计模式