@RequestMapping注解
可以作用在类和方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。用于定义每个Controller方法的执行url路径(还可以更细致为同一url不同的参数,不同的content-type执行不同的Controller方法)RequestMapping注解有以下几个重要属性:
属性名 | 说明 | 示例 |
---|---|---|
value | 指定请求的实际地址,支持模糊匹配 1. ?:匹配一个字符 2. *:匹配任意字符 3. **:匹配多层路径 4. 正则匹配 5. URI 路径模式还可以具有嵌入的${…}占位符,这些占位符在启动时通过配置文件针对本地、系统、环境和其他属性源进行解析 | /springmvc/**/lastTest 匹配/springmvc/firstTest/secondTest/lastTest |
method | 指定请求的http方法类型 | 枚举类RequestMethod的任意类型。如RequestMethod.POST |
consumes | 指定处理请求的提交内容类型(Content-Type),例如application/json, text/html; | 我们还可以使用MediaType类中定义的static属性 |
produces | 指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回 | 可以使用MediaType类中定义的static属性 |
params | 指定request中必须包含某些参数值时,才让该方法处理 | @GetMapping(path = “/pets/{petId}”, params = “myParam=myValue”) 参数myParam=myValue时才进入该Controller的此方法 |
headers | 指定request中必须包含某些指定的header值,才能让该方法处理请求 | @GetMapping(path = “/pets”, headers = “myHeader=myValue”) |
@RequestMapping衍生注解
- @GetMapping:对应method = RequestMethod.GET,以下同理
- @PostMapping
- @PutMapping
- @DeleteMapping
- @PatchMapping
Spring MVC 中获取参数的方式
@RequestParam
常用来处理简单类型的绑定,通过Request.getParameter() 获取的String可直接转换为简单类型的情况( String–> 简单类型的转换操作由ConversionService配置的转换器来完成);因为使用request.getParameter()方式获取参数,所以可以处理get 方式中queryString的值,也可以处理post方式中 body data的值
用来处理Content-Type: 为 application/x-www-form-urlencoded编码的内容,提交方式GET、POST都可以
注解属性
- value:参数名字,即入参的请求参数名字,如username表示请求的参数区中的名字为username的参数的值将传入;(同name属性)。
- required:是否必须,默认是true,表示请求中一定要有相应的参数,否则将报404错误码;
- defaultValue:默认值,表示如果请求中没有同名参数时的默认值,默认值可以是SpEL表达式,如“#{systemProperties[‘java.vm.version’]}”
@RequestMapping("/add")
public String add(@RequestParam(name="name",required=true) String name){
System.out.println(name);
return "index";
}
如果参数名称和Controller方法中需要绑定的参数的名称一致,name或value属性可以不用设置。
@PathVariable
@Controller
@RequestMapping("/owners/{ownerId}")
public class OwnerController {
@GetMapping("/pets/{petId}")
public Pet findPet(@PathVariable Long ownerId, @PathVariable Long petId) {
// ...
}
}
@RequestHeader
您可以使用@RequestHeader注释将请求标头绑定到控制器中的方法参数
例如某个请求有如下请求头信息
Host localhost:8080
Accept text/html,application/xhtml+xml,application/xml;q=0.9
Accept-Language fr,en-gb;q=0.7,en;q=0.3
Accept-Encoding gzip,deflate
Accept-Charset ISO -8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive 300
我们可以通过如下代码获取请求头的对应值
@GetMapping("/demo")
public void handle(
@RequestHeader("Accept-Encoding") String encoding,
@RequestHeader("Keep-Alive") long keepAlive) {
//...
}
我们的token很多时候放在header,可通过此方式获取
@CookieValue
获取Cookie的值
例如:cookie的值如下
JSESSIONID=415A4AC178C59DACE0B2C9CA727CDD84
@GetMapping("/demo")
public void handle(@CookieValue("JSESSIONID") String cookie) {
//...
}
一般情况下获取到的cookie的值都是String类型。
@ModelAttribute
@ModelAttribute一个具有如下三个作用:
- 绑定请求参数到命令对象:放在功能处理方法的入参上时,用于将多个请求参数绑定到一个命令对象,从而简化绑定流程,而且自动暴露为模型数据用于视图页面展示时使用;
绑定请求参数到命令对象
@PostMapping("/owners/{ownerId}/pets/{petId}/edit")
public String processSubmit(@ModelAttribute Pet pet) {
// method logic...
}
示例是参数在url上,也可以绑定表单提交
@SessionAttributes & @RequestAttributes
绑定session或request作用域的attribute属性
@Controller
@SessionAttributes("pet") // pet的值会被自动提升保存在Http Servlet中
public class EditPetForm {
// ...
@PostMapping("/pets/{id}")
public String handle(Pet pet, BindingResult errors, SessionStatus status) {
if (errors.hasErrors) {
// ...
}
status.setComplete(); // 使用SessionStatus的setComplete方法清除存储的值
// ...
}
}
}
在第一个请求中,当一个名为 , 的模型属性pet被添加到模型中时,它会自动提升并保存在 HTTP Servlet 会话中。它一直存在,直到另一个控制器方法使用SessionStatus方法参数来清除存储。
此两种方式使用得很少,一般情况下我们都是使用HttpRequest或HttpSession对象来操作。
@RequestMapping("/")
public String hello(@RequestParam(required = false) String name, HttpServletRequest request,
HttpServletResponse response, HttpSession session){
System.out.println(request);
System.out.println(response);
System.out.println(session);
return "Hello World!";
}
可以看到我们直接在Controller方法上定义request等参数SpringMVC自动为我们注入了值。
@RequestBody
前后端分离的项目最常用的注解。用于从请求体绑定前端发送的Object对象参数。一般是前端ajax通过json对象提交的参数,后端需要使用该注解来绑定
@PostMapping("/accounts")
public void handle(@RequestBody Account account) {
// ...
}