2. 描述
a) Struts的资源国际化,用到了JDK如下类:
o java.text.MessageFormat
o java.util.ResourceBundle
o java.util.PropertyResourceBundle
o java.util.Properties
b) 相关类描述
i. MessageResources
1. 抽象类,已知子类PropertyMessageResources,可自行继承该类进行相关操作,(注意:继承的对象,必须实现 Serializable接口)。通过静态方法getMessageResources(String config)获取MessageResources,config参数为资源文件配置地址。
具体代码如下:
public synchronized static MessageResources getMessageResources(String config)
{
if (defaultFactory == null)
{
defaultFactory = MessageResourcesFactory.createFactory();
}
return defaultFactory.createResources(config);
}
2. 调用没有Locale的getMessage(String key)方法,获取默认的语言环境消息。
3. 如果传入的key在配置文件当中不存在,将会返回null,同时getReturnNull()方法将会返回true。
ii. MessageResourcesFactory
1. 抽象类,已知子类PropertyMessageResourcesFactory,可自行继承该类进行相关操作,通过静态方法createFactory()返回当前对象的单实例。具体代码入下:
/**
* Create and return a <code>MessageResourcesFactory</code> instance of the
* appropriate class, which can be used to create customized
* <code>MessageResources</code> instances. If no such factory can be
* created, return <code>null</code> instead.
*/
public static MessageResourcesFactory createFactory()
{
// Construct a new instance of the specified factory class
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);
}
}
iii. PropertyMessageResourcesFactory
1. 继承自PropertyMessageResourcesFactory实现了createResources(String config)方法,创建了一个PropertyMessageResources对象。
iv. PropertyMessageResources
1. 该类用于初始化资源文件,并根据传入的资源文件名称进行初始化内容并存入到HashMap当中.(注意:资源文件名称后缀名必须为Properties)
3. 处理流程
a) 系统启动加载ActionServlet,进入init方法,调用initInternal()初始化国际化资源文件到HashMap当中。
i. 先根据传入的路径,如:org.apache.struts.action.ActionResources,将“.”转换成“/”,再将Loacle转 换成对应语言的缩写(如中国:zh_CN),最后将路径进行拼接,并拼接上. properties,最后的路径结果为: org/apache/struts/action/ActionResources_zh.properties。
ii. 获取路径后,使用java.util.Properties对象进行加载资源文件,并将信息缓存到内存当中,结构:HashMap{locale.key,value}如HashMap{zh_CN.alertInfo,”提示信息”}。
iii. 根据locale, key设置和获取资源文件信息。
1. 根据传入的语言信息进行获取和设置资源文件信息,如果找到返回,没有找到——》2.
2. 根据本地语言信息获取资源文件信息,如果找到返回,没有找到——》3.
3. 使用不带Locale进行设置和获取资源文件信息,如果找到返回,没有找到——》4.
4. 如果returnNull参数为true,则返回null,否则返回"???Loacle.key???".
iv. 设置和获取资源文件信息,内存结构,一条信息对应一个MessageFormat,并存放在HashMap缓存当中,key值为,locale加key组 合成的formatKey,value为资源文件当中的value所构造成的MessageFormat,最后根据传入的args,进行格式化,args 主要用于设置在资源文件当中“{0},{1}”符号的值,数组下标对应资源文件当中的占位符,如果没有占位符,传入null。如果数组下标不够,占位符将 作为字符串进行处理并输出。
b) 在jsp当中,标签调用MessageResources获取资源文件,JAVA类当中使用MessageResources获取资源文件。
下载地址 http://www.haowanw.com/bbs/viewthread.php?tid=946&extra=page%3D1