此文重点分析struts启动的时候加载的配置文件信息:
郑重声明:此篇文章完全是自己经过单步调试、及其自己的理解而写的,其中如有错误之处,还请朋友指点。读者在阅读的时候,如果有问题,还建议去自己探究发现、或者与我交流,不能尽信此文。还有部分的信息是参考网上的,在文章最后备注有参考链接。
我们在XML中配置的就是org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter这个类,这个是进入struts构架的入口,也就是它将struts2嵌入嵌入到我们的工作中。
下面是它的初始化函数,当该函数执行完成之后,也就完成了关于struts2的所有的配置文件的加载。
public void init(FilterConfig filterConfig) throws ServletException {
//InitOperations正如所描述的,里面包含了初始化的操作。
InitOperations init = new InitOperations();
try {
//包装FilterConfig的主机配置
FilterHostConfig config = new FilterHostConfig(filterConfig);
init.initLogging(config);
//其实完成各种配置文件的加载就在这个函数中,详情如下面的解析
Dispatcher dispatcher = init.initDispatcher(config);
init.initStaticContentLoader(config, dispatcher);
prepare = new PrepareOperations(filterConfig.getServletContext(), dispatcher);
execute = new ExecuteOperations(filterConfig.getServletContext(), dispatcher);
this.excludedPatterns = init.buildExcludedPatternsList(dispatcher);
postInit(dispatcher, filterConfig);
} finally {
init.cleanup();
}
}
现在我们一步一步分析initDispatcher(config)这个函数
/**
* Creates and initializes the dispatcher
*/
public Dispatcher initDispatcher( HostConfig filterConfig ) {
/*
首先我们了解一个很重要的类:Dispatcher
正如其帮助文档所写的:A utility class the actual dispatcher delegates most of its tasks to. Each instance of the primary dispatcher holds an instance of this dispatcher to be shared for all requests.
这个类的构造方法:
public Dispatcher(ServletContext servletContext, Map<String, String> initParams) {
this.servletContext = servletContext;
this.initParams = initParams;
}
此处就是构造了这样一个派发对象
*/
Dispatcher dispatcher = createDispatcher(filterConfig);
/*
下面的这个函数是初始化配置的入口,请直接看下面init函数的解析
*/
dispatcher.init();
return dispatcher;
}
下面的是org.apache.struts2.dispatcher.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() {
//配置管理器,当我们加载完配置之后,由此管理器完成对配置的管理
/*
在com.opensymphony.xwork2.config.ConfigurationManager中有两个列表变量,就是用来存储各种的配置类:
ContainerProvider的介绍:Provides beans and constants/properties for the Container
private List<ContainerProvider> containerProviders = new CopyOnWriteArrayList<ContainerProvider>();
PackageProvider的介绍:Provides configuration packages. The separate init and loadPackages calls are due to the need to preserve backwards compatibility with the ConfigurationProvider interface
private List<PackageProvider> packageProviders = new CopyOnWriteArrayList<PackageProvider>();
*/
if (configurationManager == null) {
configurationManager = createConfigurationManager(BeanSelectionProvider.DEFAULT_BEAN_NAME);
}
try {
//下面的七步将完成配置文件的加载
//org/apache/struts2/default.properties文件的加载
//该配置文件由org.apache.struts2.config. DefaultPropertiesProvider加载(重点留意其中的Register函数)
init_DefaultProperties(); // [1]
//完成struts-default.xml,struts-plugin.xml,struts.xml的加载
// com.opensymphony.xwork2.config.providers. XmlConfigurationProvider中的 register函数将完成XML的解析,详细解析方法可参考源代码
init_TraditionalXmlConfigurations(); // [2]
//加载自定义的属性文件:struts.properties
init_LegacyStrutsProperties(); // [3]
//加载Web.xml中的配置
init_CustomConfigurationProviders(); // [5]
//加载Web.xml中的过滤器参数配置
init_FilterInitParameters() ; // [6]
//将一个BeanSelectionProvider类追加到ConfigurationManager对象内部的
// ConfigurationProvider队列中
// BeanSelectionProvider主要实现加载org/apache/struts2/struts-messages
init_AliasStandardObjects() ; // [7]
//接下来就开始执行配置文件中的init函数和Register函数
//下面的这个函数会转到:
/*
private Container init_PreloadConfiguration() {
//获取初始化参数,即上面的七步操作结果
Configuration config = configurationManager.getConfiguration();
//这个函数中的重点部分也就是这一句了
//下面我们就看看这个函数的内容,由于无法嵌套注释,还是写到下//面吧
Container container = config.getContainer();
boolean reloadi18n = Boolean.valueOf(container.getInstance(String.class, StrutsConstants.STRUTS_I18N_RELOAD));
LocalizedTextUtil.setReloadBundles(reloadi18n);
return container;
}
*/
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);
}
}
此函数位于:com.opensymphony.xwork2.config.
ConfigurationManagerpublic synchronized Configuration 中
getConfiguration(){//此时会去执行else分支
if (configuration == null) {
setConfiguration(createConfiguration(defaultFrameworkBeanName));
try {
configuration.reloadContainer(getContainerProviders());
} catch (ConfigurationException e) {
setConfiguration(null);
throw new ConfigurationException("Unable to load configuration.", e);
}
} else {
//看看这个函数的内幕:函数比较长,就单只写一个主要的部分吧
/*
……
if (reload) {
for (ContainerProvider containerProvider : containerProviders) {
try {
containerProvider.destroy();
}
catch(Exception e) {
if (LOG.isWarnEnabled()) {
LOG.warn("error while destroying configuration provider ["+containerProvider+"]",e);
}
}
}
//重点的也就是这个函数了,它会去执行init和register方法
//此处调用的是com.opensymphony.xwork2.config.impl. //DefaultConfiguration中的重写方法
packageProviders = configuration.reloadContainer(providers);
过多的代码此处不写了,只看重要部分:
ContainerProperties props = new ContainerProperties();
ContainerBuilder builder = new ContainerBuilder();
for (final ContainerProvider containerProvider : providers)
{
//下面两句就是完成初始化和注册操作
containerProvider.init(this);
containerProvider.register(builder, props);
}
……
*/
conditionalReload();
}
return configuration;
}
至此struts的配置都已经加载完成了。
参考链接:
http://blog.csdn.net/ferry_passion/article/details/7110207
分享到:
相关推荐
在深入理解Struts2的工作原理时,源码分析是必不可少的步骤。Struts2的核心设计理念和设计模式相比Struts1.x有了显著的变化,这使得它成为一个独立且成熟的框架。 首先,Struts2的架构基于WebWork的核心,这意味着...
ActionProxy是Struts2中的一个重要组件,因为它封装了Action的实例化和调用过程。通过ActionProxy,开发者可以实现更复杂的逻辑,如动态Action映射或延迟加载Action。 Struts2的视图组件被封装在`org.apache.struts...
Struts 1.2 是一款基于 Model-View-Controller(MVC)设计模式的开源Java Web框架,由Apache...通过深入理解Struts 1.2的源码,开发者可以更好地利用这个框架,解决实际项目中的问题,同时为自定义扩展和优化提供可能。
本教程将深入探讨如何将Spring与Struts2进行整合,以及相关的源码分析。 首先,Spring和Struts2的整合主要体现在以下几个方面: 1. **依赖注入**:Spring通过DI机制,将Struts2的Action、拦截器等组件的创建和管理...
1. **初始化**:Struts2框架在启动时会加载所有的拦截器,并调用其`init()`方法进行初始化。 2. **拦截**:当一个请求到达Action时,Struts2会根据配置的拦截器栈顺序,先调用每个拦截器的`intercept()`方法,然后才...
### Struts2源码解析及工作原理 #### Struts2简介 Struts2是一个流行的Java Web应用程序框架,它继承和发展了Struts1.x的...对于开发者来说,熟悉Struts2的源码有助于提高开发效率,解决实际开发过程中遇到的问题。
Struts2 源码分析主要涉及其在Tomcat启动过程中的初始化步骤以及请求处理流程。首先,我们来看Tomcat启动时Struts2框架如何准备和执行。 在Tomcat启动时,Struts2的Filter文件被加载,具体是`...
对于源码分析和调试,理解Struts2的工作原理和核心组件,如Action、Result、Interceptor、Plug-in等,将有助于提升开发效率和解决问题的能力。 总的来说,手动搭建Struts2环境虽然相对繁琐,但通过这个过程,开发者...
源码分析有助于解决实际问题,提升代码质量和性能,同时也有助于学习MVC模式和其他设计模式的应用。在实际项目中,结合文档和源码,可以更有效地利用Struts1.2提供的功能,为Web应用开发带来便利。
本入门教程将引导初学者深入理解Struts2的核心概念,通过源码分析和实际操作,帮助你快速上手。 1. **Struts2框架概述** Struts2是Struts1的升级版,它弥补了Struts1在灵活性、扩展性和性能上的不足。Struts2采用...
在描述中提到的问题是关于Tomcat服务器在启动时遇到与Struts2相关的严重错误。这通常意味着应用的配置或者Struts2的核心组件出现了问题。下面将详细分析可能出现的问题以及解决策略。 首先,当我们在启动Tomcat时...
7. **源码分析**:标签中的“源码”意味着在理解和解决问题时,查看Struts2和GAE相关的源代码可能会有所帮助。了解底层工作原理可以帮助你更好地解决兼容性和性能问题。 8. **工具使用**:可能涉及到的工具包括IDE...
在"Struts2应用开发详解02"的主题中,我们将深入探讨Struts2.2的独有特性以及其核心组件之一——StrutsPrepareAndExecute过滤器的源码分析。 首先,让我们来看看Struts2.2的独有特性: 1. **插件化架构**:Struts...
它负责设置全局的配置参数,加载过滤器、初始化插件等,是Struts启动过程的关键部分。 4. **init()方法图.vsd**: VSD(Visio Shapesheet Diagram)文件可能是一个流程图,展示了`init()`方法的执行流程。在Struts...
源码分析** 理解Struts2拦截器的工作原理,可以查看`com.opensymphony.xwork2.DefaultActionInvocation`类中的`invoke()`方法,以及`InterceptorSupport`抽象类中的`doIntercept()`方法。这些源码可以帮助我们深入...
通过以上分析,我们可以了解到这个JSP书店系统的基本架构和实现原理,对于学习Java Web开发,特别是Struts框架,这是一个很好的实践案例。在实际应用中,还可以考虑加入Spring、Hibernate等框架,以进一步提升系统的...
Struts2是一个强大的Java web应用程序框架,它遵循MVC(Model-View-Controller)设计模式,简化了开发过程。在Struts2中,整体流程主要涉及三个关键部分:核心控制器FilterDispatcher、业务控制器Action和用户自定义...
最后,提供的“demo”文件可能包含了一个简单的Struts2示例工程,你可以解压后运行并分析其结构,以加深对Struts2集成的理解。记得检查`src/main/java`、`src/main/resources`、`WebContent/WEB-INF`等关键目录,看...
标题 "myeclipse+tomcat6.0+struts2开发的登录程序" 提供了我们正在探讨的技术栈,这是一个使用MyEclipse作为集成开发环境(IDE),Tomcat 6.0作为应用服务器,以及Struts2作为MVC框架来构建的登录应用程序。...