现在的位置: 首页 > 综合 > 正文

Struts2架构剖析

2018年06月05日 ⁄ 综合 ⁄ 共 2651字 ⁄ 字号 评论关闭

在讲解Struts2之前我们先来看看webwork,在讲解webwork之前我们还得提到另外一个框架,那就是Xwork。

Xwork概况

Xwork是一个标准的Command模式实现,并且完全从web层脱离出来。Xwork提供了很多核心功能:前端拦截器(interceptor),运行表单属性验证 ,类型转换,强大的表达式语言(OGNL-the Object Graph NavigationLanguage),IOC(Inversion of Control控制反转)容器等。

其目的就是:创建一个泛化的、可重用的扩展命令模式框架,而不是一个特定在某个领域使用的框架。

Xwork的特点:

1.基于一个简单的接口就可以进行灵活且可自定义的配置。

2.核心命令模式框架可以通过定制和扩展拦截器来适应任何请求/相应环境。

3.整个框架通过类型转换和使用OGNL的action属性验证来构建。

4.包含一个基于运行时Attribute和验证拦截器的强大的验证框架。

Xwork和webwork的关系:

Webwork2被构建在Xwork之上,以Xwork为基础。通过使用Xwork的命令模式框架和拦截器框架,提供了一个支持web功能、能快速构建web应用的命令模式框架。

总而言之:无论是struts2还是webwork底层都是Xwork。

在处理请求时,webwork和Xwork的交互图如下:

WebWork的数据流图:

从图中我们可以看出有一个有一个关键xwork.xml文件,另外我们还可以看到拦截器执行之后,还要原路返回执行。

Struts2的处理流程:

1.当用户发送请求,进入Struts PrepareAndExecuteFilter(是struts2框架的核心控制器,它负责拦截由<url-pattern>/*</url-pattern>指定所有用户的请求,当用户请求到达时,该过滤器会过滤用户的请求)。

2.接着进入:Interceptor(Struts2内置的一些拦截器或用户自定义拦截器)。

3.接着进入:Action(用户编写的action类,与struts1不同,struts2对用户的每一个请求都会创建一个Action,所以是线程安全的)

4.接着进入:Result(获取转发页面),进入转发的页面,解析相应给客户端。

与WebWork2相同,Struts2框架也是由两部分组成:xwork和Struts2。

Xwork框架的核心概念包括action,拦截器(interceptor)和result。

Struts2拦截器的工作原理:

从图中可以看出拦截器执行后,会反向再执行一次。

Struts2和Xwork之间的交互图:

Struts2与XWork之间的交互:

1.一个Http请求到达Struts2的FilterDispatcher之后,就会被转换成一个action command。

2.这个action command在穿越了一系列Struts2和Xwork的拦截器(图中1~3)之后,最终会执行用户编写的Action实例。

3.在Action执行之后,响应还会穿越相同的拦截器(图中3~1),按照与请求相反的顺序执行。

4.最后通过Struts2的HttpServletResponse转换成web可识别的响应,如JSP。

Struts2的数据流图:

Struts2的数据流程:

1:当接收到一个HttpRequest,Interceptor做一些拦截或者初始化的工作。

2:当外部的HttpServletRequest到来时,初始到了Servlet容器传递给一个标准的过滤器链;ActionContextCleanUp(这个在继承插件方面非常有用)。Other filters(siteMesh,etc)。调用FilterDispatcher会去查找相应的ActionMapper。

3:如果找到了相应的ActionMapper它将会将控制权交给ActionProxy,ActionProxy将会通过ConfigurationManager来查找配置struts.xml。

4:下一步将会通过ActionInvocation来负责命令模式的实现(包括调用一些拦截器Interceptor框架在调用action之前),一旦action返回,会查找相应的Result,Result类型可以是JSP或者Freemark等。

5:这些组件和ActionMapper一起返回给请求的URL(注意拦截器的执行顺序),相应的返回是通过我们在web.xml中配置的过滤器。

6:如果ActionContextCleanUp是当前使用的,则Filterdispatcher将不会清理threadLocal ActionContext。

7:如果ActionContextCleanUp不使用,则会去清理threadLocal。

ActionMapper和ActionMapping的关系:

1:org.apache.struts2.dispathcer.mapper.ActionMapper接口在HTTP请求和action调用之间提供一个映射。

当给定一个HTTP请求时,ActionMapper根据请求的URL来查找是否有对应的action调用:

如果有,则返回一个描述action调用的ActionMapper;如果没有匹配的action调用请求,则返回null。

对ActionMapper接口的实现是org.apache.struts2.dispatcher.mapper.DefaultActionMapper 

2:org.apache.struts2.dispatcher.mapper.ActionMapping本质上是一个数据传输对象,它将Action类和要执行的方法的详细资料收集在一起。ActionMapping由org.apache.struts2.dispatcher.Dispatcher和用户各种接口组件使用。

ActionProxy和ActionInvocation的关系:

1:ActionProxy和XWork中和真正的Action充当代理的角色,在通过框架执行Action的过程中,因为是使用代理而不是直接操作对象,所以可以在代理中封装拦截器、result等额外代码。

2:ActionProxy持有ActionInvacation对象。ActionInvacation代表了action执行的当前状态。他持有拦截器(按顺序)、Action实例、结果映射。

抱歉!评论已关闭.