注解解析直达目录

  • 1.用于接收前端给后端的json数据-**@RequestBody**
  • 1.1需求分析
  • 1.2具体情境
  • 1.3最佳实操
  • 1.4运行结果以及分析
  • 2.获取restful风格url中的参数值 -**@PathVariable**
  • 2.1需求分析
  • 2.2具体情境
  • 2.3最佳实操
  • 2.4运行结果以及分析
  • 3.获取http请求的header部分信息 - **@RequestHeader**
  • 3.1需求分析
  • 3.2具体情境
  • 3.3最佳实操
  • 3.4运行结果以及分析
  • 4.获取矩阵变量的值 - **@MatrixVariable**
  • 4.1需求分析
  • 4.2具体情境
  • 4.3最佳实操
  • 4.4运行结果以及分析
  • 5.让被注释的方法在一个Controller中首先被执行 - **@ModelAttribute**
  • 5.1需求分析
  • 5.2具体情境
  • 5.3最佳实操
  • 5.4运行结果以及分析
  • 6.获得Cookie - **@CookieValue**
  • 6.1需求分析
  • 6.2具体情境
  • 6.3最佳实操
  • 6.4运行结果以及分析
  • 7.普通参数传递 - **@RequestParam**
  • 7.1需求分析
  • 7.2具体情境
  • 7.3最佳实操
  • 7.4运行结果以及分析


1.用于接收前端给后端的json数据-@RequestBody

1.1需求分析

如今前端与后端主流的数据交互格式就是json,当我们前端页面需要向后端传递数据时,我们springMVC给了我们一个注解,就是@RequestBody。它可以将前端数据接收,并且为程序所用。

1.2具体情境

前端:假设为一个用户信息的收集,表单验证

后端:需要得到前端用户填写的数据

1.3最佳实操

  1. 引入webjar(用于前端主页导入JQuery)
    添加maven依赖
<dependency>
    <groupId>org.webjars</groupId>
    <artifactId>jquery</artifactId>
    <version>3.5.1</version>
</dependency>

添加后,整个项目中就会有一个JQuery,路径为:

http://localhost:8080/webjars/jquery/3.5.1/jquery.js

  1. 编写前端代码
    我们采用ajax的发送方式,编写index.html,这样子就可以直接用localhost:8080访问
<html>
<head>
    <meta charset="UTF-8">
    <title>测试</title>
</head>
<body>
<form>
    <input type="button" value="点我发送" id="sub"/>
</form>
<script src="webjars/jquery/3.5.1/jquery.js "></script>
<script type="text/javascript">
    $(document).ready(function(){
        $("#sub").click(function(){
            $.ajax({
                url:'http://10.136.9.228:8080/test',//向后端发送的路径,请改为你自己的ip
                contentType:'application/json;charset=utf-8',//发送的数据类型是json以及字符编码
                data:'{"name":"张三","age":18}',//发送的数据
                type:'post',//发送的方式
                success:function(data){//成功的回调函数
                    console.log(data);
                },error:function(error){//发送失败的回调函数
                    console.log(error)
                }
            })
        })
    });
</script>
</body>
</html>
  1. 编写实体类User
package com.springweb.pojo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;

@Data//get,set方法
@ToString//tostring方法
@AllArgsConstructor//全参数构造方法
@NoArgsConstructor//无参数构造方法
public class User {
    private String name;
    private int age;
}
  1. 编写Controller
package com.springweb.controller;

import com.springweb.pojo.User;
import org.springframework.web.bind.annotation.*;

import java.util.HashMap;
import java.util.Map;

@RestController
public class TestController {
    @RequestMapping("/test")
    public void po(@RequestBody User user){
        System.out.println("传来的用户名是"+user.getName()+", 传来的用户的年龄是"+user.getAge());
    }
}

1.4运行结果以及分析

我们这里用ip:8080的方式,如果还是访问localhost:8080,向后端发送请求时会产生跨域问题,所以采用ip:8080

