struts1.x中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的人员是怎么样去实现各种功能的,虽然可能写不出来,但是多阅读对自己也是一种提高。

转载于:https://www.cnblogs.com/bianshencho/archive/2009/09/27/1575059.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值