java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > SpringBoot读取.config文件

SpringBoot如何实现读取.config文件

作者:程序yang

文章介绍如何在Java中读取XML文件:通过创建XML数据源、定义POJO类(含父类Menudata和子类Menudatas)、编写解析工具、实现Service层及Controller调用,最终使用Layui框架展示数据,强调文件后缀转换及层级结构处理

思路分析

这里以IntelliJ IDEA为例:

直接进入主题:

在Java这里需要改为.xml文件,只是后缀发生改变,内容不变。

详细操作

1、在resource目录创建一个需要读取的XML文件数据

源码:

<?xml version="1.0" encoding="gb2312"?>
<root>
  <mpmenu id="1" title="智能信息" funcId="0202" image="6d0">
    <mpmenu id="101" title="问题表" image="" funcId="0202" url="p.aspx?t=info_question" />
    <mpmenu id="104" title="索引表" image="" funcId="0202" url="p.aspx?t=info_question&typeid=2" />
    <mpmenu id="102" title="常见答案" image="" funcId="0202" url="p.aspx?t=info_tree&formname=info_answers" />
    <mpmenu id="103" title="专业内容" image="" funcId="0202" url="p.aspx?t=info_tree" />
    <mpmenu id="108" title="行业关键字" image="" funcId="0202" url="p.aspx?t=info_keyback" />
    <mpmenu id="105" title="回复记录" image="" funcId="0202" url="p.aspx?t=info_qalog_index" />
  </mpmenu>

  <mpmenu id="2" title="需求管理" funcId="0207" image="616">
    <mpmenu id="201" title="待审核" image="" funcId="0207" url="p.aspx?t=unit_require&status=1" />
    <mpmenu id="202" title="发布中" image="" funcId="0207" url="p.aspx?t=unit_require&status=2" />
    <mpmenu id="203" title="驳回" image="" funcId="0207" url="p.aspx?t=unit_require&status=3" />

  </mpmenu>
  <mpmenu id="3" title="商城" funcId="02" image="66a">
    <mpmenu id="301" title="商品管理" image="" funcId="0203" url="p.aspx?t=goodslist" />
    <mpmenu id="302" title="订单管理" image="" funcId="0204" url="p.aspx?t=orderlist" />
    <mpmenu id="303" title="支付记录" image="" funcId="0206" url="p.aspx?t=paylog" />
    <mpmenu id="304" title="待发货" image="" funcId="0205" url="p.aspx?t=toexpress" />
    <mpmenu id="305" title="配送记录" image="" funcId="0205" url="p.aspx?t=expresslog" />
    <mpmenu id="320" title="自提点管理" image="" funcId="0203" url="p.aspx?t=self_take_place" />
    <mpmenu id="350" title="排行榜" image="" funcId="0203" url="p.aspx?t=mall_ranking" />
  </mpmenu>
</root>

2、建立POJO对象,将XML数据转化为POJO对象数据

创建Menudata类,作为父集(xml文件第一层<mpmenu>,即<root>下)。

源码:

package com.example.business.bean;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import javax.xml.bind.annotation.*;
import java.util.List;

@Data //注在类上,提供类的get、set、equals、hashCode、canEqual、toString方法,需配置lombok依赖
@AllArgsConstructor //注在类上,提供类的全参构造
@NoArgsConstructor //注在类上,提供类的无参构造
@XmlRootElement(name = "mpmenu")
@XmlAccessorType(XmlAccessType.FIELD)
public class Menudata {
    @XmlAttribute(name = "id")
    private String id;
    @XmlAttribute(name = "title")
    private String title;
    @XmlAttribute(name = "image")
    private String image;
    @XmlAttribute(name = "funcId")
    private String funcid;

    //用于读取mpmenu第二层的数据
    @XmlElement(name = "mpmenu")
    private List<Menudatas> menudataList;

}

由于这里用到的@Data等注解,该注解是引用lombok中,所以需要在pom.xml文件中添加依赖。

 <!--添加@Data注解依赖-->
 <dependency>
     <groupId>org.projectlombok</groupId>
     <artifactId>lombok</artifactId>
     <version>1.16.6</version>
 </dependency>

创建Menudatas类,作为子集(xml文件第二层<mpmenu>,即<root>下面的<mpmenu><mpmenu>)。

