作业原题
将下面的代码按照springboot分层解耦的机制进行改写,实现设备列表的前端展示。
@RestController
public class DeviceController {
@RequestMapping("/listDev")
public Result list(){
//1. 加载并解析emp.xml
String file = this.getClass().getClassLoader().getResource("devices.xml").getFile();
System.out.println(file);
List<Device> devList = XmlParserUtils.parse(file, Device.class);
System.out.println(devList);
//2. 对数据进行转换处理 - DevState
devList.stream().forEach(dev -> {
//处理 DevState 1: 开, 0: 关
String state = dev.getDevState();
if("1".equals(state)){
dev.setDevState("开");
}else if("0".equals(state)){
dev.setDevState("关");
}
});
//3. 响应数据
return Result.success(devList);
}
}
解决步骤:
创建pojo包,包内创建Device和Result类
Result类代码如下
public class Result {
private Integer code ;//1 成功 , 0 失败
private String msg; //提示信息
private Object data; //数据 data
public Result() {
}
public Result(Integer code, String msg, Object data) {
this.code = code;
this.msg = msg;
this.data = data;
}
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public Object getData() {
return data;
}
public void setData(Object data) {
this.data = data;
}
public static Result success(Object data){
return new Result(1, "success", data);
}
public static Result success(){
return new Result(1, "success", null);
}
public static Result error(String msg){
return new Result(0, msg, null);
}
@Override
public String toString() {
return "Result{" +
"code=" + code +
", msg='" + msg + '\'' +
", data=" + data +
'}';
}
}
将所需文件移入项目内
移入前:
移入后:
创建工具包
代码如下
package com.dfq.utils;
import java.io.File;
import java.lang.reflect.Constructor;
import java.util.ArrayList;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
public class XmlParserUtils {
public static <T> List<T> parse(String file , Class<T> targetClass) {
ArrayList<T> list = new ArrayList<T>(); //封装解析出来的数据
try {
//1.获取一个解析器对象
SAXReader saxReader = new SAXReader();
//2.利用解析器把xml文件加载到内存中,并返回一个文档对象
Document document = saxReader.read(new File(file));
//3.获取到根标签
Element rootElement = document.getRootElement();
//4.通过根标签来获取 user 标签
List<Element> elements = rootElement.elements("dev");
//5.遍历集合,得到每一个 user 标签
for (Element element : elements) {
//获取 name 属性
String devName = element.element("devName").getText();
//获取 age 属性
String devID = element.element("devID").getText();
//获取 image 属性
String image = element.element("image").getText();
//获取 gender 属性
String userName = element.element("userName").getText();
//获取 job 属性
String devState = element.element("devState").getText();
//组装数据
Constructor<T> constructor = targetClass.getDeclaredConstructor(String.class, String.class, String.class, String.class, String.class);
constructor.setAccessible(true);
T object = constructor.newInstance(devName,devID, image, userName, devState);
list.add(object);
}
} catch (Exception e) {
e.printStackTrace();
}
return list;
}
}
需要添加依赖,找到以下文件
在dependencies标签内写入
<dependency> <groupId>org.dom4j</groupId> <artifactId>dom4j</artifactId> <version>2.1.3</version> </dependency>
点击刷新:
创建DeviceServer接口 并声明两个方法
一个用于读取并解析xml文件,一个用于状态转换
实现接口中声明的方法
package com.dfq.server.Impl;
import com.dfq.pojo.Device;
import com.dfq.server.DeviceServer;
import com.dfq.utils.XmlParserUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Objects;
@Component
public class DeviceImpl implements DeviceServer {
@Override
public List<Device> getXml(String url) {
String file = Objects.requireNonNull(this.getClass().getClassLoader().getResource(url)).getFile();
System.out.println(file);
// 得到xml文件的路径 并赋值给file
// 读取xml文件的资源并赋值到链表
List<Device> devList = XmlParserUtils.parse(file, Device.class);
return devList;
}
@Override
public List<Device> tran(List<Device> devList) {
devList.forEach(dev -> {
//处理 DevState 1: 开, 0: 关
String state = dev.getDevState();
if("1".equals(state)){
dev.setDevState("开");
}else if("0".equals(state)){
dev.setDevState("关");
}
});
return devList;
}
}
在DeviceController调用xml解析和状态转换方法
package com.dfq.controller;
import com.dfq.pojo.Device;
import com.dfq.pojo.Result;
import com.dfq.server.DeviceServer;
import com.dfq.utils.XmlParserUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
//import javax.xml.transform.Result;
import java.util.List;
import java.util.Objects;
@RestController
public class DeviceController {
@Autowired
private DeviceServer deviceServer;
@RequestMapping("/listDev")
public Result listDev(){
List<Device> list = deviceServer.getXml("devices.xml");
list = deviceServer.tran(list);
return Result.success(list);
}
}
运行SpringBoot项目 打开浏览器 转到localhost:8080/dev.html
显示成功