原文地址:http://blog.youkuaiyun.com/haizhilei7/article/details/6702166
项目开发过程中不免有许多在运行过程中需要经常改动的参数,比如说数据库的连接参数等。把这些需要经常改动的参数保存在配置文件中,让用户可以修改,这样既增强了项目的适应能力,也减少了我们的维护成本。这种做法不失为一个很好选择。
不过,这并不是一个很新的技巧,在很早的Windows版本中就有大量的INI文件,还有功能更加强大的注册表。在课堂上我们已经学习了把Oracle的配置参数保存在属性文件(.properties)中,在运行的过程中读取使用,使用也比较简单,只需要查看一下Sun的JDK帮助文档,找到Properties类,使用该类的load()方法加载.properties文件,并用里面提供的getProperties(key)方法读取属性值就可以了。
但是使用properties文件也有它的不足之处,另外一种选择就是把配置参数保存在XML文件中,使用Apache 提供的Commons Configuration进行读取。Configuration可以操作如下类型的文件:
Properties files
XML documents
Windows INI files
Property list files (plist)
JNDI
JDBC Datasource
System properties
Applet parameters
Servlet parameters
今天就给大家举个用Apache Commons Configuration读取XML文件的例子,首先到http://apache.org下载Commons Configuration的jar包,最新版本是commons-configuration-1.5.jar并且还需要同时下载:
commons-lang-2.3.jar
commons-collections-3.2.jar
commons-logging-1.1.1.jar
这三个包是必须的,我下载的都是最新版本,版本不统一可能会出现问题,可以自己试验一下.我用的开发工具是Eclipse3.2。
使用Eclipse创建一个JAVA项目,在项目的根目录下创建一个AppConfig.xml,内容如下:
<?xml version="1.0" encoding="utf-8"?>
<项目配置>
<应用程序配置参数>
<考勤时间>
<上班时间>08:00:00</上班时间>
<下班时间>17:00:00</下班时间>
<迟到矿工时间分界点>08:30:00</迟到矿工时间分界点>
</考勤时间>
<加班费>30</加班费>
<满勤奖>35</满勤奖>
<个人所得税起征额>1000</个人所得税起征额>
</应用程序配置参数>
</项目配置>
然后再创建一个测试类:
package org.xdf.learn.conf;
import org.apache.commons.configuration.ConfigurationException;
import org.apache.commons.configuration.XMLConfiguration;
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
String file = "AppConfig.xml";
try {
XMLConfiguration config = new XMLConfiguration(file);
System.out.println("成功加载:" + file);
String btime = config.getString("应用程序配置参数.考勤时间.上班时间");
double basicm = config.getDouble("应用程序配置参数.个人所得税起征额");
System.out.println("上班时间:" + btime);
System.out.println("个人所得税起征额:" + basicm + "元");
} catch (ConfigurationException e) {
e.printStackTrace();
}
}
}
以下是测试结果:
成功加载:AppConfig.xml
上班时间:08:00:00
个人所得税起征额:1000.0元
相信大家在很多项目中已经见过类似的功能,比如说有时候我们修改Web项目的配置文件web.xml,Tomcat会自动重新启动我们的项目。Tomcat是怎么做到的呢,其实如果使用Commons Configuration的话,简单的很,只需要在原来的基础上再添加一句代码就够了:
config.setReloadingStrategy(new FileChangedReloadingStrategy());
下面我们编写一个Web项目测试一下这个功能,当然这个功能不是只能应用于Web项目。之所以选择Web项目,个人觉得这样做相对比较简单一些。
首先,创建一个Web项目:
Project name :CommonConfigurationAutomaticReloading
Web-root folder : WebRoot
Web Context-root :/ccar
然后,参考《Apache Commons Configuration使用入门》添加必要的包到项目的lib目录下,并添加到构建路径中,并把AppConfig.xml文件拷贝到项目的WEB-INF下。
接下来添加一个Servlet:
以下是web.xml中关于Servlet的配置,
<servlet>
<servlet-name>TestServlet</servlet-name>
<servlet-class>servlets.TestServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>TestServlet</servlet-name>
<url-pattern>/TestServlet</url-pattern>
</servlet-mapping>
以下是Servlet的Java源代码,
package servlets;
import java.io.IOException;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.configuration.ConfigurationException;
import org.apache.commons.configuration.XMLConfiguration;
import org.apache.commons.configuration.reloading.FileChangedReloadingStrategy;
public class TestServlet extends HttpServlet {
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
ServletContext application = this.getServletContext();
XMLConfiguration config = (XMLConfiguration)application.getAttribute("appConfig");
String btime = config.getString("应用程序配置参数.考勤时间.上班时间");
double basicm = config.getDouble("应用程序配置参数.个人所得税起征额");
System.out.println("上班时间:" + btime);
System.out.println("个人所得税起征额:" + basicm + "元");
}
@Override
public void init() throws ServletException {
String path = this.getServletContext().getRealPath("/");
String filename = path + "/WEB-INF/AppConfig.xml";
try {
XMLConfiguration config = new XMLConfiguration(filename);
config.setReloadingStrategy(new FileChangedReloadingStrategy());
System.out.println("成功加载:" + filename);
ServletContext application = this.getServletContext();
application.setAttribute("appConfig", config);
} catch (ConfigurationException e) {
e.printStackTrace();
}
}
}
最后,启动Tomcat并发布项目,控制台应该显示如下信息(类似):
成功加载:F:\jdev\apache-tomcat-6.0.14\webapps\ccar\/WEB-INF/AppConfig.xml
然后,打开浏览器,在地址栏里输入:http://localhost:8080/ccar/TestServlet并回车,控制台显示如下:
上班时间:08:00:00
个人所得税起征额:1000.0元
再修改AppConfig.xml的内容:
<个人所得税起征额>1000</个人所得税起征额>
= 〉
<个人所得税起征额>2000</个人所得税起征额>
保存之后,控制台显示如下信息:
2007-12-26 9:09:47 org.apache.commons.configuration.AbstractFileConfiguration reload
信息: Reloading configuration. URL is file:/F:/jdev/apache-tomcat-6.0.14/webapps/ccar/WEB-INF/AppConfig.xml
回到浏览器,刷新一下,控制台显示如下:
上班时间:08:00:00
个人所得税起征额:2000.0元