源码:

package com.example.business.bean;


import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import javax.xml.bind.annotation.*;

@Data //注在类上,提供类的get、set、equals、hashCode、canEqual、toString方法,需配置lombok依赖
@AllArgsConstructor //注在类上,提供类的全参构造
@NoArgsConstructor //注在类上,提供类的无参构造
@XmlRootElement(name = "mpmenu")
@XmlAccessorType(XmlAccessType.FIELD)
public class Menudatas {
    @XmlAttribute(name = "id")
    private String id;
    @XmlAttribute(name = "title")
    private String title;
    @XmlAttribute(name = "image")
    private String image;
    @XmlAttribute(name = "funcId")
    private String funcid;
    @XmlAttribute(name = "url")
    private String url;

}

注意父集子集的逻辑调用,如果你的配置文件只有一层关系,则你不再需要创建Menudatas。

创建MenudataList类,用于返回集合数据。

源码:

package com.example.business.bean;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import java.util.List;

@Data //注在类上,提供类的get、set、equals、hashCode、canEqual、toString方法
@AllArgsConstructor //注在类上,提供类的全参构造
@NoArgsConstructor  //注在类上,提供类的无参构造
@XmlRootElement(name = "root")// xml 文件的根元素
@XmlAccessorType(XmlAccessType.FIELD) // 控制默认情况下是否对字段或 Javabean 属性进行系列化。
public class MenudataList {

    @XmlElement(name = "mpmenu")
    private List<Menudata> menudataList;

    public List<Menudata> getMenudataList() {
        return menudataList;
    }

    public void setMenudataList(List<Menudata> menudataList) {
        this.menudataList = menudataList;
    }
}

3、创建一个XML解析工具类

源码:

package com.example.business.util;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.Unmarshaller;
import java.io.Reader;
import java.io.StringReader;

public class XmlBuilder {

    /**
     * 将XML转为指定的POJO对象
     *
     * @param clazz 需要转换的类
     * @param xmlStr xml数据
     * @return
     */
    public static Object xmlStrToObject(Class<?> clazz, String xmlStr) throws Exception {
        Object xmlObject = null;
        Reader reader = null;
        //利用JAXBContext将类转为一个实例
        JAXBContext context = JAXBContext.newInstance(clazz);
        //XMl 转为对象的接口
        Unmarshaller unmarshaller = context.createUnmarshaller();
        reader = new StringReader(xmlStr);
        xmlObject = unmarshaller.unmarshal(reader);
        if (reader != null) {
            reader.close();
        }
        return xmlObject;
    }
}

4、创建service接口和service实现类

service接口:

源码:

package com.example.business.service;

import com.example.business.bean.Menudata;

import java.util.List;

/**
 * 导航栏菜单数据
 */
public interface MenudataService {

    List<Menudata> listMenu() throws Exception;
}

service实现类:

源码:

package com.example.business.serviceImpl;

import com.example.business.bean.Menudata;
import com.example.business.bean.MenudataList;
import com.example.business.service.MenudataService;
import com.example.business.util.XmlBuilder;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import org.springframework.stereotype.Service;


import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.List;

@Service
public class MenudataServiceImpl implements MenudataService {

    @Override
    public List<Menudata> listMenu() throws Exception {
        //读取Resource目录下的XML文件
        Resource resource = new ClassPathResource("menudata.xml");
        //利用输入流获取XML文件内容
        BufferedReader br = new BufferedReader(new InputStreamReader(resource.getInputStream(), "gb2312"));
        StringBuffer buffer = new StringBuffer();
        String line = "";
        while ((line = br.readLine()) != null) {
            buffer.append(line);
        }
        br.close();
        //XML转为JAVA对象
        MenudataList menudataList = (MenudataList) XmlBuilder.xmlStrToObject(MenudataList.class, buffer.toString());
        return menudataList.getMenudataList();
    }
}

5、创建Controller调用对应的方法执行获取

源码:

package com.example.business.controller;

import com.example.business.bean.Menudata;
import com.example.business.service.MenudataService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.List;

@Controller
public class LoginController {

    //将Service注入Web层
    @Autowired
    MenudataService menudataService;

    @RequestMapping("toLogin")
    public String toLogin(){
        return "list";
    }

