《SpringMVC基础》
目录
一、Spring Web MVC
Spring Web MVC是Spring框架一个非常重要的模块之一,其采用了MVC架构模式的思想,将Web层进行职责解耦,便于我们简单、快速开发出MVC结构的Web程序,并且它的API还封装了Web开发中的一些常见功能,简化了Web程序开发的过程。
Spring Web MVC核心组件:
- DispatcherServlet(前端控制器,请求入口)
- HandlerMapping(处理器映射器,请求派发)
- Controller(控制器,请求处理流程)
- ModelAndView(模型,封装业务处理结果和视图)
- ViewResolver(视图解析器,视图显示处理)
二、前后分离开发
传统Web开发模式
优点:
-
前端可以编写Java程序,后端人员可直接在页面上写后台逻辑;
-
技术单一,容易掌握,代码好排查问题;
-
一个技术人员即可完成前后端的功能开发(全栈),适合小型企业使用。
缺点:
-
影响整体开发进度,前后端无法单独分工;
-
后端编译代码时,需要把前端代码编译(JSP其实也是Java的Servlet编写的,需要后台编译);
-
运行时前后端跳转不断(来回转发,界面不能局部刷新),影响用户体验。
前后分离开发模式
- 前端:负责界面交互,主要是显示数据;
- 后端:负责数据加工,主要是处理数据;
- 前后端开发互不干扰,各自开发完毕联调即可。
三、SpringBoot MVC
SpringBoot MVC本质就是Spring Web MVC,但在前后分离的基础上,书写形式有所不同。
案例一
- com.hpr.service.ITestService
package com.hpr.service;
import com.hpr.entity.User;
public interface ITestService {
/**
* 查询用户信息列表
*
* @return 结果集
*/
List<User> getUserList();
}
- com.hpr.service.impl.TestService
package com.hpr.service.impl;
import com.hpr.entity.User;
import com.hpr.service.ITestService;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
//@Service表示当前类是一个业务实现类
@Service
public class TestService implements ITestService {
@Override
public List<User> getUserList() {
//此处省略数据库操作,响应假数据
List<User> list = new ArrayList<>();
list.add(new User(1001, "Alice", 18, "18830201518"));
list.add(new User(1002, "Bob", 20, "18830201516"));
list.add(new User(1003, "Clover", 30, "18830201514"));
list.add(new User(1004, "Divid", 24, "18830201512"));
return list;
}
}
- com.hpr.controller.TestController
package com.hpr.controller;
import com.hpr.entity.User;
import com.hpr.service.ITestService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/*
* @RestController:相当于Controller+@ResponseBody,所有方法返回JSON格式数据;
* @RequestMapping:指定当前Controller访问地址;
* @CrossOrigin("*"):解决跨域问题(前后不同源导致的问题)。
* */
@CrossOrigin("*")
@RestController
@RequestMapping("/test")
public class TestController {
@Autowired
private ITestService iTestService;
@GetMapping("/getUserList")
public List<User> getUserList() {
return iTestService.getUserList();
}
}
- 启动项目,访问http://localhost:8080/test/getUserList进行测试。
执行结果
四、Swagger UI
项目开发中,我们会书写大量接口,若没有清晰的接口文档,不仅前端调用起来非常混乱,后端维护也是大问题。开发中我们通常使用Restful风格接口文档框架进行管理,Swagger UI就是其中较为优异的一款。
Restful风格
Restful 一种软件架构风格、设计风格,而不是标准,只是提供了一组设计原则和约束条件。它主要用于客户端和服务器交互类的软件。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。
一般情况下(为了偷懒),会使用@PostMapping做增、改注解,@GetMapping做删、查注解。
Swagger UI核心注解
- @EnableSwagger2Doc:启动类注解,表示启动Swagger UI;
- @Api:Controller注解;
- @ApiOperation:方法注解;
- @ApiParam:参数说明注解;
- @ApiModel:模型注解;
- @ApiModelProperty:模型属性注解。
案例二
- pom.xml
<!--swagger-->
<dependency>
<groupId>com.spring4all</groupId>
<artifactId>swagger-spring-boot-starter</artifactId>
<version>1.9.1.RELEASE</version>
</dependency>
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>swagger-bootstrap-ui</artifactId>
<version>1.9.6</version>
</dependency>
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>2.0.1.Final</version>
</dependency>
- application.yml
swagger:
title: 《Spring学习接口文档》 #文档标题
description: 测试文档 #文档描述
global-operation-parameters: #全局参数设置(一般写全局校验参数,如token)
- name: Authorization #参数名称
description: 认证信息 #参数描述
modelRef: string #数据类型
parameterType: header #请求类型(请求头/请求体)
required: false #是否必须
- com.hpr.MainApplication
...
@EnableSwagger2Doc
@SpringBootApplication
public class MainApplication {
...
}
- com.hpr.controller.TestController
...
@Api(tags = "测试类接口")
public class TestController {
@Autowired
private ITestService iTestService;
@GetMapping("/getUserList")
@ApiOperation("查询用户信息列表")
public List<User> getUserList() {
return iTestService.getUserList();
}
}
- com.hpr.entity.User
...
@ApiModel("用户信息")
public class User {
@ApiModelProperty("账号")
private int id;
@ApiModelProperty("名称")
private String name;
@ApiModelProperty("年龄")
private int age;
@ApiModelProperty("电话")
private String phone;
...
}
- 启动项目,访问接口文档地址http://localhost:8080/doc.html。
执行结果
清晰的接口文档不仅可以增强系统维护性,也可以使前端开发人员调用更加方便。
总结
重点
- SpringMVC处理逻辑及代码实现;
- Swagger UI框架使用。
难点
- Spring Web MVC核心组件;
- SpringBoot MVC代码实现。