1.资源配置
a.在pom.xml文件中引入dom4j的依赖,用于解析XML文件
如果出现标红可以尝试重启IDEA
b.引入资料中提供的解析XML的工具类XMLParserUtils、对应的实体类Writer、XML文件poet.xml
自己编写对应的实体类Writer,其中包括诗人的各个属性,姓名、流派等,具体代码如下:
package com.liuxiaocan.firstspringboot.Data;
public class Writer {
private String author;
private String gender;
private String dynasty;
private String title;
private String Style;
private String ID;
public String getID() {
return ID;
}
public void setID(String ID) {
this.ID = ID;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public String getDynasty() {
return dynasty;
}
public void setDynasty(String dynasty) {
this.dynasty = dynasty;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getStyle() {
return Style;
}
public void setStyle(String style) {
Style = style;
}
@Override
public String toString() {
return "Writer{" +
"author='" + author + '\'' +
", gender='" + gender + '\'' +
", dynasty='" + dynasty + '\'' +
", title='" + title + '\'' +
", Style='" + Style + '\'' +
", ID='" + ID + '\'' +
'}';
}
public Writer() {
}
public Writer(String ID,String author, String gender,String dynasty, String title, String Style) {
this.ID=ID;
this.author = author;
this.gender= gender;
this.dynasty = dynasty;
this.title = title;
this.Style = Style;
}
}
c.引入静态页面文件
改写后的poet.html代码如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>诗人信息</title>
</head>
<link rel="stylesheet" href="element-ui/index.css">
<script src="./js/vue.js"></script>
<script src="./element-ui/index.js"></script>
<script src="./js/axios-0.18.0.js"></script>
<body>
<h1 align="center">诗人信息列表展示</h1>
<div id="app">
<el-table :data="tableData" style="width: 100%" stripe border >
<el-table-column prop="ID" label="编号" align="center" min-width="20%" ></el-table-column>
<el-table-column prop="author" label="姓名" align="center" min-width="20%"></el-table-column>
<el-table-column prop="gender" label="性别" align="center" min-width="20%"></el-table-column>
<el-table-column prop="dynasty" label="朝代" align="center" min-width="20%"></el-table-column>
<el-table-column prop="title" label="头衔" align="center" min-width="20%"></el-table-column>
<el-table-column prop="style" label="风格" align="center" min-width="20%"></el-table-column>
</el-table>
</div>
</body>
<style>
.el-table .warning-row {
background: #cb9d4a;
}
.el-table .success-row {
background: #f0f9eb;
}
</style>
<script>
new Vue({
el: "#app",
data() {
return {
tableData: []
}
},
mounted(){
axios.get('/poet').then(res=>{
if(res.data.statusCode){
this.tableData = res.data.data;
console.log(this.tableData);
}
});
},
methods: {
}
});
</script>
</html>
2.显示xml文件的内容
a.常规方式,controlller控制器不分层
编写PoetController类,将解析的xml文件中的数据传递到postman检测是否传递成功
b. 按照MVC的分层方式实现,常规java代码方式
在包下新建Dao、service文件夹,在Dao文件夹中编写一个接口PoetDao
public interface PoetDao {
public List<Writer> PoetDao();
}
再在Dao文件夹下新建一个类用来实现接口PoetDao
public class PoetDaoA implements PoetDao {
@Override
public List<Writer> PoetDao() {
//解析xml文件,将解析的数据存储在Writer对象中
String file=this.getClass().getClassLoader().getResource("poet.xml").getFile();
List<Writer> writers = XmlParserUtils.parse(file, Writer.class);
return writers;
}
}
在Service中新建接口
public interface PoetService {
public List<Writer> PoetService();
}
新建实现类PoetServiceA
public class PoetServiceA implements PoetService {
private PoetDao poetDao=new PoetDaoA();
@Override
public List<Writer> PoetService() {
List<Writer> writers=poetDao.PoetDao();
writers.stream().forEach(writer->{
String gender=writer.getGender();
if("1".equals(gender)){
writer.setGender("男");
}
else if("2".equals(gender)){
writer.setGender("女");
}
});
return writers;
}
}
把PoetController类改写成如下,依旧能够实现数据的展示
@RestController
public class PoetController {
private PoetService poetService=new PoetServiceA();
@RequestMapping("/poet")
public Result poet(){
List<Writer> writers=poetService.PoetService();
return Result.success(writers);
}
}
c.采用控制反转和依赖注入的MVC方式实现
控制反转:Inversion Of Control,对象的创建控制由程序自身转到容器
依赖注入:Dependency Injection 容器为应用程序提供所需要的依赖资源
Bean对象:IOC容器中创造管理的对象
要实现控制反转和依赖注入必须要先将Dao、Service创建的对象放入容器中,利用注解@Component,再将依赖注入利用@Autowired实现
@Component//控制反转
public class PoetDaoA implements PoetDao {
@Override
public List<Writer> PoetDao() {
//解析xml文件,将解析的数据存储在Writer对象中
String file=this.getClass().getClassLoader().getResource("poet.xml").getFile();
List<Writer> writers = XmlParserUtils.parse(file, Writer.class);
return writers;
}
}
@Component
public class PoetServiceA implements PoetService {
private PoetDao poetDao;
@Override
public List<Writer> PoetService() {
List<Writer> writers=poetDao.PoetDao();
writers.stream().forEach(writer->{
String gender=writer.getGender();
if("1".equals(gender)){
writer.setGender("男");
}
else if("2".equals(gender)){
writer.setGender("女");
}
});
return writers;
}
}
@Component
public class PoetServiceA implements PoetService {
@Autowired//依赖注入
private PoetDao poetDao;
public class PoetController {
@Autowired//依赖注入
private PoetService poetService;
新编写一个PoetServiceB类,将PoetServiceB创建的对象放入容器中,只需要注释掉PoetServiceA中的@Component注释
@Component
public class PoetServiceB implements PoetService {
@Autowired//依赖注入
private PoetDao poetDao;
@Override
public List<Writer> PoetService() {
List<Writer> writers=poetDao.PoetDao();
writers.stream().forEach(writer->{
String gender=writer.getGender();
if("1".equals(gender)){
writer.setGender("男~");
}
else if("2".equals(gender)){
writer.setGender("女~");
}
});
return writers;
}
}
Bean对象的声明:@Controller标注在控制器上;@Service标注在服务类上;@Repository标注在数据库类上
@Service
public class PoetServiceB implements PoetService {
@Autowired//依赖注入
private PoetDao poetDao;
@Repository//控制反转
public class PoetDaoA implements PoetDao {
Bean对象的重命名利用value="XXX" 例如@RestController(value = "poet")
Bean对象的注入,如果有两个类同时实现一个接口,且这两个类都被注入了容器中,则需要采用@Primary(在优先采用的类上加上@Primary注解)、 @Autowired与@Qualifier配合使用、利用@Resource注释知名bean对象名
@Primary
@Component
public class PoetServiceA implements PoetService {
@Autowired//依赖注入
private PoetDao poetDao;
@Override
public List<Writer> PoetService() {
List<Writer> writers=poetDao.PoetDao();
writers.stream().forEach(writer->{
String gender=writer.getGender();
if("1".equals(gender)){
writer.setGender("男");
}
else if("2".equals(gender)){
writer.setGender("女");
}
});
return writers;
}
}
@RestController(value = "poet")
public class PoetController {
@Qualifier("poetServiceA")
@Autowired//依赖注入
private PoetService poetService;
@RequestMapping("/poet")
public Result poet(){
List<Writer> writers=poetService.PoetService();
return Result.success(writers);
}
}
@RestController(value = "poet")
public class PoetController {
@Resource(name="poetServiceB")
private PoetService poetService;