三层架构:
层级 | 概要 | 具体作用 |
---|---|---|
Controller:控制层 | 接收数据、响应数据 | 接收前端发送的请求,对请求进行处理,并响应数据 |
Service:业务逻辑层 | 逻辑处理 | 处理具体的业务逻辑 |
Dao:数据访问层(Data Access Object)(持久层) | 数据访问 | 负责数据访问操作,包括数据的增、删、改、查 |
前端--------->Controller--------->Service--------->Dao--------->文件
过程:前端发起请求,先到达Controller控制层,Controller接收请求后,调用Service业务逻辑层进行逻辑处理,而逻辑处理的前提是先拿到数据,此时Service层就会去调取Dao层,Dao层再去调用文件当中的数据,把数据拿到后,返回给Service,Service进行逻辑处理后,将结果返回给Controller,Controller最后响应数据给前端。
最终Dao层的代码是要被Service层调用的,而数据访问Dao层的实现方式可能有很多。比如:我们访问的可能是文件中的数据 / 数据库中的数据 / 别人提供的接口获取到的数据。实现的方式有很多,要想灵活地切换各自实现,就要面向接口编程,在编写Dao层的具体实现之前,需要先定义一个Dao的接口,增强程序的灵活性和拓展性。
具体的逻辑:
创建了各层的接口与实现类,Service层需要获取Dao层的数据,就需要在Service的实现类中new出Dao的对象,用对象去调用Dao层实现类的方法以获取数据;对于Controller也是一样,它需要拿到经过Service层经过逻辑处理后的数据,也需要在实现类中new出Service对象,去调用Service的方法。
这样就层层耦合,拆分成了三层,虽然还是耦合性高,但是目前功能聚合,更易于维护了。
原本的逻辑:
@RequestMapping("/listEmp")
public Result list(){
//1.加载并解析emp.xml
String file = this.getClass().getClassLoader().getResource("emp.xml").getFile();
System.out.println(file);
List<Emp> empList = XmlParserUtils.parse(file, Emp.class);
//2.对数据进行转换处理 -gender -job
empList.stream().forEach(emp -> {
String gender = emp.getGender();
if("1".equals(gender)){
emp.setGender("男");
} else if ("2".equals(gender)) {
emp.setGender("女");
}
/* for (Emp emp : empList) {
String gender = emp.getGender();
if ("1".equals(gender)) {
emp.setGender("男");
} else if ("2".equals(gender)) {
emp.setGender("女");
}
}*/
String job = emp.getJob();
if("1".equals(job)){
emp.setJob("讲师");
}else if ("2".equals(job)) {
emp.setJob("班主任");
}else if ("3".equals(job)) {
emp.setJob("就业指导");
}
});
//3.响应数据
return Result.success(empList);//
}
分层后:
public interface EmpDao {
//获取原始员工数据
public List<Emp> listEmp();
}
public class EmpDaoA implements EmpDao {
@Override
public List<Emp> listEmp() { //Dao的接口实现类
String file = this.getClass().getClassLoader().getResource("emp.xml").getFile();
System.out.println(file);
List<Emp> empList = XmlParserUtils.parse(file, Emp.class);
return empList;
}
}
public interface EmpService {
//获取逻辑处理后的数据
public List<Emp> listEmp();
}
public class EmpServiceA implements EmpService {
private EmpDao empDao = new EmpDaoA();//Service最终是要调Dao层数据的,所以new一个Dao层的对象
@Override
public List<Emp> listEmp() { //Service接口实现类
List<Emp> empList = empDao.listEmp();//用dao的对象调用一个dao的方法(Dao层已经实现过了),获取数据
empList.stream().forEach(emp -> {
String gender = emp.getGender();
if ("1".equals(gender)) {
emp.setGender("男");
} else if ("2".equals(gender)) {
emp.setGender("女");
}
String job = emp.getJob();
if ("1".equals(job)) {
emp.setJob("讲师");
} else if ("2".equals(job)) {
emp.setJob("班主任");
} else if ("3".equals(job)) {
emp.setJob("就业指导");
}
});
return empList;
}
}
@RestController
public class EmpController {
private EmpService empService = new EmpServiceA();
@RequestMapping("/listEmp")
public Result list(){
List<Emp> empList = empService.listEmp();//调用Service的实现方法获取数据,也就是说,顺序是:Service要Dao层的对象获取数据,Controller层要Service的对象获取已经逻辑处理过的数据
//3.响应数据
return Result.success(empList);//
}
}