死磕Struts源码.(ActionServlet的初始化一)

本文详细解析了Struts框架的初始化过程,包括ActionServlet的初始化、资源文件加载、全局特性和servletMapping的初始化等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

小弟最近研究了部分Struts源码,只把初始化部分看了几遍来和大家分享,理解有误之出请大家多多指出,谢谢!

ActioinServlet的初始化

每个web工程的核心配置文件是web.xml,在每次启动服务器的时候(如:Tomcat)都会自动加载web.xml,会自动运行里面配置的ActionServlet。(不了解的朋友可以看下Servlet的工作原理)

<servlet>

<servlet-name>action</servlet-name>

<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>

</servlet>

ActionServlet就是一个正常的Servlet初始化一样是通过init方法(可参考Servlet的初始化)

在ActionServlet的init方法中按顺序调用了几个方法,分别初始化了不同的信息。

1、initInternal()

这里用到了几个类

抽象类MessageResources,MessageResourcesFactory

普通类PropertyMessageResources,PropertyMessageResourcesFactory



这个方法的作用是:初始化Struts内部资源包。就是初始化Struts自身需要的资源文件。

这个资源文件的全路径是org.apache.struts.action.ActionResources.properties

initInternal方法中通过MessageResources.getMessageResources(internalName)获得一个

MessageResources对象,其中的参数internalName是资源文件ActionResources.properties的全路径

那么,getMessageResources方法的内部是如何实现的呢?它的内部首先获得一个MessageResources

的工厂MessageResourcesFactory的实例defaultFactory,这是通过 MessageResourcesFactory.createFactory()实现的之后用defaultFactory.createResources(config)返回一个MessageResources实例,这里的config就是前面的internalName.这个方法实际上是一个抽象方法,等待继承他的类去实现。当然这个工厂也可以自己定义。

这是createFactory方法的源码用到java的反射机制获取工厂的实例

public static MessageResourcesFactory createFactory() {

try {

if (clazz == null){

clazz = RequestUtils.applicationClass(factoryClass);

MessageResourcesFactory factory = (MessageResourcesFactory) clazz.newInstance();

return (factory);

} catch (Throwable t) {

log.error("MessageResourcesFactory.createFactory", t);

return (null);

}

}



前面提到的类还有两个没有说,PropertyMessageResourcesFactory类继承了MessageResourcesFactory重写了createResources方法返回PropertyMessageResources实例。

而PropertyMessageResources继承了MessageResources类 这是非常好的封装过程。



2、initOther()初始化servlet的其他全局特性

这个方法从web.xml中获得'config'参数和'converNull'参数的值,我没见到有'converNull'属性,网上说现在已经变成debug这地方我还没弄明白。

<init-param>

<param-name>config</param-name>

<param-value>/WEB-INF/struts-config.xml</param-value>

</init-param>

<init-param>

<param-name>debug</param-name>

<param-value>3</param-value>

</init-param>

白初始化了一个ConvertUtils对象,ConvertUtils对象的使用我也没弄明白。



3、initServlet()在ActionServlet被访问之内初始化servletMapping

利用Digester类取得文件标识解读web.xml,对servletMapping进行初始化。这里的Digester类是common包中的,没有弄明白如何使用和其作用。



4、initChain()初始化chainConfig.‘chainConfig’是在web.xml中配置的init-param参数



先说这些,初始化中还有一个关键的ModuleConfig初始化非常重要,下次再说。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值