SpringMVC
MVC设计模式介绍
MVC(Model View Controller)是软件工程中的一种软件架构模式,它把软件系统分为模型、视图和控制器三个基本部分。
- Model(模型)是应用程序中用于处理应用程序数据逻辑的部分。 通常模型对象负责在数据库中存取数据。
- View(视图)是应用程序中处理数据显示的部分。 通常视图是依据模型数据创建的。
- Controller(控制器)是应用程序中处理用户交互的部分。 通常控制器负责从视图读取数据,控制用户输入,并向模型发送数据。
常用注解
@Controller
@Controller注解标注是一个类是Web控制器,其和@Component注解等价,只不过在Web层使用,其 便于区分类的作用。
@RequestMapping
@RequestMapping是Spring Web应用程序中最常被用到的注解之一。
在对SpringMVC进行配置的时候,需要指定请求与处理方法之间的映射关系,这时候就需要使用@RequestMapping注解。该注解可以在控制器类的级别和其方法级别上使用。
@ResponseBody
表示将控制器方法的返回序列化作为响应体内容返回前端。
-
返回类型为String,表示响应Content-Type: text/plain,且响应体为控制器方法的字符串返回值
-
返回类型为普通Java类型,表示响应Content-Type: application/json,以返回对象序列化为json后作为响应体。
-
@ResponseBody可以使用在类上,表示该类中所有方法都是默认以返回值作为响应体,也就是所有方法都使用@ResponseBody。
注意:如果返回值为null,表示响应体内容为空 -
组合注解
可以使用组合注解来完成同时定义多个注解的效果,如:@RestController,@GetMapping,@PostMapping
@PathVariable
一般的 URI 服务路径都是固定的,SpringMVC提供了 restful 风格可以变化的 URI。示例
@GetMapping("/owners/{ownerId}/pets/{petId}")
public String findPet(@PathVariable Long ownerId, @PathVariable Long petId) {
return "主人id:"+ownerId+", 宠物id:"+petId; }
说明:
- {}是将服务路径 URI 中的部分定义为变量,之后在方法参数中获取该路径变量。更多格式可参考 URI格式。
- 请求 /arg/owners/1/pets/2 ,显示的网页内容为: 主人id:1, 宠物id:2
- 变量已经定义了为Long长整形,所以不能转换为Long的 URI 都会报错,如请求
- /arg/owners/abc/pets/2 就会报错,响应状态码400。 变量名ownerId,petId必须和 URI中的定义名称一致。
@RequestParam
当请求数据要绑定到某个简单对象时,可以使用@RequestParam。
URL 中的请求数据queryString
- 请求头,Content-Type为表单默认提交的格式 application/x-www-form-urlencoded ,请求体中的数据
- 请求头,Content-Type为 multipart/form-data ,请求体中的数据。 form-data 可以提交文本数据,也可以提交二进制文件。
- 以上简单对象包括:基本数据类型、包装类型、MultipartFile(接收二进制文件)
需要注意@RequestParam注解参数默认为 required=true ,如果不传该参数就会报错,需要指定为: @RequestParam(required = false) 。
POJO对象
POJO(Plain Ordinary Java Object):简单的 java 对象,实际就是属性提供了Getter,Setter方法的普通对象。
使用 java 对象和使用@RequestParam注解非常类似,只是有点细节不同:
- @RequestParam是以方法参数变量名和传入的键对应,POJO对象作为方法参数时,是以POJO对 象中的属性名对应传入的键
- @RequestParam默认必须传入该请求数据,而 POJO 对象是根据请求数据来填充属性,如果请求数据没有,则属性就是默认值(new对象时每个属性的默认值)。
@RequestBody
当请求的数据类型Content-Type为 application/json 时,需要显示的使用@RequestBody注解
@RequestPart
对于请求的数据类型Content-Type为 multipart/form-data 时,二进制文件除了以上@RequestParam和 POJO 对象的方式外,还可以使用@RequestPart。
SpringMVC自定义配置
SpringBoot中使用SpringMVC非常方便,SpringBoot提供了大部分的MVC默认功能,并且需要自定义某部分功能也非常方便,在配置类中实现 WebMvcConfigurer 接口,根据需要重写方法即可:
package org.example.demo.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class AppConfig implements WebMvcConfigurer {
}
自定义后端路径映射
重写 configurePathMatch 方法,实现时,可以添加统一的服务路径前缀:
@Override
public void configurePathMatch(PathMatchConfigurer configurer) {
//Controller路径,统一添加请求的路径前缀,第二个参数,c是Controller类,返回boolean
表示是否添加前缀
//所有Controller请求路径,都要带/api的前缀
configurer.addPathPrefix("api", c->true);
}
此时所有定义的服务路径都要在前面加上 /api 再能访问,如 /arg/param1 现在应该访问/api/arg/param1 。
自定义Controller拦截器
重写 addInterceptors 方法,实现时,需要指定拦截器,并配置需要拦截、不拦截的路径。在客户端发起请求时,如果路径最终匹配该规则,则执行拦截器中的接口方法。以下示例,实现用户统一的会话管理:
首先定义一个用户登录接口:
package org.example.demo.controller;
import org.springframework.web.bind.annotation