在tomcat启动时解析xml文件,获取特定标签的属性值,并将属性值设置到静态变量里

这里以解析hibernate.cfg.xml数据库配置信息为例,运用dom4j的解析方式来解析xml文件。

1.在javaWeb工程里新建一个java类,命名为GetXmlValue.java,为xml文件解析工具类。

public class GetXmlValue {
    //xml文件解析工具类
}

2.新建三个私有的静态变量,用以保存xml文件解析出来的数据库连接地址、用户名、登录密码,并创建相对应的get和set方法。

 1 public class GetXmlValue {
 2 
 3     private static String url;
 4     private static String username;
 5     private static String password;
 6 
 7     public static String getUrl() {
 8         return url;
 9     }
10 
11     public static void setUrl(String url) {
12         GetXmlValue.url = url;
13     }
14 
15     public static String getUsername() {
16         return username;
17     }
18 
19     public static void setUsername(String username) {
20         GetXmlValue.username = username;
21     }
22 
23     public static String getPassword() {
24         return password;
25     }
26 
27     public static void setPassword(String password) {
28         GetXmlValue.password = password;
29     }
30     
31 }

3.在将xml文件解析为Document对象之后,用一个Map集合来存放Document对象里面每一个节点的名称和节点对象,

由于节点名称可能相同而Map集合的key值是唯一的,所以这里每一个Map集合只存一个节点的信息,将所有的Map放到一个List集合里面,

则这个LIst节后存放的就是xml文件里所有节点(根节点和所有子节点)的信息。由于xml节点呈树状结构,这里就要涉及到递归了,

于是提前写好将Document对象的所有节点存放到LIst集合的方法。

 1 /**
 2        * dom4j递归解析所有子节点
 3        * 
 4        * @param childElements
 5        * @param mapEle
 6        * @return
 7        */
 8       public static List<Map<String, Object>> getElementsToDocument(Document document) {
 9           List<Map<String,Object>> listEle = null;
10             try{
11                 //根节点
12                 Element root = document.getRootElement();
13                 //子节点
14                 @SuppressWarnings("unchecked")
15                 List<Element> childElements = root.elements();
16                 listEle = new ArrayList<Map<String, Object>>();
17                 //遍历子节点
18                 listEle = getAllElements(childElements,listEle);
19             }catch(Exception e){
20                 e.printStackTrace();
21             }
22             return listEle;
23       }
24       
25       /**
26        * dom4j递归解析所有子节点
27        * 
28        * @param childElements
29        * @param mapEle
30        * @return
31        */
32       @SuppressWarnings("unchecked")
33     public static List<Map<String, Object>> getAllElements(List<Element> childElements,List<Map<String,Object>> listEle) {
34       for (Element ele:childElements){
35           Map<String,Object> mapEle = new HashMap<String, Object>();
36           mapEle.put(ele.getName(), ele);
37           listEle.add(mapEle);
38           if(ele.elements().size()>0){
39               listEle = getAllElements(ele.elements(), listEle);
40           }
41       }
42       return listEle;
43   }

4.接下来要写主要逻辑了。

4.1 首先创建SAXReader的对象reader;

4.2 获取带解析xml文件的文件路径;

4.3 将xml文件加载成Document对象;

4.4 将Document对象转为List集合;

4.5 遍历List集合得到map集合,遍历map集合得到特定xml标签的文本值,将值set到相对应静态变量里。

