您的位置:首页 > 编程语言 > Java开发

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 源码 初始化