代码很简单,主要学习思路。
tomcat中处理消息提示的公用类 StringManager.java:
其实思路就是每个包名对应一个Stringmanager对象,而非所有公用一个S听ringmanager对象!
每个包中都有一个LocalStrings.properties的配置文件,定义公用提示信息
每个使用的类中都添加StringManager对象
每个包下都有常量文件Constants.java,其中定义常量Package为该文件DefaultServlet所在包名
使用:
public class DefaultServlet extends HttpServlet { //每个使用的类中都添加StringManager对象 //每个包下都有常量文件Constants.java,其中定义常量Package为该文件DefaultServlet所在包名 //public static final String Package = "org.apache.catalina.servlets"; protected static StringManager sm = StringManager.getManager(Constants.Package); ... //使用1 //directory.title为properties文件中的属性,可直接读取 sb.append(sm.getString("directory.title", name)); //使用2 throw new SAXException(sm.getString("defaultServlet.blockExternalEntity2"); ... }
StringManger.java中定义了一个ResourceBundle对象,用于读取相应包下的配置文件
同时定义一个Hashtable对象,使用Hashtable存放各包对应的StringManager对象,以便使用时直接通过get(packageName) 调用
public class StringManager { private ResourceBundle bundle; private static Hashtable managers = new Hashtable(); public synchronized static StringManager getManager(String packageName) { StringManager mgr = (StringManager)managers.get(packageName); if (mgr == null) { mgr = new StringManager(packageName); managers.put(packageName, mgr); } return mgr; } private StringManager(String packageName) { //获取各包下配置文件的路径 String bundleName = packageName + ".LocalStrings"; try { bundle = ResourceBundle.getBundle(bundleName); return; } catch( MissingResourceException ex ) { // Try from the current loader ( that's the case for trusted apps ) ClassLoader cl=Thread.currentThread().getContextClassLoader(); if( cl != null ) { try { bundle=ResourceBundle.getBundle(bundleName, Locale.getDefault(), cl); return; } catch(MissingResourceException ex2) { } } } } //get时,通过内部对象bundle读取properties文件内容 public String getString(String key) { return MessageFormat.format(getStringInternal(key), (Object [])null); } protected String getStringInternal(String key) { if (key == null) { String msg = "key is null"; throw new NullPointerException(msg); } String str = null; if( bundle==null ) return key; try { str = bundle.getString(key); } catch (MissingResourceException mre) { str = "Cannot find message associated with key '" + key + "'"; } return str; } }
。。。