struts1源码解读.docx
- 文档编号:2202934
- 上传时间:2022-10-27
- 格式:DOCX
- 页数:49
- 大小:49.59KB
struts1源码解读.docx
《struts1源码解读.docx》由会员分享,可在线阅读,更多相关《struts1源码解读.docx(49页珍藏版)》请在冰豆网上搜索。
struts1源码解读
这些只是本人个人的理解,如有误解之处请多指点。
Struts的核心类就是org.apache.struts.action.ActionServlet,它继承于javax.servlet.http.HttpServlet,当我们配置Struts时就要在web.xml文件中配置这个Servlet类。
当ActionServlet初始化时,就调用init()方法。
1、initInternal():
初始化Struts框架内在的消息资源,如与系统日志相关的日志、警告和错误消息。
通过调用MessageResources.getMessageResources(internalName)方法生成一个MessageResources类,getMessageResources()方法里先获得一个MessageResourcesFactory对象,然后通过调用MessageResourcesFactory对象的createResources(config)来实现的。
MessageResourcesFactory是一个abstract类,任何继承自它的类都要实现createResources()方法,生成MessageResources对象。
org.apache.struts.util.PropertyMessageResourcesFactory类就是继承了MessageResourcesFactory的一个类,在MessageResourcesFactory定义了一个factoryClass静态属性,
protectedstaticStringfactoryClass="org.apache.struts.util.PropertyMessageResourcesFactory";
而在MessageResourcesFactory.createFactory()静态方法中,通过org.apache.struts.util.RequestUtils的静态方法applicationClass(factoryClass)返回了一个factoryClass变量值对象的class,从而通过此class初例化得到了一个MessageResourcesFactory对象。
MessageResources其实也是一个abstract类,它有一个抽象方法:
publicabstractStringgetMessage(Localelocale,Stringkey);作用是根据不同的Locale,从国际化属性文件中获得key的值。
MessageResources里有很多getMessage方法,但其实最终都是调用这个方法来实现。
PropertyMessageResources就是MessageResources的继承子类。
###
首先它会通过一个HashMap检测这个localKey相关的message是否已经被初始化了,如果被初始化过就跳出,检测的方法是locales.get(localeKey) !
= null。
然后会读取如下一个文件:
org/apache/struts/action/ActionResources_(localKey).properties,然后进行如下操作:
Properties props = new Properties();
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
is = classLoader.getResourceAsStream(name);
props.load(is);
Iterator names = props.keySet().iterator();
while (names.hasNext()) {
String key = (String) names.next();
if (log.isTraceEnabled()) {
log.trace(" Saving message key '" + messageKey(localeKey, key));
}
messages.put(messageKey(localeKey, key), props.getProperty(key));
}
PropertyMessageResources 就是通过上面的loadLocale方法查找与Locale locale, String key相对对应的Message.查找的次序如下locale.toString(),然后是localeKey = localeKey.substring(0, underscore),然后是defaultLocale,然后是key。
最后,resource类的结构如下:
PropertyMessageResources extends MessageResources
PropertyMessageResourcesFactory extends MessageResourcesFactory
二、initOther()方法:
从servlet中获取config和debug两个参数,然后初始化ConvertUtils对象。
由于
ConvertUtils.deregister()的初始化,所有的Converter都是有初始值的,所以这里Struts自己
把这些初始值设置为null,即转换出错的时候返回null,而不是初始值。
使用ConvertUtils类的
原因是由于从form传输过来的都是String类型的值,所以我们要把它们转换成相应的类型。
提到几个技巧:
*public boolean isIndexed() {
if (type == null) {
return (false);
//技巧一:
判断是否是一个Array类的方法
} else if (type.isArray()) {
return (true);
//技巧二:
判断type是否是List的一个父类或者父接口,或者与List为同一个类
//要注意如果List是另一个primitive的TYPE类,那么type必须也是这个类才会
//返回true,否则都是false。
注意long.TYPE与Long.class是不同的
} else if (List.class.isAssignableFrom(type)) {
return (true);
} else {
return (false);
}
}
*//componentType为Array类所存储的元素的类别
Class componentType = indexedProperty.getClass().getComponentType();
//生成一个新的Array
Object newArray = Array.newInstance(componentType, (index + 1));
System.arraycopy(indexedProperty, 0, newArray, 0, length);
indexedProperty = newArray;
set(name, indexedProperty);
int newLength = Array.getLength(indexedProperty);
for (int i = length; i < newLength; i++) {
Array.set(indexedProperty, i, createProperty(name+"["+i+"]", componentType));
}
三、initServlet()方法:
这个方法主要是通过digester类解析web.xml,对String servletMapping属性进行初始化。
对于
digester说明如下:
这是一个基于DOM的SAX实现的类,它是事件触发的,根据xml文件的结构,
每次读到一个节点元素就会触发一个事件。
InputStream input = getServletContext().getResourceAsStream("/WEB-INF/web.xml");
这是一个比较少见的方法。
首先通过this.servletName = getServletConfig().
getServletName()获取servlet的名称,然后根据
if (servletName.equals(this.servletName)) {
this.servletMapping = urlPattern;
}
来判断当前读到的servlet名称是否是我们运行的servlet的名称,如果是,就把url-pattern作为
我们的servletMapping。
四、getServletContext().setAttribute(Globals.ACTION_SERVLET_KEY, this)
把自己存储到servletContext中,属性名为Globals.ACTION_SERVLET_KEY。
五、ModuleConfig moduleConfig = initModuleConfig("", config)
这个方法使用由initOther()方法获取的config值为要解析的xml路径,用来初始化ModuleConfig。
它首先采用与生成MessageResourcesFactory同样的方法产生一个MessageResourcesFactory对象:
MessageResourcesFactory为一个抽象类,每一个继承它的类都要实现
createModuleConfig(String prefix)方法。
本程序使用的缺省的MessageResourcesFactory类为
org.apache.struts.config.impl.DefaultModuleConfigFactory,它
的createModuleConfig(String prefix)方法会生成一个ModuleConfigImpl类。
ModuleConfigImpl类相当于一个JavaBean,用来存放一个web模块运行时所需要的配置信息。
当
然,一个web模块可以拥有多个ModuleConfig,但是缺省的是prefix长度为0的ModuleConifg。
它
的每个属性几乎都是由HashMap组成的,它通过一个configured布尔值来描述当前的ModuleConfig
是否已经被初始化完毕,在每存放一个属性的时候都会监测这个值。
如果初始化完毕而还要改变
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- struts1 源码 解读