Struts2学习一、分析初始化流程
来源:互联网 发布:薛之谦的女装淘宝店 编辑:程序博客网 时间:2024/06/05 03:03
Struts2刚开始加载的时候是通过在web.xml中配置的过滤器来实现拦截请求的
<filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
打开StrutsPrepareAndExecuteFilter类 继承了Filter,在WEB容器启动的时候会调用init方法
public void init(FilterConfig filterConfig) throws ServletException { InitOperations init = new InitOperations(); Dispatcher dispatcher = null; try { FilterHostConfig config = new FilterHostConfig(filterConfig); init.initLogging(config); 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 { if (dispatcher != null) { dispatcher.cleanUpAfterInit(); } init.cleanup(); } }
变量1:init(InitOperations),该类负责各种配置文件和其他类的初始化工作
变量2:filterConfig(FilterConfig):这个就是web.xml中配置的过滤器信息
变量3:config(FilterHostConfig):构造函数是接受FilterConfig,有两个主要的方法
大致是获取配置在web.xml中初始化的参数和获得ServletContext(不确定)
public Iterator<String> getInitParameterNames() { return MakeIterator.convert(config.getInitParameterNames()); } public ServletContext getServletContext() { return config.getServletContext(); }
init.initLogging(config); 这个是配置日志信息
dispatcher = init.initDispatcher(config);这个是根据config产生调度器dispatcher
打开里面的代码
public Dispatcher initDispatcher( HostConfig filterConfig ) { //创建dispatcher Dispatcher dispatcher = createDispatcher(filterConfig); //加载各种默认配置文件 dispatcher.init(); return dispatcher; }
其中创建createDispatcher的代码部分
private Dispatcher createDispatcher( HostConfig filterConfig ) { Map<String, String> params = new HashMap<String, String>(); for ( Iterator e = filterConfig.getInitParameterNames(); e.hasNext(); ) { String name = (String) e.next(); String value = filterConfig.getInitParameter(name); params.put(name, value); } return new Dispatcher(filterConfig.getServletContext(), params); }
下面重点来了 dispatcher.init(); 这部分就是dispatcher加载struts2的各种默认配置文件
try { init_FileManager(); 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_CheckWebLogicWorkaround(container); if (!dispatcherListeners.isEmpty()) { for (DispatcherListener l : dispatcherListeners) { l.dispatcherInitialized(this); } } }
- [1]、源码部分:
private void init_DefaultProperties() { configurationManager.addContainerProvider(new DefaultPropertiesProvider()); }
configurationManager管理器 添加一个ContainerProvider,其中DefaultPropertiesProvider类的实例是参数
public void register(ContainerBuilder builder, LocatableProperties props) throws ConfigurationException { Settings defaultSettings = null; try { defaultSettings = new PropertiesSettings("org/apache/struts2/default"); } catch (Exception e) { throw new ConfigurationException("Could not find or error in org/apache/struts2/default.properties", e); } loadSettings(props, defaultSettings); }
打开源码后发现原来是加载default.properties这个配置文件
- [2]、源码
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"); } } }
其中configPaths是:struts-default.xml,struts-plugin.xml,struts.xml,这也非常明白了,原来是加载这三个配置文件。
所以和很清楚的知道struts加载配置文件的顺序default.properties、struts-default.xml,struts-plugin.xml,struts.xml
- [3]部分源码:
String loc = context.getContainer().getInstance(String.class, StrutsConstants.STRUTS_LOCALE); if (loc != null) { StringTokenizer localeTokens = new StringTokenizer(loc, "_"); String lang = null; String country = null; if (localeTokens.hasMoreTokens()) { lang = localeTokens.nextToken(); } if (localeTokens.hasMoreTokens()) { country = localeTokens.nextToken(); } locale = new Locale(lang, country); }
这个是加载struts.locale的也就是 国际化的文件
init_CustomConfigurationProviders();
// [5] 这个应该是加载用户自动定义的ConfigurationProviders(不太清楚)
init_FilterInitParameters() ; // [6]
public void register(ContainerBuilder builder, LocatableProperties props) throws ConfigurationException { props.putAll(initParams); }
主要就是把initParams放到props中,props内容是:{struts.velocity.contexts=, struts.multipart.parser=jakarta, struts.el.throwExceptionOnFailure=false, struts.serve.static.browserCache=true, struts.enable.DynamicMethodInvocation=true, struts.multipart.saveDir=, struts.serve.static=true……}这些
这部分我也不太懂
- init_AliasStandardObjects() ; // [7]
这部分大概就是进一步初始化props这个属性,源码我就不贴了
- Struts2学习一、分析初始化流程
- struts2源码分析(一)(初始化)
- iGH EtherCAT初始化流程分析(一)
- struts2源码学习之初始化(一)
- Struts2框架学习<一>流程介绍
- wpa_supplicant 初始化流程分析
- wpa_supplicant 初始化流程分析
- wpa_supplicant 初始化流程分析
- wpa_supplicant 初始化流程分析
- wpa_supplicant 初始化流程分析
- wpa_supplicant初始化流程分析
- wpa_supplicant 初始化流程分析
- wpa_supplicant 初始化流程分析
- wpa_supplicant 初始化流程分析
- wpa_supplicant 初始化流程分析
- wpa_supplicant 初始化流程分析
- wpa_supplicant 初始化流程分析
- wpa_supplicant 初始化流程分析
- 死锁
- Android之服务(二)活动和服务进行通信
- 标准C语言中使用bool类型
- zoj 3469 Food Delivery (区间DP)
- Android studio 遇到的第一个问题
- Struts2学习一、分析初始化流程
- 设计模式之:访问者模式(Visitor)
- 三星、微软高调推新品,平板行业“风水轮流转”?
- Struct2或者SSH项目中添加手机短信登录及期间遇到的一些问题
- ALSA声卡驱动中的DAPM详解之五:建立widget之间的连接关系
- 属性动画的简单使用和总结
- spring hadoop 访问hbase入门
- zookeeper原理
- python读写文件处理空格,空行与结束