吐血整理!SpringMVC常用简单注解(超详细)

14 篇文章 0 订阅
1 篇文章 0 订阅

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

  2. 编写前端代码

    我们采用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>
    
  3. 编写实体类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;
    }
    
  4. 编写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

请添加图片描述

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

请添加图片描述

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;
    }
    
  2. 访问

    localhost:8080/user/1/liweihua

2.4运行结果以及分析

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

请添加图片描述

请添加图片描述

分析:

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运行结果以及分析

谷歌浏览器出现如下
请添加图片描述

IE是这样的

请添加图片描述

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运行结果以及分析

正常运行结果是

请添加图片描述

如果你没有过配置,那么你肯定会出现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;
    }
    
  2. 编写ModelAttribute

    private String data="none";//Controller的成员变量是data
    @ModelAttribute
    public void init(){
        data="wuhu";//执行初始化操作
    }
    

5.4运行结果以及分析

访问 localhost:8080/modelattribute

请添加图片描述

发现不再是成员变量最开始的值“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 "设置成功!";
        }
    
  2. 新建获取Cookie的Mapping

    @RequestMapping("/cookieValueTest")
    public String cookieValueTest(@CookieValue(value = "userName") String userName) {
        System.out.println("通过@CookieValue获得用户名:" + userName);
        return "Cookie中的用户名是"+ userName;
    }
    
  3. 访问

    localhost:8080/setCookie

  4. 访问

    localhost:8080/cookieValueTest

6.4运行结果以及分析

请添加图片描述

再访问

请添加图片描述

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;
    }
    
  2. 访问

    localhost:8080/Param?id=xxx&name=xxx

7.4运行结果以及分析

运行结果

请添加图片描述

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

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值