java springmvc 注解详解 springmvc全部注解_spring boot

点击后控制台输出传输到后台的数据

java springmvc 注解详解 springmvc全部注解_java springmvc 注解详解_02

SpringMVC看见当你的User被RequestBody注解时,当前端给对应的请求时,就会自动解析JSON字符串,将字符串的内容封装入User中,但是如果json的key值与User中的对象值不相等,则认为是无效的值,所以不会封装,使用时注意key值与属性值对应即可

2.获取restful风格url中的参数值 -@PathVariable

2.1需求分析

我们现在所上的网站基本上是这样的一个格式

XXX.COM/xxx/xxx

如果我们仍然用原生的servlet的话很难做到这样的url,像这样的url格式,我们称之为restful风格

2.2具体情境

我们可以用路径变量进行传值,第一个代表什么意思,第二个代表什么意思,等等

2.3最佳实操

  1. 编写Controller
@RequestMapping("/user/{id}/{name}")
public Map getUser(@PathVariable("id") Integer id,
                   @PathVariable("name") String name){
    Map map=new HashMap<String,Object>();
    map.put("id",id);
    map.put("name",name);
    return map;
}
  1. 访问
    localhost:8080/user/1/liweihua

2.4运行结果以及分析

访问后的数据回显根据你的url内的值变化而变化

java springmvc 注解详解 springmvc全部注解_java_03

java springmvc 注解详解 springmvc全部注解_java springmvc 注解详解_04

分析:

url中第二个路径代表id,第三个代表name,当访问匹配时,将路径变量中的参数取出并将map赋值,回显到浏览器,所以url不同,则回显的map值也不同

3.获取http请求的header部分信息 - @RequestHeader

3.1需求分析

当一个客户机相当于浏览器向web服务器发送一个请求时,需要发送一个请求的命令行,一般是GET或者POST命令,当发送POST命令时,还会向服务器发送一个叫“Content-Length”的请求头(Request Header) 用来指明数据长度,除此之外,还会发送一些其他的Headers,如:

Accept-Charset 浏览器支持的字符编码

User-Agent (客户端的类型,一般用来区分不同的浏览器)

我们可以通过请求头来给不同客户机做出不同的兼容性体验等等

3.2具体情境

我需要对Edge浏览器和Google浏览器做出不同的反应,知道客户端的类型是怎样的,方便我们做出适配

3.3最佳实操

新增一个RequestMapping

@RequestMapping("/header")
public String b(@RequestHeader("User-Agent") String client,@RequestHeader("Accept-Encoding") String encoding){
    return "客户端是"+ client + "<br/>支持的编码是" + encoding;
}

不同浏览器访问localhost:8080/header

3.4运行结果以及分析

谷歌浏览器出现如下

java springmvc 注解详解 springmvc全部注解_需求分析_05

IE是这样的

java springmvc 注解详解 springmvc全部注解_springmvc_06

4.获取矩阵变量的值 - @MatrixVariable

4.1需求分析

Spring3.2后,该注解出现,目的是为了拓展URL请求地址的功能

多个变量可以使用“;”(分号)来分隔,如果是一个变量的多个值,可以使用逗号来分隔,或者可以使用重复的变量名

4.2具体情境

我们知道,在实际开发中,当Cookie没有被禁用之前,客户端向服务器发送请求时,会将保存在Cookie中的sessionId取出并发送给服务器,服务器将session中的值取出,但是,当Cookie被禁用的时候,我们取不到sessionId,就没有办法取出session的值,就可以采用矩阵变量的方式,将sessionid发送给服务器,形式如下:

/path/sell;sessionId=xxxxx

4.3最佳实操

  1. 写Mapping
@RequestMapping("/school/{schoolId}")
public String a(@PathVariable("schoolId") String schoolId, @MatrixVariable("sid") int studentId){
    return "学校id是" + schoolId + "学生id是" + studentId;
}
  1. 访问
    http://localhost:8080/school/1;sid=111

