深入详解Struts2——架构剖析

在struts2中,拦截器是一个重要的概念。拦截器可以在Action被调用之前和之后执行代码。Struts2框架的大多数核心功能都是作为拦截器来实现的。像累心转换、对象组装、验证、避免表单重复提交、文件上传都是在拦截器帮助下实现的。
下面看一下Struts2和Xwork2之间的交互图:
深入详解Struts2——架构剖析_第1张图片
一个Http请求到达Struts2的FilterDispatcher之后,就会被转换成一个action command,这个action command在穿越了一系列Struts2和XWork的拦截器(1~3)之后,最火执行用户编写的action实例。在action执行之后,响应还会穿越相同的拦截器(按照与请求相反的顺序)最后通过Struts2的HttpServletResponse转换成Web可识别的相应,例如jsp。
下面看一下Struts2的体系结构:
深入详解Struts2——架构剖析_第2张图片
当一个初始的请求到达Servlet容器(例如tomcat或resin)后,将被传递给一个标准的过滤器链。这个过滤器链包括了可选的ActionContextCleanUp过滤器,当你在Struts2 Web应用程序中集成SiteMesh时,将会用到这个过滤器。
如果ActionMapper确定了一个Action应该被调用,那么FilterDispatcher就把控制权委派给ActionProxy,ActionProxy询问框架的配置文件管理器。接下来,ActionProxy创建一个实现了命令模式的ActionInvocation。ActionInvocation在调用action之前会依次调用所有配置的拦截器。
一旦action执行返回,ActionInvocation就要查找这个action的结果码所对应的result,然后执行这个result。
下面我们介绍一下Struts2框架组成部分
1、ActionMapper和ActionMapping
org.apache.struts.dispatcher.mapper.ActionMapper接口在HTTP请求和action调用请求之间提供了一个映射。当给定一个HTTP请求时,ActionMapper根据请求的URI来查找是否有对应的action调用,如果有,则返回一个描述了action调用的ActionMapping,如果没有找到匹配的action调用请求,则返回null。
Struts2框架对该接口提供的默认实现是org.apache.struts2.dispatcher.mapper.DefaultActionMapper
ActionMapper本质上是一个数据传输对象。它将Action类和要执行的方法的详细资料收集在一起。ActionMapping由org.apache.struts2.dispathcher.Dispatcher和各种用户接口组件使用。
ActionMapping的完整类名是org.apache.struts2.dispatcher.mapper.ActionMapping
2、ActionProxy和ActionInvocation
ActionProxy在XWork和真正的action之间充当代理的角色,在通过框架执行action的过程中,因为是使用代理而不是直接操纵对象,所以可以在代理中封装拦截器、result等的额外代码。
ActionProxy持有ActionInvocation对象。ActionInvocation代表了action执行的当前状态。他持有拦截器、action实例、结果映射和ActionContext
Struts2框架对ActionProxy接口提供的默认实现是org.apache.struts2.impl.StrutsActionProxy,这个类从com.opensymphony.xwork2.DefaultActionProxy类继承。
Strut2框架对ActionInvocation接口提供的默认实现是com.opensymphony.xwork2.DefaultActionInvocation.
3、ActionContext
ActionContext是action执行的上下文。每一个上下文都相当于一个action执行所需的一组对象的容器,例如session、application、parameters、locale等。
ActionContext包含了大量执行期间有用的环境信息。ActionContext是线程本地的,这意味着在ActionContext中存储的值对应每个线程都是唯一的。所以对于某一个action,如果要从ActionContext中获取数据,不需要担心线程安全问题。
4、ObjectFactory
com.opensymphony.xwork2.ObjectFactory负责构建核心的框架对象(拦截器、action、result等)用户可以注册自己的ObjectFactory实现来控制这些对象的实例化。
5、result
com.opensymphony.xwork2.Result接口代表action执行后的结果。每一个action执行都返回一个String类型的结果码,用于从配置的result元素列表中选择对应的result。Result接口的不同实现代表了不同类型的结果输出,struts2框架提供的result实现包括了Servlet转发、Servlet重定向、Velocity模板输出、JasperReports(可生成PDF、CSV、XML等)

你可能感兴趣的:(Struts2)