    @ResponseBody
    @RequestMapping("findMenuData")
    public List<Menudata> findMenuData() throws Exception {
        List<Menudata> str = menudataService.listMenu();
        return str;
    }

}

HTML:(使用Layui框架,插件自行去官网下载

HTML页面代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>

<link rel="stylesheet" href="layui/css/layui.css" rel="external nofollow"  type="text/css"></link>

<link rel="stylesheet" href="css/admin.css" rel="external nofollow" >
<style type="text/css">
    .welcome {
        margin: auto;
        width: 400px;
        height: 350px;
        background: url("image/logos.png") no-repeat center center;
        background-size: cover;
    }

    .modal {
        display: none;
        padding: 20px;
    }

</style>

<body class="layui-layout-body">
<div class="layui-layout layui-layout-admin">
    <div class="layui-header custom-header">
        <!--左侧导航栏收展按钮-->
        <ul class="layui-nav layui-layout-left">
            <li class="layui-nav-item slide-sidebar" lay-unselect>
                <a href="javascript:;" rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  class="icon-font"><i class="ai ai-menufold"></i></a>
            </li>
        </ul>
        <!--右侧导航栏状态按钮-->
        <ul class="layui-nav layui-layout-right">
            <li class="layui-nav-item">
                <a href="javascript:;" rel="external nofollow"  rel="external nofollow"  rel="external nofollow" >
                    <img src="http://t.cn/RCzsdCq" class="layui-nav-img">
                    贤心
                </a>
                <dl class="layui-nav-child">
                    <dd><a href="">基本资料</a></dd>
                    <dd><a href="">安全设置</a></dd>
                </dl>
            </li>
            <li class="layui-nav-item"><a href="">注销</a></li>
        </ul>
    </div>

    <div class="layui-side custom-admin" id="menudata">
        <div class="layui-side-scroll">
            <div class="custom-logo">
                <img src="image/logo.png" alt=""/>
                <h1>后台管理系统</h1>
            </div>
            <ul id="Nav" class="layui-nav layui-nav-tree layui-inline" lay-filter="demo">

            </ul>
        </div>
    </div>
    <!-- 嵌套层内容 -->
    <div class="layui-body" style="height: 95%;">
        <div class="layui-tab app-container" lay-allowClose="true" lay-filter="tabs">
            <ul id="appTabs" class="layui-tab-title custom-tab"></ul>
            <div class="layui-tab-content">
                <div id="welcome" style="width:100%;height:100%;display:flex;">
                    <div class="welcome"></div>
                </div>
            </div>
        </div>
    </div>
</div>

<script type="text/javascript" src="js/jquery-3.3.1.min.js"></script>
<script type="text/javascript" src="layui/layui.js"></script>
<script type="text/javascript" src="layui/layui.all.js"></script>
<script src="/js/home.js"></script>

<script type="text/javascript">
    //页面加载事件
    window.onload = function () {
        getMenuData();
    };

    //获取导航栏菜单
    function getMenuData() {
        $.ajax({
            type: "GET",
            url: "findMenuData",
            cache: false,
            success: function (data) {
                //将layui在页面加载时渲染出来的span.layui-nav-bar利用DOM先删除掉再重新渲染
                $('#nav').find('span.layui-nav-bar').remove();
                //console.log(data);

                //遍历map集合
                $.each(data, function (i) {
                    var menu = '<li class="layui-nav-item">' + '<a href="javascript:;" rel="external nofollow"  rel="external nofollow"  rel="external nofollow" >' + '<i class="layui-icon layui-icon-friends"></i>' + '<em>' + data[i].title + '</em>' + '</a>';
                    if (data[i].menudataList) {
                        var menus = '';
                        $.each(data[i].menudataList, function (j) {
                            menus = menus + '<dl class="layui-nav-child">' + '<dd><a href="">' + data[i].menudataList[j].title + '</a></dd>' + '</dl>';
                        })
                        menu = menu + menus;
                    }
                    menu = menu + '</li>';
                    //console.log(menu)
                    $("#menudata ul").append(menu);
                });
                xuanran();
            }
        });
    }

    //重新渲染
    function xuanran() {
        layui.use('element', function () {
            var element = layui.element;
            var layFilter = $("#nav").attr('lay-filter');
            element.render('nav', layFilter);
        })
    }


</script>
</body>
</html>

运行效果:

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文