更新时间:2022-05-15 10:41:56
Webwork做为经典的Web MVC 框架,个人觉得源码中配置文件这部分代码的实现十分考究。
支持自定义自己的配置文件、自定义配置文件读取类、自定义国际化支持。
可以作为参考,单独引入到其他项目中,下面是Configuration相关类的继承关系:
Configuration.getString("webwork.locale")
1 public static String getString(String name) throws IllegalArgumentException { 2 String val = get(name).toString(); 3 return val; 4 }
1 public static Object get(String name) throws IllegalArgumentException { 2 Object val = getConfiguration().getImpl(name); 3 return val; 4 } 5 6 public static Configuration getConfiguration() { 7 return configurationImpl == null ? getDefaultConfiguration() : configurationImpl; 8 }
(这里要说一下,随意变动上线系统的配置文件,你会悲剧的,修改前记得问清楚)
1 private static Configuration getDefaultConfiguration() { 2 if (defaultImpl == null) { 3 defaultImpl = new DefaultConfiguration(); 4 try { 5 String className = getString("webwork.configuration"); 6 if (!className.equals(defaultImpl.getClass().getName())) { 7 try { 8 defaultImpl = (Configuration) ObjectFactory.getObjectFactory().buildBean(Thread.currentThread().getContextClassLoader().loadClass(className)); 9 } catch (Exception e) { 10 log.error("Could not instantiate configuration", e); 11 } 12 } 13 return defaultImpl; 14 } catch (IllegalArgumentException localIllegalArgumentException) { 15 } 16 } 17 return defaultImpl; 18 }
(这里需要说一下,default.properties 是webwork 框架自身的配置文件,封装在 jar 中,假如你在项目的 web.properties 中定义了与 default.properties 相同的参数,看上面程序配置文件的加载顺序,框架先加载你的配置文件,然后加载默认配置文件,你会发现你的参数是不会起作用的,如果你想让你的参数覆盖框架中的,这里你需要自定义配置文件,并且在 项目 webwork.properties 中配置 webwork.custom.properties 参数)
(毕竟是好多年前编写的源码,这里面的 StringTokenizer 出于兼容性的原因已经被遗留(虽然在新代码中并不鼓励使用它)。API 中建议所有寻求此功能的人使用 String 的 split 方法或 java.util.regex 包)
1 public void setImpl(String name, Object value) throws IllegalArgumentException, UnsupportedOperationException { 2 IllegalArgumentException e = null; 3 for (int i = 0; i < this.configList.length; i++) { 4 try { 5 this.configList[i].getImpl(name); 6 7 this.configList[i].setImpl(name, value); 8 9 return; 10 } catch (IllegalArgumentException ex) { 11 e = ex; 12 } 13 } 14 throw e; 15 }
WebWork不支持动态的增加属性配置,但允许修改已配置的属性, configList[i].getImpl(name); 调用的是 PropertiesConfiguration 的 getImpl 方法,实现如下:
1 public Object getImpl(String aName) throws IllegalArgumentException { 2 Object setting = this.settings.get(aName); 3 if (setting == null) { 4 throw new IllegalArgumentException("No such setting:" + aName); 5 } 6 return setting; 7 }
PropertiesConfiguration 会在settings 里去找name,如果找到就返回配置信息,在 DelegatingConfiguration 的setImpl 方法中通过configList[i].setImpl(name, value)修改该属性的配置,否则抛IllegalArgumentException 异常,该异常在 DelegatingConfiguration 的 getImpl 方法中截 获 ,继续往被调用函数抛。 此时则不会执行 configList[i].setImpl(name, value);从而保证了只有配置过了的属性可以被修改,在服务运行的过程中不会有新增的属性,所有的属性都由 Web 服务第一次启动的时候加载。
以上分析我们可以看见,Web 服务启动的时候,ServletDispatcher 通过 DefaultConfiguration 先 加 载 webwork.properties 和 default.properties , 并 查 找 webwork.properties中webwork.custom.properties 配置的其他属性文件加载。加载完毕 后再通过属性中配置的 webwork.custom.i18n.resources 加载国际化资源文件供以后 使用。之后再查找 webwork.configuration 属性看是否用户指定了自己的 Configuration 实现,如果有就用用户自己的Configuration 实现,否则返回WebWork 自己的实现(DelegatingConfiguration)。大部分情况下,使用 WebWork 自己的实现 已经足够,用户不需要自己去实现一个 Configuration,除非你想加载XML等格式的配 置文件。
本文转自Orson博客园博客,原文链接:http://www.cnblogs.com/java-class/p/5113897.html,如需转载请自行联系原作者