Web 开发中公共属性已配置方式设计
2015-08-17 23:21
441 查看
什么情况下使用配置文件的方式设计
在web开发中,经常遇见一些用作项目配置的属性,比如说采用何种主题加载对应模块下的页面,使用项目的何种模式(debug,publish 等),还有设置项目的一些修改配置之类的东西,等等。这些东西都可以做成配置文件的方式,开发的时候只要修改配置文件就可以了那么在涉及到这样的问题的时候,我们怎么设计比较好呢?
方式一
使用Properties做一个工具类,读取属性文件,做成单例实例:
package fun.util; import java.io.IOException; import java.io.InputStream; import java.util.Properties; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class PropertyHelper { private static Logger logger = LoggerFactory.getLogger(PropertyHelper.class); private static Properties property=null; private static Properties initProperty(){ InputStream in = PropertyHelper.class.getClassLoader() .getResourceAsStream("config/sysconf.properties"); property = new Properties(); try { property.load(in); } catch (IOException e) { logger.error(e.toString()); e.printStackTrace(); } return property; } synchronized public static String getProperty(String key){ if(property == null){ property = initProperty(); } return property.getProperty(key); } }
属性的配置文件 config/sysconf.properties
这种方法实现,方便,简单,但是会出现一个问题,属性文件写在代码里面,修改属性文件的位子就必须要修改源代码,比如将 属性文件位子修改为 cfg/cfg.propertes
方式二
对Properties的改造,自顶义一个类实现ServletContextListener,做成一个listener,这样只在web应用启动的时候加载。而这个类中存储一个Properties的类做为成员变量(如果属性文件有多个的时候可以用一个List或者Mappackage fun.util; import java.io.IOException; import java.io.InputStream; import java.util.HashMap; import java.util.Map; import java.util.Properties; import javax.servlet.ServletContext; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * * <code>{@link AppConfigPropertyHelper}</code> * * TODO : 应用配置属性获取的类,实现listener接口,web应用启动的时候初始话, * 取出里面属性文件的值,在应用中使用 * * @author fun */ public class AppConfigPropertyHelper implements ServletContextListener { Logger logger = LoggerFactory.getLogger(AppConfigPropertyHelper.class); private static Map<String,Properties> props = new HashMap<String,Properties>(); @Override public void contextDestroyed(ServletContextEvent arg0) { // TODO implement ServletContextListener.contextDestroyed props.clear(); } @Override public void contextInitialized(ServletContextEvent arg0) { //arg0作为配置文件路径名,多个文件用','隔开 ServletContext context = arg0.getServletContext(); String propPaths = context.getInitParameter("appConfigPropPath").toString();//获取用户定义的web应用的路径 System.out.println("=============================="+propPaths+"============================="); //通过类加载目录getClassLoader()加载属性文件 InputStream in = AppConfigPropertyHelper.class.getClassLoader() .getResourceAsStream(propPaths.substring(propPaths.lastIndexOf(":")+1)); Properties prop = new Properties(); try { prop.load(in); } catch (IOException e) { logger.error("读取配置文件出错"); e.printStackTrace(); } String propName = propPaths.contains("/") ? propPaths.substring(propPaths.lastIndexOf("/")+1,propPaths.lastIndexOf(".")): propPaths.substring(propPaths.lastIndexOf(":")+1,propPaths.lastIndexOf(".")); System.out.println(propName+"==================="); AppConfigPropertyHelper.props.put(propName, prop); System.out.println("listent init ok======================"); System.out.println("Map props="+AppConfigPropertyHelper.getProps()); } /** * 获取属性值 * @param propName * @param key * @return */ public static String getPropertyByName(String propName,String key){ Map<String, Properties> m = AppConfigPropertyHelper.getProps(); Properties p = (Properties)m.get(propName); if(p == null){ return null; }else{ return p.getProperty(key); } } /** * @return the props */ private static Map<String, Properties> getProps() { return AppConfigPropertyHelper.props; } }
这种方法是对方法一的改造,把变量属性的初始化放在contextInitialized,这样就需要配置一个listener,好处是可以在we.xml以配置的方式实现加载那个(或那几个)属性文件
方式三
利用Spring的PropertyPlaceholderConfigurer 加载属性文件,配合一个配置的bean,每一个配置项都是这个bean的一个属性(类似dataSource的实现)例如:
package fun.util; public class SysConf { private String theme; public SysConf() { super(); // TODO Auto-generated constructor stub } /** * @return the theme */ public String getTheme() { return theme; } /** * @param theme the theme to set */ public void setTheme(String theme) { this.theme = theme; } }
这种方式利用spring的PropertyPlaceholderConfigurer 去加载属性的值,需要配置bean对应属性文件的中key 建立相应的成员变量。在spring的容器里面也要配置这个bean。
此方法改造,可以在bean只放一个属性文件的地址,在bean里面做类似方法一的做法,解决一中的不足。缺点还是要在spring中配置bean
相关文章推荐
- java-WEB中的监听器Lisener
- GUI - Web前端开发框架
- Extjs4.0 最新最全视频教程
- MyEclipse Web Project转Eclipse Dynamic Web Project
- axis备忘
- Erlang实现的一个Web服务器代码实例
- 防止网页脚本病毒执行的方法-from web
- 自学成才的秘密:115个 web Develop 资源
- 使用批处理修改web打印设置笔记 适用于IE
- Apache Web让JSP“动”起来
- web下载的ActiveX控件自动更新
- 推荐六款WEB上传组件性能测试与比较第1/10页
- 关于三种主流WEB架构的思考
- 使用 Iisext.vbs 列出 Web 服务扩展文件的方法
- 使用 Iisext.vbs 删除 Web 服务扩展文件的方法
- 使用 iisext.vbs 禁用 Web 服务扩展的方法
- 用vbs 实现从剪贴板中抓取一个 URL 然后在浏览器中打开该 Web 站点
- web标准知识——从p开始,循序渐进
- web标准知识――用途相似的标签
- Shell脚本实现的一个简易Web服务器例子分享