SpringBoot如何实现读取.config文件

 更新时间:2025年08月28日 10:07:45   作者:程序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>

运行效果:

总结

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

相关文章

  • 快速解决idea @Autowired报红线问题

    快速解决idea @Autowired报红线问题

    这篇文章主要介绍了快速解决idea @Autowired报红线问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02
  • 快速理解Java垃圾回收和jvm中的stw

    快速理解Java垃圾回收和jvm中的stw

    这篇文章主要介绍了快速理解Java垃圾回收和jvm中的stw,涉及Java代码的停顿,jvm中的线程等相关内容,还是十分不错的,需要的朋友可以参考。
    2017-10-10
  • 解决SpringBoot2.1.0+RocketMQ版本冲突问题

    解决SpringBoot2.1.0+RocketMQ版本冲突问题

    这篇文章主要介绍了解决SpringBoot2.1.0+RocketMQ版本冲突问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-06-06
  • SpringBoot2实现MessageQueue消息队列

    SpringBoot2实现MessageQueue消息队列

    本文主要介绍了 SpringBoot2实现MessageQueue消息队列,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04
  • Java Long类型对比分析

    Java Long类型对比分析

    这篇文章主要介绍了Java Long类型对比分析,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • 使用自定义注解和@Aspect实现责任链模式的组件增强的详细代码

    使用自定义注解和@Aspect实现责任链模式的组件增强的详细代码

    责任链模式是一种行为设计模式,其作用是将请求的发送者和接收者解耦,从而可以灵活地组织和处理请求,本文讲给大家介绍如何使用自定义注解和@Aspect实现责任链模式的组件增强,文中有详细的代码示例供大家参考,感兴趣的同学可以借鉴一下
    2023-05-05
  • IDEA 搭建maven 安装、下载、配置的图文教程详解

    IDEA 搭建maven 安装、下载、配置的图文教程详解

    这篇文章主要介绍了IDEA 搭建maven 安装、下载、配置,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-06-06
  • Mybatis调用存储过程的案例

    Mybatis调用存储过程的案例

    这篇文章主要介绍了Mybatis如何调用存储过程,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-07-07
  • 详解如何将JAR包发布到Maven中央仓库

    详解如何将JAR包发布到Maven中央仓库

    这篇文章主要介绍了详解如何将JAR包发布到Maven中央仓库,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-01-01
  • 使用Java将实体类转换为JSON并输出到控制台的完整过程

    使用Java将实体类转换为JSON并输出到控制台的完整过程

    在软件开发的过程中,Java是一种广泛使用的编程语言,而在众多应用中,数据的传输和存储经常需要使用JSON格式,用Java将实体类转换为JSON格式并输出其实不难,只需掌握几个步骤就可以做到!接下来,我们来看看这一过程究竟是如何实现的,感兴趣的小伙伴跟着小编一起来看看吧
    2025-05-05

最新评论