`
mr_wangjq
  • 浏览: 39202 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

JAVA项目使用jdom初始化xml配置文件类

阅读更多

 单例模式加载配置文件类

 

使用架包:jdom-2.0.5.jar、log4j-1.2.17.jar

代码:

package com.wjq.project.loadFile;

import java.io.InputStream;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.apache.log4j.Logger;
import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.input.SAXBuilder;


/**
 * @Title:JAVA项目初始化xml配置文件类
 * @Description: 使用jdom解析xml配置文件; 使用单例模式初始化类; 定时重新加载配置文件,时间可配
 * @author wjq
 * @date 2013-07-19
 */
public class LoadXmlFile_jdom {
	//日志
	private static Logger log = Logger.getLogger(LoadXmlFile_jdom.class);
	//配置文件
	private static final String CONFIG_FILE = "loadFile_loadXmlFile.xml";
	
	//dom4j 对象
	private Document document=null;
	
	//IP地址
	private String ip = null;
	//端口号
	private String port = null;
	//重启加载配置文件周期,默认值:12,单位:小时
	private int reloadTime=12;
	//告警级别转换
	private Map<String, String> alarmLevelsMap=new HashMap<String, String>();
	//工单状态数据转换
	private Map<String, String> sheetStatusTransMap=new HashMap<String, String>();
	
	
	/////////////////////////////////////////////	单例模式 start	/////////////////////////////////////////////
	/**
	 * 私有化构造方法
	 */
	private LoadXmlFile_jdom(){
		log.info("加载配置文件: "+CONFIG_FILE);
		loadConfig();
		
		//开启定时加载配置文件的线程
		Thread reloadConfFile = new Thread(new ReloadConfFile());
		reloadConfFile.start();
	}

	/**
	 * 内部静态类,实例化本类对象
	 * @author wjq
	 *
	 */
	public static class ClassInstance{
		//在内部静态类中实例化LoadXmlFile对象
		private static final LoadXmlFile_jdom instance=new LoadXmlFile_jdom();
	}
	
	/**
	 * 对外提供本类实例化对象
	 * @return
	 */
	public static LoadXmlFile_jdom getInstance(){
		return ClassInstance.instance;
	}
	/////////////////////////////////////////////	单例模式 end	/////////////////////////////////////////////
	
	

	/**
     * 加载配置文件信息
     */
    private void loadConfig() {
    	try {
    		InputStream inputStream = LoadXmlFile_jdom.class.getResourceAsStream("/project/"+CONFIG_FILE);
        	if(inputStream!=null){
        		SAXBuilder builder = new SAXBuilder();
        		this.document = builder.build(inputStream);
    			if(document==null){
    				return;
    			}
    			
    			this.ip=loadSingleNode("myProject/ip");
    			this.port=loadSingleNode("myProject/port");
    			this.reloadTime=Integer.valueOf(loadSingleNode("myProject/reloadTime"));
    			this.alarmLevelsMap=loadAttributeMap("myProject/alarmLevels");
    			this.sheetStatusTransMap=loadTextMap("myProject/sheetStatusTrans");
        	}else{
        		log.error("配置文件不存在,请确认已经将配置文件["+CONFIG_FILE+"]已经放在[project]目录下");
        	}
		} catch (Exception e) {
			log.error("解析配置文件["+CONFIG_FILE+"]异常",e);
		}
    }
    
    /**
	 * ReloadConfFile thread
	 * 定时重新加载xml配置文件 线程
	 * 默认每隔12小时加载一次xml配置文件,
	 * @author wjq
	 */
	private class ReloadConfFile implements Runnable {
		public void run() {
			// TODO Auto-generated method stub
			while(true) {
				try {
					Thread.sleep(reloadTime*60*60*1000);
				} catch (InterruptedException e) {
				}
				log.info("重新加载配置文件:"+CONFIG_FILE);
				loadConfig();
			}
		}
	}
	
    
    /**
     * 获取单个节点的文本值
     * @param nodePath
     * @return
     */
    private String loadSingleNode(String nodePath){
    	Element root = document.getRootElement();
		String[] elementsName = nodePath.split("\\/");
		for (int i = 0; i < elementsName.length; i++) {
			root = root.getChild(elementsName[i]);
		}
	
		String nodeText =root.getTextTrim();
		log.info(root.getName()+"="+nodeText);
		return nodeText;
    }
    
    
    
    /**
     * 加载from、to在元素属性节点上的转换关系
     * from为key、to为value
     * @param nodePath 节点路径
     * @return
     */
	private Map<String, String> loadAttributeMap(String nodePath){
		Map<String, String> fromToMap=new HashMap<String, String>();
		//日志信息
		String logMessage="";
		
		//先清空Map内容
		fromToMap.clear();
		Element root = document.getRootElement();
		String[] elementsName = nodePath.split("\\/");
		for (int i = 0; i < elementsName.length; i++) {
			root = root.getChild(elementsName[i]);
		}
		logMessage=root.getName()+":[";
		
		List childrenList = root.getChildren();
		Iterator iter=childrenList.iterator();
		while(iter.hasNext()) {
			Element el=(Element)iter.next();
			String key= el.getAttributeValue("from").trim();
			String value= el.getAttributeValue("to").trim();
			fromToMap.put(key, value);
			logMessage=logMessage+";from="+key+",to="+value;
		}
		
		logMessage=logMessage.replaceFirst(";", "")+"]";
		log.info(logMessage);
		
		return fromToMap;
	}
	
	/**
	 * 加载from、to为单独元素的转换关系
	 * from为key、to为value
	 * @param nodePath 节点路径
	 * @return
	 */
	private Map<String, String> loadTextMap(String nodePath){
		Map<String, String> fromToMap=new HashMap<String, String>();
		//日志信息
		String logMessage="";
		
		//先清空Map内容
		fromToMap.clear();
		Element root = document.getRootElement();
		String[] elementsName = nodePath.split("\\/");
		for (int i = 0; i < elementsName.length; i++) {
			root = root.getChild(elementsName[i]);
		}
		logMessage=root.getName()+":[";
		
		List childrenList = root.getChildren();
		Iterator iter=childrenList.iterator();
		while(iter.hasNext()) {
			Element el=(Element)iter.next();
			String key= el.getChild("from").getTextTrim();
			String value= el.getChild("to").getTextTrim();
			fromToMap.put(key, value);
			logMessage=logMessage+";from="+key+",to="+value;
		}
		
		logMessage=logMessage.replaceFirst(";", "")+"]";
		log.info(logMessage);
		
		return fromToMap;
	}
    

	public String getIp() {
		return ip;
	}

	public void setIp(String ip) {
		this.ip = ip;
	}

	public String getPort() {
		return port;
	}
	public void setPort(String port) {
		this.port = port;
	}

	public Map<String, String> getAlarmLevelsMap() {
		return alarmLevelsMap;
	}

	public void setAlarmLevelsMap(Map<String, String> alarmLevelsMap) {
		this.alarmLevelsMap = alarmLevelsMap;
	}

	public Map<String, String> getSheetStatusTransMap() {
		return sheetStatusTransMap;
	}

	public void setSheetStatusTransMap(Map<String, String> sheetStatusTransMap) {
		this.sheetStatusTransMap = sheetStatusTransMap;
	}


	/**
	 * @param args
	 */
	public static void main(String[] args) {
		System.out.println("使用jdom加载xml配置文件");
		LoadXmlFile_jdom loadXmlFile=LoadXmlFile_jdom.getInstance();
	}
}

 

 

配置文件:
<?xml version="1.0" encoding="Gb2312"?>
<config>
	<myProject>
		<!-- IP地址 -->
		<ip>127.0.0.1</ip>
		<!-- 端口号 -->
		<port>51088</port>

		<!-- 第一种数据转换方法  from为key、to为value-->
		<alarmLevels>
			<level from="紧急告警" to="1" />
			<level from="重要告警" to="2" />
			<level from="次要告警" to="3" />
			<level from="警告告警" to="4" />
		</alarmLevels>

		<!-- 第二种数据转换方法  from为key、to为value-->
		<sheetStatusTrans>
			<sheetStatusRecord>
				<from>草稿</from><to>1</to>
			</sheetStatusRecord>
			<sheetStatusRecord>
				<from>一级处理中</from><to>2</to>
			</sheetStatusRecord>
			<sheetStatusRecord>
				<from>二级处理中</from><to>3</to>
			</sheetStatusRecord>
			<sheetStatusRecord>
				<from>三级处理中</from><to>4</to>
			</sheetStatusRecord>
		</sheetStatusTrans>
		
		<!-- 重新读取配置文件周期,默认值:12,单位:小时 -->
		<reloadTime>12</reloadTime>
	</myProject>
</config>
 
0
0
分享到:
评论

相关推荐

    DWR.xml配置文件说明书(含源码)

    DWR.xml配置文件说明书 1、 建立dwr.xml 配置文件 任何一个dwr.xml的文件都需要包含DWR DOCTYPE的声明行,格式如下: &lt;!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 1.0//EN" ...

    JAVA上百实例源码以及开源项目源代码

    1个目标文件,JNDI的使用例子,有源代码,可以下载参考,JNDI的使用,初始化Context,它是连接JNDI树的起始点,查找你要的对象,打印找到的对象,关闭Context…… ftp文件传输 2个目标文件,FTP的目标是:(1)提高...

    java源码包---java 源码 大量 实例

    1个目标文件,JNDI的使用例子,有源代码,可以下载参考,JNDI的使用,初始化Context,它是连接JNDI树的起始点,查找你要的对象,打印找到的对象,关闭Context…… ftp文件传输 2个目标文件,FTP的目标是:(1)提高...

    JAVA上百实例源码以及开源项目

    1个目标文件,JNDI的使用例子,有源代码,可以下载参考,JNDI的使用,初始化Context,它是连接JNDI树的起始点,查找你要的对象,打印找到的对象,关闭Context…… ftp文件传输 2个目标文件,FTP的目标是:(1)提高...

    成百上千个Java 源码DEMO 4(1-4是独立压缩包)

    EJB中JNDI的使用源码例子 1个目标文件,JNDI的使用例子,有源代码,可以下载参考,JNDI的使用,初始化Context,它是连接JNDI树的起始点,查找你要的对象,打印找到的对象,关闭Context…… ftp文件传输 2个目标文件...

    java源码包4

    1个目标文件,JNDI的使用例子,有源代码,可以下载参考,JNDI的使用,初始化Context,它是连接JNDI树的起始点,查找你要的对象,打印找到的对象,关闭Context…… ftp文件传输 2个目标文件,FTP的目标是:(1)提高...

    java源码包3

    1个目标文件,JNDI的使用例子,有源代码,可以下载参考,JNDI的使用,初始化Context,它是连接JNDI树的起始点,查找你要的对象,打印找到的对象,关闭Context…… ftp文件传输 2个目标文件,FTP的目标是:(1)提高...

    java源码包2

    1个目标文件,JNDI的使用例子,有源代码,可以下载参考,JNDI的使用,初始化Context,它是连接JNDI树的起始点,查找你要的对象,打印找到的对象,关闭Context…… ftp文件传输 2个目标文件,FTP的目标是:(1)提高...

    成百上千个Java 源码DEMO 3(1-4是独立压缩包)

    EJB中JNDI的使用源码例子 1个目标文件,JNDI的使用例子,有源代码,可以下载参考,JNDI的使用,初始化Context,它是连接JNDI树的起始点,查找你要的对象,打印找到的对象,关闭Context…… ftp文件传输 2个目标文件...

    JAVA 范例大全 光盘 资源

    常见问题 for循环初始化问题 31 .第4章 数组 32 实例13 一维数组复制、插入和合并 32 实例14 数组排序 35 实例15 数组搜索 37 实例16 去掉数组重复数字 39 实例17 求质数(素数) 41 实例18 矩阵的加减和转置...

    Java语言基础下载

    Hibernate的初始化 687 访问Hibernate的Session接口 688 Hibernate工作原理图 691 内容总结 693 独立实践 693 第三十五章: 映射继承关系 694 学习目标 694 域模型关系 695 继承关系树的每个具体类对应一个表 696 ...

    java面试宝典

    141、使用useBean标志初始化BEAN时如何接受初始化参数 36 142、使用JSP如何获得客户浏览器的信息? 36 143、能象调用子程序一样调用JSP吗? 36 144、当我重编译我的JSP使用的一个类后,为什么JVM继续使用我的老CLASS...

    java web 视频、电子书、源码(李兴华老师出版)

    9.5、取得初始化配置信息 9.6、取得其他内置对象 9.6.1、取得HttpSession实例 9.6.2、取得ServletContext实例 9.7、Servlet跳转 9.7.1、客户端跳转 9.7.2、服务器端跳转 9.8、WEB开发模式:Mode I与...

    李兴华Java Web开发实战经典.pdf (高清版) Part1

    9.5、取得初始化配置信息 9.6、取得其他内置对象 9.6.1、取得HttpSession实例 9.6.2、取得ServletContext实例 9.7、Servlet跳转 9.7.1、客户端跳转 9.7.2、服务器端跳转 9.8、WEB开发模式:Mode I与...

    MLDN+李兴华+Java+Web开发实战经典.part3.rar )

    9.5、取得初始化配置信息 9.6、取得其他内置对象 9.6.1、取得HttpSession实例 9.6.2、取得ServletContext实例 9.7、Servlet跳转 9.7.1、客户端跳转 9.7.2、服务器端跳转 9.8、WEB开发模式:Mode I与...

    李兴华Java Web开发实战经典(高清版) Part2

    9.5、取得初始化配置信息 9.6、取得其他内置对象 9.6.1、取得HttpSession实例 9.6.2、取得ServletContext实例 9.7、Servlet跳转 9.7.1、客户端跳转 9.7.2、服务器端跳转 9.8、WEB开发模式:Mode I与...

    李兴华 Java Web 开发实战经典_带源码_高清pdf 带书签 上

    9.5、取得初始化配置信息 9.6、取得其他内置对象 9.6.1、取得HttpSession实例 9.6.2、取得ServletContext实例 9.7、Servlet跳转 9.7.1、客户端跳转 9.7.2、服务器端跳转 9.8、WEB开发模式:Mode I与Mode II ...

Global site tag (gtag.js) - Google Analytics