Tomcat源码分析(六)--日志记录器和国际化(二)

2014-11-24 08:41:39 · 作者: · 浏览: 4
dle,这个类提供了国际化的方便。这个类的作用就是读取.properties文件,但是会根据文件名来获取当前系统的语言信息,然后读取对应文件的属性值。当然首先要有各国不同的属性文件,才能国际化,Tomcat的每个包下都有几个不同的属性文件,org.apache.catalina.logger包下有如下三个属性文件:
[java] www.2cto.com
LocalStrings_es.properties
LocalStrings_ja.properties
LocalStrings.properties
分别表示三种语言的属性文件。LocalStrings.properties属性文件是默认的属性文件。看LocalStrings.properties属性中的内容:
[java]
fileLogger.alreadyStarted=File Logger has already been started
fileLogger.notStarted=File Logger has not yet been started
tomcatLogger.alreadyStarted=Tomcat Logger has already been started
tomcatLogger.notStarted=Tomcat Logger has not yet been started

ResourceBundle类通过getBundle方法获取,参数是属性文件的包名家名字前缀,上面就是包名加LocalStrings。通过getString(String key)方法获取属性文件中的参数:
现在来看代码sm.getString("fileLogger.alreadyStarted"),sm是StringManager的实例,在FileLogger中已经初始化:
[java]
private StringManager sm =StringManager.getManager(Constants.Package);
Constants.Package得到包的名字,getManager方法代码如下:
[java]
public synchronized static StringManager getManager(String packageName) {
StringManager mgr = (StringManager)managers.get(packageName);
if (mgr == null) {
mgr = new StringManager(packageName);//新建一个StringManager
managers.put(packageName, mgr);
}
return mgr;
}

代码很好理解,如果已经有StringManager实例了就直接从managers(这是一个Hashtable)中拿,没有就新建一个。看StringManager的构造方法:
[java]
private StringManager(String packageName) {
String bundleName = packageName + ".LocalStrings";
bundle = ResourceBundle.getBundle(bundleName);
}
看到我们熟悉的ResourceBundle类了,根据上面的讲解,ResourceBundle.getBundle(bundleName)能拿到默认的属性文件,也就是上面的LocalStrings.properties文件。再回到sm.getString("fileLogger.alreadyStarted"),看sm的getString方法:
[java]
public String getString(String key) {
if (key == null) {
String msg = "key is null";

throw new NullPointerException(msg);
}

String str = null;

try {
str = bundle.getString(key);
} catch (MissingResourceException mre) {
str = "Cannot find message associated with key '" + key + "'";
}

return str;
}

重点是budle.getString(key),这句代码能拿到LocalStrings.properties文件的key属性(这里是fileLogger.alreadyStarted)的值,即File Logger has already been started。这样我们便能定义多个属性文件,一个表示英文,一个表示汉语,一个属性文件表示一个语言,就能实现应用的国际化了。


作者:haitao111313