SpringBoot如何实现读取.config文件
作者:程序yang
文章介绍如何在Java中读取XML文件:通过创建XML数据源、定义POJO类(含父类Menudata和子类Menudatas)、编写解析工具、实现Service层及Controller调用,最终使用Layui框架展示数据,强调文件后缀转换及层级结构处理
思路分析
这里以IntelliJ IDEA为例:
- 1、创建一个需要读取的XML文件数据
- 2、建立POJO对象,将XML数据转化为POJO对象数据
- 3、创建一个XML解析工具类
- 4、创建接口和实现类
- 5、创建Controller调用对应的方法执行获取
直接进入主题:
- 目标文件:后缀为.config的文件
在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>
运行效果:

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