回首struts1.2的ActionServlet类

来源:互联网 发布:国家宏观经济数据 编辑:程序博客网 时间:2024/06/05 17:04
首先是Struts1.2的核心类,ActionServlet类。
ActionServlet位于org.apache.struts.action包内,这个类将会在struts第一次使用时,作为servlet初始化并存入Servlet容器。在初始化时:
首先调用init()方法,Struts 的初始化实现就是在这里实现的。在执行init()方法时,会调用initInternal(),初始化内部文件ActionResources.properties,它通过internal = MessageResources.getMessageResources(internalName)得到内部文件;
调用 initOther(),从web.xml中加载ActionServlet的初始化参数,包括config/ convertNull,其中config默认路径为"/WEB-INF/struts-config.xml",protected String config = "/WEB-INF/struts-config.xml",从web.xml中读取config参数:
String value;
value = getServletConfig().getInitParameter("config");
if (value != null) {
config = value;
}

获得convertNull的值,getServletConfig().getInitParameter("convertNull");
调用 initServlet(),从web.xml中加载ActionServlet的初始化参数如servlet-name,加载DTD文件并把其放入HashMap缓存,读取并解析web.xml的内容,
getServletConfig().getServletName();
Digester digester = new Digester();
digester.push(this);
// 把当前的 ActionServlet 对象放入到解析堆栈中
调用initServlet(),运行时,digester 就会调用 ActionServlet中的 addServletMapping() 方法,并传入两个参数
digester.addCallMethod("web-app/servlet-mapping", "addServletMapping", 2);
digester.addCallParam("web-app/servlet-mapping/servlet-name", 0);
digester.addCallParam("web-app/servlet-mapping/url-pattern", 1);

上面要从web.xml获得的元素值:
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>



// 来判断当前 servlet 名称是否为正在运行的 servlet 名称,如是,就把 url-pattern 作为 servletMapping
public void addServletMapping(String servletName, String urlPattern) {
if (servletName == null) {
return;
}
if (servletName.equals(this.servletName)) {
if (log.isDebugEnabled()) {
log.debug("Process servletName=" + servletName
+ ", urlPattern=" + urlPattern);
}
this.servletMapping = urlPattern;
}
}


// 读取配置文件web.xml的内容
InputStream input = getServletContext().getResourceAsStream("/WEB-INF/web.xml");

// 如找不到/WEB-INF/web.xml文件,则报错
if (input == null) {
log.error(internal.getMessage("configWebXml"));
throw new ServletException(internal.getMessage("configWebXml"));
}


// 报错信息定义在org\apache\struts\action\ActionResources.properties中
configWebXml=The /WEB-INF/web.xml was not found.


// 解析input流文件,每读到一个节点元素就触发一个事件digester.parse(input)调用 initChain(),读取web.xml中命令链文件初始值chainConfig,如果没有,则用默认的"org/apache/struts/chain/chain-config.xml"
调用 initModuleConfigFactory()和 initModuleConfig("", config),创建 ModuleConfig 对象。Struts中的MessageResource、PlugIn、数据源等,都是通过ModuleConfig来实现的;
调用initModuleMessageResources(moduleConfig),用户资源文件的初始化;
调用initModulePlugIns(moduleConfig),用户插件的初始化;
调用initModuleFormBeans(moduleConfig); initModuleForwards(moduleConfig); initModuleExceptionConfigs(moduleConfig); initModuleActions(moduleConfig),把struts配置文件中的其他配置存储到servletContext中;
调用moduleConfig.freeze(),固定组件配置;随后解析以"config/"开头的其他struts配置文件,遍历web.xml中servletConfig配置的initParameterNames,如发现以"config/" 开始的parameter,则根据此值初始化其它的ModuleConfig;
之后调用initModulePrefixes(this.getServletContext()),initModulePrefixes(this.getServletContext()),初始化其他模块并存储。

到此,ActionServlet初始化工作就算完成,后半段的初始化工作我解释的不是非常详细,只是想读者去好好阅读Struts的源代码,去品味下开发Struts的人员是怎么样去实现各种功能的,虽然可能写不出来,但是多阅读对自己也是一种提高。
原创粉丝点击