2008-02-23
死磕Struts源码.(ActionServlet的初始化一)
关键字: struts
小弟最近研究了部分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初始化非常重要,下次再说。
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初始化非常重要,下次再说。
评论
nebulaliang
2008-07-31
aidiyuxin 写道
大哥 ~~这地方的人都比较专业,要骗帖子,请换个地方~
嘎嘎
struts was very very old~~
嘎嘎
换点东西吧 比如:xslt什么的,哈哈
有时间可以自己写一个简单点的struts嘛
嘎嘎
struts was very very old~~
嘎嘎
换点东西吧 比如:xslt什么的,哈哈
有时间可以自己写一个简单点的struts嘛
不同意楼上说的。struts不管旧不旧,它的源代码都值得研究,因为那简直可以当作设计模式的活教材,如果能研究透的话一定会受益匪浅。当然不是说它设计的有多么完美,如果那样的话也不用出struts2了,主要是能从中学到东西。我也在研究struts源代码,不过现在只研究了一点点。
aidiyuxin
2008-05-08
大哥 ~~这地方的人都比较专业,要骗帖子,请换个地方~
嘎嘎
struts was very very old~~
嘎嘎
换点东西吧 比如:xslt什么的,哈哈
有时间可以自己写一个简单点的struts嘛
嘎嘎
struts was very very old~~
嘎嘎
换点东西吧 比如:xslt什么的,哈哈
有时间可以自己写一个简单点的struts嘛
ericxu131
2008-03-19
之前看过struts in action 里面有简单的原理介绍
感觉差不多
感觉差不多
发表评论
提醒: 该博客已发表在公共论坛,博客所有留言会成为论坛回贴,留言请注意遵守论坛发贴规则
- 浏览: 560 次
- 性别:

- 来自: 哈尔滨

- 详细资料
搜索本博客
最近加入圈子
最新评论
-
死磕Struts源码.(ActionSe ...
aidiyuxin 写道大哥 ~~这地方的人都比较专业,要骗帖子,请换个地方~ ...
-- by nebulaliang -
死磕Struts源码.(ActionSe ...
大哥 ~~这地方的人都比较专业,要骗帖子,请换个地方~嘎嘎struts was ...
-- by aidiyuxin -
内部类的一些知识
大哥,你行不行啊 ~~~嘎嘎
-- by aidiyuxin -
死磕Struts源码.(ActionSe ...
之前看过struts in action 里面有简单的原理介绍 感觉差不多
-- by ericxu131






评论排行榜