struts2架框处理流程图
一、Struts2架框处理流程概序
请求首先通过Filter chain,Filter主要包括ActionContextCleanUp,它主要清理当前线程的ActionContext和 Dispatcher;FilterDispatcher主要通过AcionMapper来决定需要调用哪个Action。
ActionMapper取得了ActionMapping后,在Dispatcher的serviceAction方法里创建 ActionProxy,ActionProxy创建ActionInvocation,然后ActionInvocation调用 Interceptors,执行Action本身,创建Result并返回,当然,如果要在返回之前做些什么,可以实现 PreResultListener。
二、Struts2部分类介绍 (这部分从Struts2参考文档中翻译而来。)
1、ActionMapper
ActionMapper其实是HttpServletRequest和Action调用请求的一个映射,它屏蔽了Action对于Request等 java Servlet类的依赖。Struts2中它的默认实现类是DefaultActionMapper,ActionMapper很大的用处可以根据自己的需要来设计url格式,它自己也有Restful的实现,具体可以参考文档的docs\actionmapper.html。
2、ActionProxy&ActionInvocation
Action的一个代理,由ActionProxyFactory创建,它本身不包括Action实例,默认实现DefaultActionProxy 是由ActionInvocation持有Action实例。ActionProxy作用是如何取得Action,无论是本地还是远程。而 ActionInvocation的作用是如何执行Action,拦截器的功能就是在ActionInvocation中实现的。
3、ConfigurationProvider&Configuration
ConfigurationProvider就是Struts2中配置文件的解析器,Struts2中的配置文件主要是尤其实现类 XmlConfigurationProvider及其子类StrutsXmlConfigurationProvider来解析。
三、Struts2请求流程
1、客户端发送请求
2、请求先通过ActionContextCleanUp-->FilterDispatcher
3、FilterDispatcher通过ActionMapper来决定这个Request需要调用哪个Action
4、如果ActionMapper决定调用某个Action,FilterDispatcher把请求的处理交给ActionProxy,这儿已经转到它的Delegate--Dispatcher来执行
5、ActionProxy根据ActionMapping和ConfigurationManager找到需要调用的Action类
6、ActionProxy创建一个ActionInvocation的实例
7、ActionInvocation调用真正的Action,当然这涉及到相关拦截器的调用
8、Action执行完毕,ActionInvocation创建Result并返回,当然,如果要在返回之前做些什么,可以实现PreResultListener。添加PreResultListener可以在Interceptor中实现,不知道其它还有什么方式?
四、Struts2(2.1.2)部分源码阅读
从org.apache.struts2.dispatcher.FilterDispatcher开始
/**
* Initializes the filter by creating a default dispatcher
* and setting the default packages for static resources.
*
* @param filterConfig The filter configuration
*/
public void init(FilterConfig filterConfig) throws ServletException {
try {
this.filterConfig = filterConfig;
//初始化日志工厂
initLogging();
//将Filter的配置中的所有属性都写入一个HashMap,并作为参数传递给Dispatcher的构造函数。
dispatcher = createDispatcher(filterConfig);
dispatcher.init();
dispatcher.getContainer().inject(this);
staticResourceLoader.setHostConfig(new FilterHostConfig(filterConfig));
} finally {
ActionContext.setContext(null);
}
}
//读取配置文件中的信息保存至HashMap中
/**
* Create a default {@link Dispatcher} that subclasses can override
* with a custom Dispatcher, if needed.
*
* @param filterConfig Our FilterConfig
* @return Initialized Dispatcher
*/
protected Dispatcher createDispatcher(FilterConfig filterConfig) {
Map<String, String> params = new HashMap<String, String>();
for (Enumeration e = filterConfig.getInitParameterNames(); e.hasMoreElements();) {
String name = (String) e.nextElement();
String value = filterConfig.getInitParameter(name);
params.put(name, value);
}
return createDispatcher(filterConfig.getServletContext(), params);
}
//创建一个Dispatcher(org.apache.struts2.dispatcher Dispatcher 类)
/**
* Create a default {@link Dispatcher} that subclasses can override
* with a custom Dispatcher, if needed. Called by
* createDispatcher(FilterConfig).
*
* @param ctx ServletContext
* @param params parameters from FilterConfig
* @return Initialized Dispatcher
*/
protected Dispatcher createDispatcher(ServletContext ctx, Map<String, String> params) {
return new Dispatcher(ctx, params);
}
// Dispatcher类 init方法
/**
* Load configurations, including both XML and zero-configuration strategies,
* and update optional settings, including whether to reload configurations and resource files.
*/
public void init() {
if (configurationManager == null) {
configurationManager = createConfigurationManager(BeanSelectionProvider.DEFAULT_BEAN_NAME);
}
try {
init_DefaultProperties(); // [1]
init_TraditionalXmlConfigurations(); // [2]
init_LegacyStrutsProperties(); // [3]
init_CustomConfigurationProviders(); // [5]
init_FilterInitParameters() ; // [6]
init_AliasStandardObjects() ; // [7]
Container container = init_PreloadConfiguration();
container.inject(this);
init_CheckConfigurationReloading(container);
init_CheckWebLogicWorkaround(container);
if (!dispatcherListeners.isEmpty()) {
for (DispatcherListener l : dispatcherListeners) {
l.dispatcherInitialized(this);
}
}
} catch (Exception ex) {
if (LOG.isErrorEnabled())
LOG.error("Dispatcher initialization failed", ex);
throw new StrutsException(ex);
}
}
[1]、主要读取struts 默认配置default.properties文件中的参数(如:编码、后缀等一些基础配置参数)
private void init_DefaultProperties() {
configurationManager.addConfigurationProvider(new DefaultPropertiesProvider());
}
[2]、这个方法主要是用于载入FilterDispatcher定义的config
如果读取初始化的HashMap列表中没有config这个属性,则struts会默认载入:
struts-default.xml,struts-plugin.xml,struts.xml 这三个文件,并且判断是否有xwork.xml,如果有则载入xwork的DTD,否则载入struts的DTD。
private void init_TraditionalXmlConfigurations() {
String configPaths = initParams.get("config");
if (configPaths == null) {
configPaths = DEFAULT_CONFIGURATION_PATHS;
}
String[] files = configPaths.split("\\s*[,]\\s*");
for (String file : files) {
if (file.endsWith(".xml")) {
if ("xwork.xml".equals(file)) {
configurationManager.addContainerProvider(createXmlConfigurationProvider(file, false));
} else {
configurationManager.addContainerProvider(createStrutsXmlConfigurationProvider(file, false, servletContext));
}
} else {
throw new IllegalArgumentException("Invalid configuration file name");
}
}
}
[3]、好像是初始化架框编码
private void init_LegacyStrutsProperties() {
configurationManager.addContainerProvider(new LegacyPropertiesConfigurationProvider());
}
分享到:
相关推荐
在"struts2源码解析.pdf"文档中,主要探讨了以下几个关键组件及其功能: 1. **ActionContext**: - `ActionContext`是Struts2的核心上下文,它存储了与当前Action执行相关的所有信息,如请求参数、session数据等。...
8. **请求处理(Request Handling)**:`org.apache.struts2.dispatcher.ng.filter`包中的`StrutsPrepareAndExecuteFilter`是Struts2与Servlet容器交互的关键,它负责准备请求并执行Action。 9. **类型转换(Type ...
`struts2-json-plugin`是Struts2的一个插件,它使得Struts2能够处理JSON请求和响应,无需额外的配置或库。这个插件不仅包含了源码,还包含了必要的配置文件和类,使得开发者可以深入理解其工作原理并进行自定义扩展...
首先,Struts2的架构基于WebWork的核心,这意味着它采用了WebWork的拦截器(Interceptor)机制,这是Struts2处理请求和响应的关键部分。拦截器在Action执行前后执行,允许开发者添加额外的功能,如验证、日志记录或...
### Struts2源码解析及工作原理 #### Struts2简介 Struts2是一个流行的Java Web应用程序框架,它继承和发展了Struts1.x的一些特性,同时又采用了WebWork框架的核心技术,使得Struts2在设计理念和技术实现上都有了...
当一个HTTP请求到达服务器,Struts 2框架会根据配置的Action Mapping解析请求,然后将请求参数映射到Action对象的属性。接着,如果存在一个对应的Action方法,该方法会被调用来处理业务逻辑。在这个过程中,如果用户...
本文将深入解析Struts1的源码,以帮助理解其内部工作原理。 首先,我们从ActionServlet的生命周期开始。ActionServlet是Struts1的核心组件,它的生命周期分为初始化、拦截请求和销毁三个阶段。在初始化阶段,`init...
2. Struts与Spring的整合,包括Action的配置、Service注入到Action、以及结果的处理。 3. 使用AspectJ的注解来定义切面,如`@Aspect`、`@Pointcut`、`@Before`、`@After`等。 4. 切面的织入策略,包括编译时织入和...
从 org.apache.struts2.dispatcher.FilterDispatcher 开始 Java 代码阅读,我们可以看到 FilterDispatcher 的 init 方法,它负责初始化 Dispatcher 对象,并创建了一个 ActionMapper 实例,以便对请求进行处理。...
此外,还可以深入到动态方法调用、类型转换、异常处理等方面,这些都是Struts2处理请求和响应时的重要环节。 在实际开发中,掌握Struts2的源码知识可以帮助我们解决一些难以定位的问题,例如性能瓶颈、错误处理不当...
通过阅读Struts2的源码,我们可以深入了解框架如何处理请求、如何调度Action以及如何应用拦截器来扩展功能。这有助于开发者更好地定制和优化他们的应用程序,提高代码质量和性能。在实际开发中,对源码的理解能帮助...
Struts2的核心是Action,它负责处理HTTP请求,并通过配置文件或注解来决定如何转发请求到相应的业务逻辑。在深入理解Struts2的源码之前,我们需要对它的主要组件有一个基础的认识。 1. **FilterDispatcher**:这是...
通过对Struts 1.2.9源码的深入学习,开发者可以了解Web应用的典型开发流程,掌握如何有效地组织和管理复杂的业务逻辑,以及如何优雅地处理用户交互。虽然Struts 1已逐渐被Struts 2和Spring MVC等更新框架替代,但它...
XWork是Struts2的核心库,为Struts2提供许多底层功能,如动作调度、类型转换和异常处理等。这次我们探讨的是Struts2的最新版本`struts2-core-2.1.8.1`以及其依赖的`xwork-core-2.1.6`的源码。 1. **Action调度**:...
这份"struts2源码解析[归纳].pdf"文档显然深入探讨了Struts2的核心组件和工作原理。以下是对其中提到的关键概念的详细解释: 1. **ActionContext**: ActionContext是Struts2中一个非常重要的类,它封装了当前请求...
通常在Struts框架中,开发人员会定义Action类来处理用户的请求,这些请求可能对应于不同的业务逻辑,如猜数字的提交、显示结果或者给出提示。Action类会连接到模型,处理数据,并将结果传递给视图来展示。 标签...
本资料包包含的是《Struts2深入详解》一书的源码分析,涵盖了从第一章到第五章的内容,并附带了相关的jar包,方便读者结合理论与实践进行学习。 首先,让我们从第一章开始,Struts2的基础知识。这一章通常会介绍...
7. `excludedPatterns`列表用于指定哪些URL模式不应由Struts2处理。 8. `postInit`方法是一个扩展点,允许用户在初始化完成后执行自定义操作。 9. 最后,`cleanup`方法用于清理资源,确保初始化过程的完整性和资源的...
- `org.apache.struts2.config`: 配置处理相关的类,如StrutsConfig、PackageConfig等,用于解析和管理应用的配置信息。 - `org.apache.struts2.interceptor`: 包含各种内置拦截器,如DebuggingInterceptor、...
此外,结合源码阅读,我们可以深入了解Struts2框架的工作原理,例如,如何解析注解、如何映射请求到相应的Action方法、以及如何执行拦截器链。这对于我们优化性能、解决框架问题或扩展框架功能都有很大帮助。 工具...