`
mr_wangjq
  • 浏览: 40829 次
  • 性别: 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
分享到:
评论

相关推荐

    Spring+iBatis+JDom递归生成XML树

    1. **初始化**:启动Spring应用上下文,加载配置文件,包括Spring的bean定义以及iBatis的SqlSessionFactory配置。 2. **数据获取**:使用iBatis的DAO接口执行SQL查询,获取需要转换为XML格式的数据。这些数据可能是...

    jdom-1.1.1 和API

    通过查阅API文档,你可以学习如何初始化XML文档、查找和修改元素、处理命名空间,以及如何进行XML的序列化和反序列化等操作。 此外,压缩包中的“简单说明”可能包含了一些基本的使用示例和注意事项,对于初学者来...

    java 使用JDOM解析xml文件

    通过以上步骤,我们可以轻松地从XML配置文件中读取数据,并将其转换为Java对象,便于在应用程序中使用。不过,需要注意的是,实际应用中可能还需要处理异常,进行类型检查,以及更复杂的对象初始化逻辑。

    JAVA生成XML文件.doc

    1. **初始化文件**: - 首先定义了一个文件路径:`"c:\\text.xml"`。 - 使用`new File(filename)`创建了一个`File`对象,用于表示这个文件。 - 检查文件是否已经存在,如果存在,则尝试删除它。这一步确保每次...

    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源码包---java 源码 大量 实例

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

    spring中的BeanFactory解析xml文件

    当我们谈论“Spring中的BeanFactory解析XML文件”时,我们实际上是在讨论如何通过XML配置文件来定义、创建和管理bean。这篇文章将深入探讨BeanFactory的工作原理,以及XML配置文件在其中的作用。 首先,BeanFactory...

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

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

    java源码包2

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

    java源码包3

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

    自已实现spring ioc功能代码 jdk1.6的一些新特性

    在这里,我们将使用JDOM解析XML配置文件,这些配置文件通常用来定义对象及其依赖关系,就像在Spring中那样。 1. **创建配置文件** 创建一个XML配置文件,例如`beans.xml`,来定义Bean(即Java对象)和它们的依赖...

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

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

    DOM4J读取XML

    这通常用于确定资源文件(如XML配置文件)的位置。在Java中,资源文件可以被放置在项目的类路径下,例如在src/main/resources目录中,通过这种方式获取路径,可以确保无论项目是在开发环境中还是部署后的环境中,都...

    java源码包4

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

    DBCP数据库连接池借鉴.pdf

    1. 加载配置:读取XML配置文件,创建并初始化多个`BaseConnBean`对象。 2. 创建连接池:根据配置信息,使用DBCP提供的`BasicDataSource`类实例化每个连接池。 3. 获取连接:在需要访问数据库时,通过连接池的`get...

    反射模拟springIOC.rar

    在Spring中,反射被用来解析XML配置文件,创建和初始化对象。在这个例子中,我们使用了JDOM库来解析XML文件,JDOM是一个用于处理XML文档的API,提供了构建、修改和操作XML文档的功能。 下面我们将详细阐述Spring ...

    DBCP数据库连接池[参照].pdf

    `BaseConnBean`类是用来表示XML配置文件中的每个数据库连接池的Java对象。它包含了连接池所需的所有属性,如名称、用户名、密码、JDBC URL、最大连接数、等待时间和驱动类名,并提供了对应的getter和setter方法。 `...

    Commons-digesterXML解析Demo

    这个库特别适用于那些需要频繁解析XML配置文件的项目,它可以减少手动编写XML解析代码的工作量,提高代码的可读性和可维护性。在"Commons-digesterXML解析Demo"中,我们将探讨如何利用Digester库来实现这一功能。 1...

    java反射实例

    而"jdom.jar"则可能是一个依赖库,它可能用于处理XML文档,这在某些反射应用场景中可能是必要的,比如读取或写入配置文件,这些文件可能以XML格式存储。 在Java反射API中,`java.lang.Class`是核心类,它是所有类的...

Global site tag (gtag.js) - Google Analytics