struts2源码分析(一)(初始化)
2013-09-27 10:00
483 查看
struts2容器的初始化
1、通过web.xml配置文件的Filter配置进入到StrutsPrepareAndExecute(org.apache.struts2.dispatcher.ng.filter包)该类是一个Filter类,其实现了两个接口。分别为StrutsStatics和Filter,其中StrutsStatics(org.apache.struts2)这个文件中保存了struts2用到的常量,这些常量有HTTP_REQUEST(http_request),HTTP_RESPONSE(http_response),SERVLET_DISPATCHER(servlet_dispatcher),SERVLET_CONTEXT(servlet_context),PAGE_CONTEXT(page_context),STRUTS_PORTLET_CONTEXT(struts_portlet_context),STRUTS_ACTION_TAG_INVOCATION(struts_tag_invocation).Filter接口就不做说明。
接下来分析该类内部的init(FilterConfig filterConfig)方法,该方法的代码如下:
public void init(FilterConfig filterConfig) throws ServletException { //创建一个初始化所有操作的init实例 InitOperations init = new InitOperations();//1 try { //对filterConfig中的信息进行整理 FilterHostConfig config = new FilterHostConfig(filterConfig);//2 //配置日子管理类 init.initLogging(config);//3 //初始化Dispatcher,这行代码是核心内容 Dispatcher dispatcher = init.initDispatcher(config);//4 init.initStaticContentLoader(config, dispatcher);//5 //实例化prepare prepare = new PrepareOperations(filterConfig.getServletContext(), dispatcher);//6 //实例化execute execute = new ExecuteOperations(filterConfig.getServletContext(), dispatcher);//7 this.excludedPatterns = init.buildExcludedPatternsList(dispatcher);//8 postInit(dispatcher, filterConfig);//9 } finally { init.cleanup();//10 } }
具体分析如下:
①InitOperations init = new InitOperations();//1
InitOperations(org.apache.struts2.dispatcher.ng)该类负责初始化操作;
这行代码主要创建了一个InitOperations实例,其构造方法如下:
/** * 默认无参数构造方法 */ public InitOperations() { }
②FilterHostConfig config = new FilterHostConfig(filterConfig);//2
FilterHostConfig(org.apache.struts2.dispatcher.ng.filter)对filterConfig中的信息进行整理该类的主要方法如下
public class FilterHostConfig implements HostConfig { //常量,用于接收FilterConfig private FilterConfig config; /** * 构造方法,在这个构造方法中初始化FilterConfig常量 * @param config FilterConfig的实体对象 */ public FilterHostConfig(FilterConfig config) { this.config = config; } /** * 通过KEY得到在web.xml中配置的参数 */ public String getInitParameter(String key) { return config.getInitParameter(key); } /** * 以Iterator的形式返回配置中的所有配置名称 */ public Iterator getInitParameterNames() { return MakeIterator.convert(config.getInitParameterNames()); } /** * 得到Servlet容器 */ public ServletContext getServletContext() { return config.getServletContext(); } }
继承的接口HostConfig(org.apache.struts2.dispatcher.ng)
public interface HostConfig { /** * @param key The parameter key * @return The parameter value */ String getInitParameter(String key); /** * @return A list of parameter names */ Iterator<String> getInitParameterNames(); /** * @return The servlet context */ ServletContext getServletContext(); }
③init.initLogging(config);
InitOperations(org.apache.struts2.dispatcher.ng)类中的initLogging(config)方法
该方法的主要目的是初始化配置文件中配置的loggerFactory
/** * 初始化struts2内部的日子信息 */ public void initLogging( HostConfig filterConfig ) { //从web.xml中的Filter中获取loggerFactory的参数 String factoryName = filterConfig.getInitParameter("loggerFactory"); /** * 平时,不在web的filter中配置该选项(loggerFactory),所以不需要分析该部分代码; * 如果用户需要配置的话,配置的类要实现LoggerFactory这个抽象类 */ if (factoryName != null) { try { //如果在配置文件中配置了该选项,则采用java中的反射机制,加载到LoggerFactory中 Class cls = ClassLoaderUtil.loadClass(factoryName, this.getClass()); LoggerFactory fac = (LoggerFactory) cls.newInstance(); LoggerFactory.setLoggerFactory(fac); } catch ( InstantiationException e ) { System.err.println("Unable to instantiate logger factory: " + factoryName + ", using default"); e.printStackTrace(); } catch ( IllegalAccessException e ) { System.err.println("Unable to access logger factory: " + factoryName + ", using default"); e.printStackTrace(); } catch ( ClassNotFoundException e ) { System.err.println("Unable to locate logger factory class: " + factoryName + ", using default"); e.printStackTrace(); } } }
④Dispatcher dispatcher = init.initDispatcher(config);
InitOperations(org.apache.struts2.dispatcher.ng)类中的initDispatcher(filterConfig)方法
该方法的主要目的是初始化Dispatcher(该模块是核心内容,将在第二部分进行说明)
/** * 创建和初始化dispatcher */ public Dispatcher initDispatcher( HostConfig filterConfig ) { //创建一个dispatcher,并把filterConfig作为参数传递进去 Dispatcher dispatcher = createDispatcher(filterConfig);//1: //dispatcher的初始化操作,很重要的部分 dispatcher.init();//2: return dispatcher; }
⑤init.initStaticContentLoader(config, dispatcher);
InitOperationos(org.apache.struts2.dispatcher.ng)类中的initStaticContentLoader(filterConfig, Dispatcher)该方法的主要目的是
初始化静态内容装载器和拦截器配置,具体代码如下(该部分的详细介绍将在第二部分进行说明)
⑥prepare = new PrepareOperations(filterConfig.getServletContext(), dispatcher);
初始化一个PrepareOperations(org.apache.struts2.dispatcher.ng)(该段代码的具体作用将在第五部分进行介绍)
⑦execute = new ExecuteOperations(filterConfig.getServletContext(), dispatcher);
初始化一个ExecuteOperations(org.apache.struts2.dispatcher.ng)(该段代码的具体作用将在第五部分进行介绍)
⑧this.excludedPatterns = init.buildExcludedPatternsList(dispatcher);
调用init的方法,提取一个请求过滤列表(该段代码的具体作用将在第五部分进行介绍)
⑨postInit(dispatcher, filterConfig);
该方法属于StrutsPrepareAndExecuteFilter(org.apache.struts2.dispatcher.ng.filer)中的方法(具体作用将在第五部分进行介绍)
⑩init.cleanup();
清空ActionContext(具体作用将在第五部分进行介绍)
相关文章推荐
- Struts2源码分析 初步2--Dispatcher初始化细节(1)
- struts2源码分析--IOC容器的实现(操作以及容器的初始化)
- struts2源码分析(二)(初始化)
- Struts2初始化流程及源码分析
- struts2源码分析(三)(初始化)(下)
- Struts2源码粗略分析二:初始化详解
- Struts2源码分析 初步1 --如何入手以及做了哪些初始化
- linux内存源码分析 - 伙伴系统(初始化和申请页框)
- {{jQuery源码分析}}jQuery对象初始化的多种传参数形式
- Struts2源码粗略分析一:开发环境
- suricata 3.1 源码分析23 (数据包解码模块注册及初始化)
- Struts2 源码分析——调结者(Dispatcher)之action请求
- Ceilometer项目源码分析----ceilometer-alarm-notifier服务的初始化和启动
- Ceilometer项目源码分析----ceilometer-collector服务的初始化和启动
- Struts2容器详解---IoC源码分析
- [Android源码分析]bluez中adapter初始化分析
- xv6源码分析(二):内核初始化和多核启动
- tomcat源码分析--初始化与启动
- Struts2源码分析
- tomcat源码分析-Connector初始化与启动