spring boot入门与理解MVC三层架构

Posted 脱发的小猿

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了spring boot入门与理解MVC三层架构相关的知识,希望对你有一定的参考价值。

一、SpringMVC分层框架

分层是为了实现“高内聚,低耦合”,把问题划分开来,各个解决,易于控制,延展和分配资源,最重要有利于后期维护项目;

MVC指的是model,view,controller;

在SpringMVC编程中一般分为四层:

1.表示层:(jsp、html 主要就是界面的展示),负责前后端交互,接收前端发送的请求,然后调用service层,service层再返回数据给它,它再返回给前端。

2.控制层:(Contoller、Action)控制界面跳转,负责前后端交互,接收前端发送的请求,然后调用service层,service层再返回数据给它,它再返回给前端。

3.业务层:(Service)写主要的业务逻辑,调用DAO层,操作数据库,再对返回的数据进行各种业务上的处理,再返回给控制层。实现解耦合目的,虽然不要它也可以运行项目,但是会使项目后期的延展和维护变得困难

4.持久层:(DAO)也叫数据访问层,实现对数据库的访问。完成增删改查功能,把数据返回给service层。

5.实体层:(Model)数据库实体层,存放实体类,实现get、set方法。属性要和数据库的一样。

二、注解的使用

在SpringMVC中经常用到注解,使用注解可以极大的节省开发者的时间,下面是几个最重要的注解介绍:

@Repository:标注数据访问层,可以告诉SpringMVC这是一个数据访问层,并将其申明为一个bean,例如UserDao接口的实现类UserDaoImpl,在类上加注解@Repository("userDao"),bean的名称为userDao

@Service:标注业务层,例如UserService接口的实现类,在类上加@Service("userService"),bean的名称为userService

@Controller:控制层,在控制层类上加@Controller即可,确认其是一个控制层类

@Component:当不确定是属于哪层是用这个注解

三、实践代码演示

项目结构:

(1) Model 层

存放实体类,实现get、set方法,属性要和数据库的一样。

//一个model对应一张表中的字段
public class Student 
    private UUID id;
    private String name;
    

    public UUID getId() 
        return id;
    
    public void setId(UUID id) 
        this.id = id;
    
    public String getName() 
        return name;
    
    public void setName(String name) 
    this.name = name;
    
    public Student(UUID id, String name)
        this.id = id;
        this.name = name;
    
    public Student()

(2)Dao层

数据访问层,和Model层交互。实现接口,对数据库的访问。完成增删改查功能

//定义操作数据库的方法
public interface StudentDao 
    Optional<Student> selectStudentById(UUID id);
    List<Student> selectAllStudents();
    int insertStudent(Student student);
    int upgradeStudent(Student student);
    int deleteStudent(UUID id);
 

定义接口的实现,因为没有实现和数据库直接相连,就使用假数据。

@Repository
@Resource
public class FakeStudentDao implements StudentDao 
private static List<Student> database = new ArrayList<>();


@Override
public Optional<Student> selectStudentById(UUID id) 
for(Student s : database)
if(s.getId().equals(id))
return Optional.of(s);


return Optional.empty();



@Override
public List<Student> selectAllStudents() 
return database;



@Override
public int insertStudent(Student student) 
UUID id = UUID.randomUUID();
database.add(new Student(id,student.getName()));
return 1;



@Override
public int upgradeStudent(Student student) 
// 先找到这个要更新的student的信息
    int indexToUpdate = -1;
    for(int i = 0;i<database.size();i++)
    if(student.getId().equals(database.get(i).getId()))
        indexToUpdate = i;
    break;
    

    if(indexToUpdate<0) return -1;
    database.set(indexToUpdate,student);
    return 1;



@Override
public int deleteStudent(UUID id) 
    Optional<Student> optionalStudent = selectStudentById(id);
    if(!optionalStudent.isPresent())
        return -1;
    
    database.remove(optionalStudent.get());
    return 1;



 

(3)Service层

主要的业务逻辑,调用DAO层,操作数据库,再对返回的数据进行各种业务上的处理,再返回给控制层。实现解耦合目的.

@Service
public class StudentService 
    private StudentDao studentDao;


    @Autowired
    public StudentService(StudentDao studentDao) 
        this.studentDao = studentDao;
    
    public List<Student> getAllStudents()
        return studentDao.selectAllStudents();
    
    public int addStudent(Student student )
       return studentDao.insertStudent(student);


    
    public int upgradeStudent(Student student )
        return studentDao.upgradeStudent(student);


    


    public int deleteStudent(UUID id)
        return studentDao.deleteStudent(id);


    
 

(4) Controller层

控制界面跳转,负责前后端交互,接收前端发送的请求,然后调用service层,service层再返回数据给它,它再返回给前端。

@RestController
@RequestMapping("/springboot")
public class StudentController 
    private StudentService studentService;
    @Autowired
    public StudentController(StudentService studentService) 
        this.studentService = studentService;
    
    @GetMapping
    public List<Student> getAllStudents() 
        return studentService.getAllStudents();

    @PostMapping
    public String addStudent(@RequestBody Student student)
        studentService.addStudent(student);
        return "Added student";
    
    @PutMapping
    public String upgradeStudent(@RequestBody Student student)
        studentService.upgradeStudent(student);
        return "Upgrade student";
    
    @DeleteMapping(path = "id")
// localhost:8080/springboot/123
    public String deleteStudent(@PathVariable("id") UUID id)
        studentService.deleteStudent(id);
        return "Deleted student";
    
 

 

MVC和三层架构的个人理解

一直以为MVC就是三层,最近通过.net的学习才知道,三层架构是指表示层(UI),业务逻辑层(BLL)和数据访问层(DAL) ,UI负责与用户的交互,DAL负责访问数据(其实是操作model,model对应物理表), BLL连接UI和DAL,负责一切业务逻辑。

而MVC只是表示层UI的细分,这里引用一下高手的描述:MVC是表现层的架构,MVC的Model实际上是ViewModel,即供View进行展示的数据。 ViewModel不包含业务逻辑,也不包含数据读取。 而在N层架构中,一般还会有一个Model层,用来与数据库的表相对应,也就是所谓ORM中的O。这个Model可能是POCO,也可能是包含一些验证逻辑的实体类,一般也不包含数据读取。进行数据读取的是数据访问层。而作为UI层的MVC一般不直接操作数据访问层,中间会有一个业务逻辑层封装业务逻辑、调用数据访问层。UI层(Controller)通过业务逻辑层来得到数据(Model),并进行封装(ViewModel),然后选择相应的View。

以上主要引自 https://www.cnblogs.com/yourshj/p/5197310.html

以上是关于spring boot入门与理解MVC三层架构的主要内容,如果未能解决你的问题,请参考以下文章

MVC和三层架构的个人理解

spring boot和mvc区别

SprinMvc快速入门

三层架构

三层架构

狂神说JavaJavaWeb入门到实战--MVC三层架构