Struts初始化之ActionServlet

随着Struts2的推出,很多人认为原有的Struts1.2已经没有学习的价值,其实并不是这样,不管怎么样,原有的Struts1.2要比现有的Struts2成熟,而且Struts2推出的时间还不是很长,所以,Struts1.2至少在现阶段的应用还是要比Struts2的应用要广。所以,认真深入的学习Struts1.2还是很有必要的。
[color=red]首先是Struts1.2的核心类,ActionServlet类。[/color]
ActionServlet位于org.apache.struts.action包内,这个类将会在struts第一次使用时,作为servlet初始化并存入Servlet容器。在初始化时:
首先[color=red]调用init()[/color]方法,Struts 的初始化实现就是在这里实现的。在执行init()方法时,会调用initInternal(),初始化内部文件ActionResources.properties,它通过internal = MessageResources.getMessageResources(internalName)得到内部文件;
[color=red]调用 initOther()[/color],从web.xml中加载ActionServlet的初始化参数,包括config/ convertNull,其中config默认路径为"/WEB-INF/struts-config.xml",[color=blue]protected String config = "/WEB-INF/struts-config.xml",[/color]从web.xml中读取config参数:
[color=blue]String value;
value = getServletConfig().getInitParameter("config");
if (value != null) {
config = value;
} [/color]
获得convertNull的值,[color=blue]getServletConfig().getInitParameter("convertNull");[/color];
[color=red]调用 initServlet()[/color],从web.xml中加载ActionServlet的初始化参数如servlet-name,加载DTD文件并把其放入HashMap缓存,读取并解析web.xml的内容,
[color=blue]getServletConfig().getServletName();
Digester digester = new Digester();
digester.push(this); [/color] [color=green]// 把当前的 ActionServlet 对象放入到解析堆栈中[/color];
[color=red]调用initServlet()[/color],运行时,digester 就会调用 ActionServlet中的 addServletMapping() 方法,并传入两个参数
[color=blue]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);[/color]
上面要从web.xml获得的元素值:
[color=blue]<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>[/color]


[color=green]// 来判断当前 servlet 名称是否为正在运行的 servlet 名称,如是,就把 url-pattern 作为 servletMapping [/color]
[color=blue]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;
}
} [/color]

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

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

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


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

到此,ActionServlet初始化工作就算完成,后半段的初始化工作我解释的不是非常详细,只是想读者去好好阅读Struts的源代码,去品味下开发Struts的人员是怎么样去实现各种功能的,虽然可能写不出来,但是多阅读对自己也是一种提高。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值