整个java类的代码如下:

 14 
 15 /**
 16  * xml文件解析工具类
 17  * 
 18  * @author ZHN
 19  * @version 2017-09-19 18:13:24
 20  */
 21 public class GetXmlValue {
 22 
 23     private static String url;
 24     private static String username;
 25     private static String password;
 26 
 27     /**
 28      * 解析xml文件将配置信息写入静态变量
 29      * 
 30      * @param args
 31      * @return List<String>
 32      */
 33     public static void getValue() {
 34         // 解析hibernate.cfg.xml文件
 35         // 创建SAXReader的对象reader
 36         SAXReader reader = new SAXReader();
 37         String path1 = DBUtil.class.getResource("").getPath().replaceAll("%20", " ");
 38         String path2 = path1.substring(0, path1.indexOf("WEB-INF")) + "WEB-INF/classes/";
 39         try{
 40             // 通过reader对象的read方法加载books.xml文件,获取docuemnt对象。
 41             Document document = reader.read(new File(path2+"hibernate.cfg.xml"));
 42             List<Map<String, Object>> listEle = getElementsToDocument(document);
 43             for (Iterator<Map<String, Object>> it = listEle.iterator(); it.hasNext();){
 44                 Map<String, Object> map = it.next();
 45                 for(String key:map.keySet()){
 46                     Element value = (Element)map.get(key);
 47                     if("property".equals(key)){
 48                         // 获取value的属性名以及 属性值
 49                         @SuppressWarnings("unchecked")
 50                         List<Attribute> valueAttrs = value.attributes();
 51                         for(Attribute attr:valueAttrs){
 52                             if("name".equals(attr.getName())&&"connection.url".equals(attr.getValue())){
 53                                 setUrl(value.getTextTrim());
 54                             }
 55                             if("name".equals(attr.getName())&&"connection.username".equals(attr.getValue())){
 56                                 setUsername(value.getTextTrim());
 57                             }
 58                             if("name".equals(attr.getName())&&"connection.password".equals(attr.getValue())){
 59                                 setPassword(value.getTextTrim());
 60                             }
 61                         }
 62                     }
 63                 }
 64             }
 65         }catch(Exception e){
 66             e.printStackTrace();
 67         }
 68     }
 69     
 70     /**
 71        * dom4j递归解析所有子节点
 72        * 
 73        * @param childElements
 74        * @param mapEle
 75        * @return
 76        */
 77       public static List<Map<String, Object>> getElementsToDocument(Document document) {
 78           List<Map<String,Object>> listEle = null;
 79             try{
 80                 //根节点
 81                 Element root = document.getRootElement();
 82                 //子节点
 83                 @SuppressWarnings("unchecked")
 84                 List<Element> childElements = root.elements();
 85                 listEle = new ArrayList<Map<String, Object>>();
 86                 //遍历子节点
 87                 listEle = getAllElements(childElements,listEle);
 88             }catch(Exception e){
 89                 e.printStackTrace();
 90             }
 91             return listEle;
 92       }
 93       
 94       /**
 95        * dom4j递归解析所有子节点
 96        * 
 97        * @param childElements
 98        * @param mapEle
 99        * @return
100        */
101       @SuppressWarnings("unchecked")
102     public static List<Map<String, Object>> getAllElements(List<Element> childElements,List<Map<String,Object>> listEle) {
103       for (Element ele:childElements){
104           Map<String,Object> mapEle = new HashMap<String, Object>();
105           mapEle.put(ele.getName(), ele);
106           listEle.add(mapEle);
107           if(ele.elements().size()>0){
108               listEle = getAllElements(ele.elements(), listEle);
109           }
110       }
111       return listEle;
112   }
113 
114     public static String getUrl() {
115         return url;
116     }
117 
118     public static void setUrl(String url) {
119         GetXmlValue.url = url;
120     }
121 
122     public static String getUsername() {
123         return username;
124     }
125 
126     public static void setUsername(String username) {
127         GetXmlValue.username = username;
128     }
129 
130     public static String getPassword() {
131         return password;
132     }
133 
134     public static void setPassword(String password) {
135         GetXmlValue.password = password;
136     }
137 
138 }

5.在web.xml文件里配置一个监听器,在javaWeb工程里新建一个类ServletContextLTest,继承类ServletContextListener,

重写contextInitialized方法,调用xml文件解析工具类GetXmlValue的getValue方法,解析xml文件并将值保存到静态变量。

<!-- 配置监听器 在tomcat启动时将数据库配置信息设置到静态变量里 -->
    <listener>   
           <listener-class>etcom.servlet.ServletContextLTest</listener-class>   
    </listener>
 1 public class ServletContextLTest implements ServletContextListener{
 2 
 3     @Override
 4     public void contextDestroyed(ServletContextEvent arg0) {
 5         // TODO Auto-generated method stub
 6         
 7     }
 8 
 9     @Override
10     public void contextInitialized(ServletContextEvent arg0) {
11         // TODO Auto-generated method stub
12         GetXmlValue.getValue();
13     }
14 
15 }

6.在需要用到配置信息的代码里直接通过GetXmlValue类的相对应get方法获取静态变量的值就行了。

原文地址:https://www.cnblogs.com/zhncnblogs/p/7562826.html