Struts2架构剖析
当一个HTTP请求到达Struts2的FilterDispatcher,就会被转化成action command.这个action command在穿越了一系列Struts2和XWork的拦截器之后,最后执行用户编写的Action类,在Action执行之后,响应还会穿越相同的拦截器(按照与请求相反的顺序),最后通过Struts2的HttpServletResponse转换成Web可识别的响应(如JSP)。
Struts2的体系结构,如下图所示:
当一个请求到达Servlet容器(Tomcate)后,将被传递给一个标准的过滤器链,在这个过滤器链中包括了可选的ActionContextCleanUp过滤器.当在Struts2 Web应用程序中集成SiteMesh时,才会用到此链。接下来,必须的FilterDispatcher被调用,它轮询ActonMapper(org.apache.struts2.dispatcher.mapper.ActionMapper),以便确认这个请求是否应该调用一个action。如果ActionMapper确定了一个请求应该被调用,那么FilterDispatcher就把控制权委派给ActionProxy(com.opensymphony.xwork2.ActionProxy),ActionProxy询问框架的配置文件管理器(它从struts.xml文件中读取配置信息),接下来,ActionProxy创建一个实现了命令模式的ActionInvocation,ActionInvocation在调用action之前会一次调用所有配置的连接器。一旦action执行返回,ActionInvocation就要struts.xml里面配置),然后执行这个result,通常情况下result会调用JSP或者freeMarker模板呈现页面(但不总是这样,result也可以是一个action链).
这里介绍一下Struts2框架的组成部分:
1.ActionMapper和ActionMapping:
org.apache.struts2.dispatcher.mapper.ActionMapper接口在HTTP请求和action调用请求之间提供了一个映射,当给定一个HTTP请求时,ActionMapper根据请求的URL来查找是否有对应的action调用。如果有则返回一个描述了action调用的
ActionMapping,如果没有找到匹配的action调用请求,则返回null;
Struts2框架对该接口提供的默认实现是org.apacher.struts2.disspatcher.mapper.
DefaultActionMapper.
ActionMapping本质上是一个数据传输对象,它将Action类和要执行的方法的详细资料收集在一起,ActionMapping由org.apache.struts2.dispatcher.Dispatcher和各种用户接口组合使用。
ActionMapping的完整类名是
org.apacher.struts2.dispatcher.mapper.ActionMapping.
2.ActionProxy&ActionInvocation
Action的一个代理,由ActionProxyFactory创建,它本身不包括Action实例,默认实现DefaultActionProxy是由ActionInvocation持有Action实例。ActionProxy作用是如何取得Action,无论是本地还是远程。而ActionInvocation的作用是如何执行Action,拦截器的功能就是在ActionInvocation中实现的。
ConfigurationProvider&Configuration
ConfigurationProvider就是Struts2中配置文件的解析器,Struts2中的配置文件主要是尤其实现类XmlConfigurationProvider及其子类
StrutsXmlConfigurationProvider来解析。
3.ActionContext
是action执行的上下文,每一个上下文都相当于一个action执行所需要的一组对象的容器,例如session,application,parameters,locale等.
ActionContext包含了大量执行期间有用的环境信息,这些信息由org.apacher.
struts2.dispatcher.Dispatcher类在创建ActionProxy前设置,
并封装到一个Map对象extraContext中,
Map<String, Object> extraContext = createContextMap(request,
response, mapping, context);
该对象随后被作为参数传递给ActionProxyFactory的createActionProxy()方法.
ActionProxy proxy = config.getContainer().getInstance(ActionProxyFactory.class).createActionProxy(
namespace, name, method, extraContext, true, false);
ActionContext是线程本地的,这就意味着在ActionContext中存储的值对于每个线程都是唯一的,所以对于某个Action,如果要从ActionContext中获取数据,不需要担心线程安全问题。
ActionContext是被存放在当前线程中的,获取ActionContext也是从ThreadLocal中获取的。所以在执行拦截器、 action和result的过程中,由于他们都是在一个线程中按照顺序执行的,所以可以可以在任意时候在ThreadLocal中获取 ActionContext。ActionContext包括了很多信息,比如Session、Application、Request、Locale、ValueStack等,其中 ValueStack可以解析ognl表达式,来动态后去一些值,同时可以给表达式提供对象。
ActionContext(com.opensymphony.xwork.ActionContext)是Action执行时的上下文,上下文可以看作是一个容器 (其实我们这里的容器就是一个Map而已),它存放的是Action在执行时需要用到的对象. 一般情况, 我们的ActionContext都是通过: ActionContext context = (ActionContext) actionContext.get(); 来获取的.我们再来看看这里的actionContext对象的创建:
static ThreadLocal actionContext = new ActionContextThreadLocal();
ActionContextThreadLocal是实现ThreadLocal的一个内部类.ThreadLocal可以命名为"线程局部变量",它为每一个使用该变量的线程都提供一个变量值的副本,使每一个线程都可以独立地改变自己的副本,而不会和其它线程的副本冲突.这样,我们 ActionContext里的属性只会在对应的当前请求线程中可见,从而保证它是线程安全的.通过ActionContext取得
HttpSession: Map session = ActionContext.getContext().getSession();
(通过Map模拟HttpServlet的对象,操作更方便)
ActionConext的完整类名是:org.opensymphony.xwork2.ActionContext.
4.result
com.opensymphony.xwork2.Result接口代表action执行后的结果。每一个action
执行都需要返回一个String类型的结果码,用于配置result元素列表中选择对应的result。result在struts.xml文件中进行配置。
Result接口的不同实现代表了不同类型的结果输出,Struts2框架提供的Result
实现包括了Servlet转发,Servlet重定向,Velocity模板输出,FreeMarker模板输出,
JasperReports(可生成PDF,CVS,XML等)和ActionChainResult(可用于从当前action
到其他action的链式处理)等.
Struts2框架的调用流程:
1>当Servlet容器接收到一个请求之后,将请求交给了在web.xml文件中配置的过滤器 FilterDispatcher,调用它的doFilter()方法。
2>FilterDispatcher询问ActionMapper,以便确认这个请求是否有对应的action调用.
3>ActionMapper返回一个描述了action调用的ActionMapping对象
4>FilterDispatcher调用Dispatcher类的serviceAction()方法。
5>FilterDispatcher调用ActionProxy的execute()方法。
6>ActionProxy设置ActionInvocation对象的执行上下文,然后调用其invoke()方法。
7>ActionInvocation的invoke()方法从拦截器映射中查找尚未执行的拦截器,调用它的intercepet(invocation)方法,并将自身对象的引用作为参数传递个拦截器。
8>拦截器完成某些预处理工作后,反过来调用ActionInvocation的invoke()方法,
ActionInvocation维护着自己的状态,所以它知道哪些拦截器已经被执行,如果还没有执行的拦截器,就继续执行它的intercept(invocation)方法。
9>如果所有的拦截器都已经执行过了,就调用action实例的execute()方法(如果在struts.xml文件中没有被设置成其它方法的话).
10>ActionInvocation根据action执行返回的结果码,查找对应的Result,调用result的execute(invocation),将结果页面呈现给用户.
11>ActionInvocation的invoke()方法将控制权返回给拦截器映射中的最后一个拦截器,该拦截器完成所有必须的后期处理工作,然后从intercepter(invocation)返回,允许前一个拦截器执行它自己的后处理工作。如此反复,直到所有的拦截器都成功返回。
12> ActionInvocation的invoke0方法执行完毕后,向ActionProxy返回一个String类型的结果码,最后ActionProxy清理状态并返回.
- 大小: 66.1 KB
分享到:
相关推荐
根据给定的文件信息,以下是对Struts2学习笔记中涉及的关键知识点的详细解析: ### Struts2框架概览 #### MVC模式的理解与演进 Struts2是基于MVC(Model-View-Controller)模式设计的一种Java Web开发框架。在MVC...
### Struts2学习笔记知识点概览 #### 一、环境搭建 **1.1 Struts2简介** - **Struts2概述**:Struts2是一个开源的MVC框架,它结合了Struts 1.x、WebWork和其他一些框架的优点。Struts2的主要目标是简化Web应用程序...
- **基于 Model2 设计模型**: Struts2 基于 Model2 架构模式,将业务逻辑、展示逻辑和控制逻辑分离,提高了代码的可维护性和可扩展性。 - **发展演变**: Struts2 结合了传统 Struts1 和 WebWork 两个经典框架的优点...
在探讨Struts2的学习心得之前,我们先来分析一下Struts2与Struts1之间的区别。 ##### 1.1 架构设计 - **Struts1**:采用MVC(Model-View-Controller)架构模式,其中控制器是由`ActionServlet`来实现的,该控制器...
### Struts2学习笔记 #### 一、Struts2配置文件详解 在深入理解Struts2框架之前,我们首先需要了解其核心配置文件——`struts.xml`。 **1. struts.xml配置** ```xml <!DOCTYPE struts PUBLIC "-//Apache ...
本笔记将深入探讨Struts2的核心概念、发展历程、使用方法以及与OGNL(Object-Graph Navigation Language)的结合应用。 **一、Struts2概述** 1.1 为什么要用Struts 在Java Web开发中,Struts2作为MVC框架,能够...
在本篇“Struts2学习笔记十一”中,我们将深入探讨Struts2的核心拦截器及其应用。 **1. 拦截器的概念** 拦截器是AOP(面向切面编程)的一部分,在Struts2中,它们作为一系列可插入的处理链,可以在Action执行前后...
Struts2是Java Web开发中的一款经典MVC框架,它为开发者提供了强大的控制层结构,使得Web应用的架构更加清晰,降低了代码耦合度。在本篇笔记中,我们将深入探讨Struts2的核心概念和使用方法。 **一、Struts2概述** ...
这个版本的学习笔记主要集中在 Struts 框架的核心概念、架构和实际应用上。在深入学习 Struts 1.3.8 时,我们需要了解以下几个关键知识点: 1. **MVC设计模式**:Struts 是 Model-View-Controller (MVC) 设计模式的...
本笔记将重点介绍Struts2的核心概念、配置、动作(Action)以及拦截器(Interceptor)。 一、Struts2核心概念 1. **Action类**:在Struts2中,业务逻辑通常封装在Action类中,它是处理用户请求的入口点。Action类...
标题中的“【张冰Struts2学习笔记】0103_Path与绝对路径”表明了这篇笔记主要讨论的是Struts2框架中关于Path和绝对路径的概念及其应用。Struts2是一个流行的Java Web开发框架,它提供了强大的MVC(模型-视图-控制器...
通过以上知识点的学习和实践,你可以更有效地利用Struts2开发高质量的Java Web应用。不过,随着Spring Boot和其他现代框架的兴起,开发者也应关注新技术的发展,以便选择最适合项目需求的工具。
### Struts2_Action 学习笔记与通配符配置详解 #### 一、Struts2简介及简单配置 Struts2是一个基于Java EE平台的开源Web应用框架,它继承了Struts1的优点,并在此基础上进行了大量的改进。Struts2的核心功能之一是...
四、实战:使用Struts2与ECharts实现动态图表 1. 引入ECharts库:在HTML页面中添加ECharts的JavaScript引用。 2. 创建Struts2 Action:编写一个Action类,实现数据获取和结果集转换。 3. 配置Action:在struts.xml中...
同时,阅读和分析Struts2的源码也有助于理解其内部工作原理。 总之,Struts2的输入验证功能强大且灵活,对于任何Java web开发者来说,熟练掌握这一部分知识都将大大提高开发效率和应用程序的安全性。无论是客户端...
### Struts 学习笔记 #### 一、Struts 是什么? 1. **定义与功能:** - **Struts** 是一个开源框架,用于构建基于 **MVC(Model-View-Controller)** 模式的 Web 应用。 - 它是 **Jakarta Project** 的一部分,...
### Struts 1.2 学习笔记:深入理解 Struts 工作流程 #### Struts 概述 Struts 是一个开源的 MVC(Model-View-Controller)框架,用于简化 Java Web 应用程序的开发。Struts 1.2 版本是基于 Servlet 的 MVC 实现,...
Struts2是一个流行的Java Web框架,它简化了MVC(模型-视图-控制器)架构的实现。在本文中,我们将深入探讨Struts2的工作原理和源码分析,以帮助理解其内在机制。 1. **Struts2架构图**: 当一个HTTP请求到达...