zoukankan      html  css  js  c++  java
  • 在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方法获取静态变量的值就行了。

  • 相关阅读:
    【cocos】添加监听函数,先使用handle封装函数更优
    【cocos】PC端没问题,移动端人物模型消失
    【lua】lua string.match 和 string.split 从字符串中寻找特定字符串并保存
    APP测试通用用例--我的(用户角色全选、资料、修改密码、版本更新、消息提醒、关于APP、清除缓存等)
    APP通用测试用例(一)-登录和页面展示
    Django学习(一)-sign下的Hello Django!
    Django学习(一)
    如何快速去掉word中的文字被标红或者是显示成下划线
    在与SQLServer建立连接时出现与网络相关的或特定于实例的错误解决
    使用mdf和ldf附加还原SQL Server数据文件
  • 原文地址:https://www.cnblogs.com/zhncnblogs/p/7562826.html
Copyright © 2011-2022 走看看