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>
运行效果:
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。