4.4运行结果以及分析

正常运行结果是

java springmvc 注解详解 springmvc全部注解_java springmvc 注解详解_07

如果你没有过配置,那么你肯定会出现400的错误,因为SpringBoot默认禁用掉了矩阵变量的配置,将Url中的“;”(分号)自动剔除,会找不到对应的矩阵变量

解决办法:

新增一个配置类,实现WebMvcConfigurer接口,设置UrlPathHelper中的自动屏蔽分号为关闭

@Configuration
public class Config implements WebMvcConfigurer {
    @Override
    public void configurePathMatch(PathMatchConfigurer configurer){
        UrlPathHelper urlPathHelper = new UrlPathHelper();
        urlPathHelper.setRemoveSemicolonContent(false);
        configurer.setUrlPathHelper(urlPathHelper);
    }
}

5.让被注释的方法在一个Controller中首先被执行 - @ModelAttribute

5.1需求分析

需要对Controller中的成员变量进行初始化等操作,或者想要在访问Controller下的Mapping之前执行一段程序,就可以使用ModelAttribute

由于@ModelAttribute注释的方法会在此controller每个方法执行前被执行,因此对于一个controller映射多个URL的用法来说,要谨慎使用。

5.2具体情境

Controller中有一个data成员变量,我想为它赋值,作为初始化,当有请求被响应时,可以获取初始化后的值

5.3最佳实操

  1. 编写Mapping
@RequestMapping("/modelattribute")
public String test(){
    return data;
}
  1. 编写ModelAttribute
private String data="none";//Controller的成员变量是data
@ModelAttribute
public void init(){
    data="wuhu";//执行初始化操作
}

5.4运行结果以及分析

访问 localhost:8080/modelattribute

java springmvc 注解详解 springmvc全部注解_springmvc_08

发现不再是成员变量最开始的值“none”,而是回显了一个“wuhu”

当SpringMVC匹配到请求时,会先执行被ModelAttribute注解的代码,将data赋值为wuhu,所以再次访问时值就会产生变化

6.获得Cookie - @CookieValue

6.1需求分析

将cookie中的值取出,方便服务器做出对应的响应

6.2具体情境

先设置用户端的Cookie,再从服务器中读取,发送给界面

6.3最佳实操

  1. 新建创建Cookie的Mapping
@RequestMapping("/setCookie")
    public String setCookie(HttpServletResponse response){
        Cookie cookie = new Cookie("userName","huaye");
        response.addCookie(cookie);
        return "设置成功!";
    }
  1. 新建获取Cookie的Mapping
@RequestMapping("/cookieValueTest")
public String cookieValueTest(@CookieValue(value = "userName") String userName) {
    System.out.println("通过@CookieValue获得用户名:" + userName);
    return "Cookie中的用户名是"+ userName;
}
  1. 访问
    localhost:8080/setCookie
  2. 访问
    localhost:8080/cookieValueTest

6.4运行结果以及分析

java springmvc 注解详解 springmvc全部注解_java springmvc 注解详解_09

再访问

java springmvc 注解详解 springmvc全部注解_需求分析_10

7.普通参数传递 - @RequestParam

7.1需求分析

多用于普通请求参数的提交和表单的提交等等

7.2具体情境

用户需要提交自己的id和用户名到后台验证

7.3最佳实操

  1. 编写RequestMapping
@RequestMapping("/Param")
public String pa(@RequestParam("id") int userid,@RequestParam("name") String username){
    String x="传入的用户id是"+userid+"传入的用户名是"+username;
    return x;
}
  1. 访问
    localhost:8080/Param?id=xxx&name=xxx

7.4运行结果以及分析

运行结果

java springmvc 注解详解 springmvc全部注解_需求分析_11

传递的参数会在后台进行匹配,id与@RequestParam中的value值进行匹配,匹配成功就赋值给被成功匹配的RequestParam注解的参数,于是id就赋值给userid;name就赋值给了username