您现在的位置是:首页 >学无止境 >Spring请求与响应——请求网站首页学无止境

Spring请求与响应——请求

一哑7 2023-06-02 04:00:02
简介Spring请求与响应——请求

SpringMVC介绍

不知道是否还对这个图有印象,我们该开始理解一下交互问题了。

我们举个示例来理解吧(我们用下面这个结构来举例):
项目结构

请求映射路径

@@RequestMapping()

还记得什么是映射路径嘛?这玩意不能重名哦~,比如下面这种情况就会报错
在这里插入图片描述
我们修改也很简单,按照名字和路径给完整就好了比如:

@Controller
//类上方配置的请求映射与方法上面配置的请求映射连接在一起,形成完整的请求映射路径
@RequestMapping("/user")
public class UserController {
    //请求路径映射
    @RequestMapping("/save")
    @ResponseBody
    public String save(){
        System.out.println("user save ...");
        return "{'module':'user save'}";
    }
    //请求路径映射
    @RequestMapping("/delete")
    @ResponseBody
    public String delete(){
        System.out.println("user delete ...");
        return "{'module':'user delete'}";
    }

}
@Controller
public class BookController {
    //请求路径映射
    @RequestMapping("/book/save")
    @ResponseBody
    public String save(){
        System.out.println("book save ...");
        return "{'module':'book save'}";
    }
}

  • 当类上和方法上都添加了@RequestMapping注解,前端发送请求的时候,要和两个注解的value值相加匹配才能访问到。
  • @RequestMapping注解value属性前面加不加/都可以

请求参数

请求路径设置好后,只要确保页面发送请求地址和后台Controller类中配置的路径一致,就可以接收到前端的请求,接收到请求后,就该接收页面传递的参数了。
请求参数的传递与接收是和请求方式有关系的,目前比较常见的两种请求方式为:GET、POST
我们以这个结构举例:
在这里插入图片描述

Get

Get发请求参数

发送请求与参数(我们以普通参数举例下面介绍其他类型):
get发请求参数
很简单吧跟在后面,有多个的话用“&”符号连接就好了。

接收Get请求参数

//普通参数:请求参数与形参名称对应即可完成参数传递
    @RequestMapping("/commonParam")
    @ResponseBody
    public String commonParam(String name ,int age){
        System.out.println("普通参数传递 name ==> "+name);
        System.out.println("普通参数传递 age ==> "+age);
        return "{'module':'common param'}";
    }
  • 值得注意的是,我们在Idea中后台可能看到中文的请求符号可能会出现乱码Tomcat8.5以后的版本才处理了中文乱码的问题,所以出现乱码需要修改pom.xml来解决GET请求中文乱码问题
    在这里插入图片描述
    在这里插入图片描述

POST

POST发送参数

post请求的参数在请求体内:
在这里插入图片描述

接收当然是一样的啦;值得注意的是如果出现中文乱码,可以使过滤器:

 //乱码处理
    @Override
    protected Filter[] getServletFilters() {
        CharacterEncodingFilter filter = new CharacterEncodingFilter();
        filter.setEncoding("UTF-8");
        return new Filter[]{filter};//多个过滤器用逗号隔开
    }

当然如果你的参数名称不一样,我们可以使用@RequestParam注解,来绑定请求参数与形参映射关系,举个例子吧:还是上面那个请求name,age
在这里插入图片描述

参数种类

五种请求类型

  • 普通参数
  • POJO类型参数
  • 嵌套POJO类型参数
  • 数组类型参数
  • 集合类型参数

普通类型我们在认识Get与Post的时候已经介绍过了就不赘述了。

POJO类型参数

GET或POST来发送请求和数据,所携带的数据都是比较简单的数据,如果参数多呢,一个一个加在那里肯定不符合简洁开发咯,我们肯定是把那些参数组织成一个实体类比如name+age=User类。

对没错,POJO就是把这些形参组成一个类,用这个类传递,🍊个🌰:

//POJO参数:请求参数与形参对象中的属性对应即可完成参数传递
    @RequestMapping("/pojoParam")
    @ResponseBody
    public String pojoParam(User user){
        System.out.println("pojo参数传递 user ==> "+user);
        return "{'module':'pojo param'}";
    }

如果只是简单的组成一个类就罢了但是;
走过路过不要错过,加个🌰,万一我们的参数里嵌套有引用类型呢(其他类比如User可以有地址):

在这里插入图片描述

//嵌套POJO参数:嵌套属性按照层次结构设定名称即可完成参数传递
    @RequestMapping("/pojoContainPojoParam")
    @ResponseBody
    public String pojoContainPojoParam(User user){
        System.out.println("pojo嵌套pojo参数传递 user ==> "+user);
        return "{'module':'pojo contain pojo param'}";
    }
  • POJO参数接收,前端GET和POST发送请求数据的方式不变。
  • 请求参数key的名称要和POJO中属性的名称一致,否则无法封装

数组类型类型参数

  • 接收:
//数组参数:同名请求参数可以直接映射到对应名称的形参数组对象中
    @RequestMapping("/arrayParam")
    @ResponseBody
    public String arrayParam(String[] likes){
        System.out.println("数组参数传递 likes ==> "+ Arrays.toString(likes));
        return "{'module':'array param'}";
    }
  • 请求:
  • 在这里插入图片描述
    看看后台吧:
    在这里插入图片描述

集合类型参数

值得注意的是:SpringMVC会将List看做是一个POJO对象来处理,将其创建一个对象并准备把前端的数据封装到对象中,但是List是一个接口无法创建对象,所以会报错报错。

//集合参数:同名请求参数可以使用@RequestParam注解映射到对应名称的集合对象中作为数据
    @RequestMapping("/listParam")
    @ResponseBody
    public String listParam(List<String> likes){
        System.out.println("集合参数传递 likes ==> "+ likes);
        return "{'module':'list param'}";
    }

在这里插入图片描述
这个时候 @RequestParam 就该出场了。

  • 接收:
//集合参数:同名请求参数可以使用@RequestParam注解映射到对应名称的集合对象中作为数据
    @RequestMapping("/listParam")
    @ResponseBody
    public String listParam(@RequestParam List<String> likes){
        System.out.println("集合参数传递 likes ==> "+ likes);
        return "{'module':'list param'}";
    }
  • 请求:
    在这里插入图片描述

时间参数演示

@DateTimeFormat(pattern="yyyy-MM-dd ")
@DateTimeFormat(pattern=“yyyy/MM/dd HH:mm:ss”)

**//日期参数
    //使用@DateTimeFormat注解设置日期类型数据格式,默认格式yyyy/MM/dd
    @RequestMapping("/dataParam")
    @ResponseBody
    public String dataParam(Date date,
                            @DateTimeFormat(pattern="yyyy-MM-dd") Date date1,
                            @DateTimeFormat(pattern="yyyy/MM/dd HH:mm:ss") Date date2){
        System.out.println("参数传递 date ==> "+date);
        System.out.println("参数传递 date1(yyyy-MM-dd) ==> "+date1);
        System.out.println("参数传递 date2(yyyy/MM/dd HH:mm:ss) ==> "+date2);
        return "{'module':'data param'}";
    }**

在这里插入图片描述

名称@DateTimeFormat
类型形参注解
位置SpringMVC控制器方法形参前面
作用设定日期时间型数据格式
相关属性pattern:指定日期时间格式字符串
名称@RequestParam
类型形参注解
位置SpringMVC控制器方法形参定义前面
作用绑定请求参数与处理器方法形参间的关系
相关参数required:是否为必传参数
defaultValue:参数默认值

JSON数据传输参数

我们现在一般异步调用。前后台以异步方式进行交换,传输的数据使用的是JSON,下来我们看看前端如果发送的是JSON数据,后端如何接收。

  • 对于JSON数据类型,我们常见的有三种:
    • json普通数组([“value1”,“value2”,“value3”,…])
    • json对象({key1:value1,key2:value2,…})
    • json对象数组([{key1:value1,…},{key2:value2,…}])

前期准备如下:

  • SpringMVC默认使用的是jackson来处理json的转换,所以需要在pom.xml添加jackson依赖
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.9.0</version>
</dependency>
  • 开启SpringMVC注解支持
    • 在SpringMVC的配置类中开启SpringMVC的注解支持,这里面就包含了将JSON转换成对象的功能。
@Configuration
@ComponentScan("com.taro.controller")
//开启json数据类型自动转换
@EnableWebMvc
public class SpringMvcConfig {
}

发送请求

在这里插入图片描述

接收请求

@RequestBody

集合参数与pojo参数演示
//集合参数:json格式
    //1.开启json数据格式的自动转换,在配置类中开启@EnableWebMvc
    //2.使用@RequestBody注解将外部传递的json数组数据映射到形参的集合对象中作为数据
    @RequestMapping("/listParamForJson")
    @ResponseBody
    public String listParamForJson(@RequestBody List<String> likes){
        System.out.println("list common(json)参数传递 list ==> "+likes);
        return "{'module':'list common for json param'}";
    }
//POJO参数:json格式
    //1.开启json数据格式的自动转换,在配置类中开启@EnableWebMvc
    //2.使用@RequestBody注解将外部传递的json数据映射到形参的实体类对象中,要求属性名称一一对应
    @RequestMapping("/pojoParamForJson")
    @ResponseBody
    public String pojoParamForJson(@RequestBody User user){
        System.out.println("pojo(json)参数传递 user ==> "+user);
        return "{'module':'pojo for json param'}";
    }

```java
//集合参数:json格式
    //1.开启json数据格式的自动转换,在配置类中开启@EnableWebMvc
    //2.使用@RequestBody注解将外部传递的json数组数据映射到形参的保存实体类对象的集合对象中,要求属性名称一一对应
    @RequestMapping("/listPojoParamForJson")
    @ResponseBody
    public String listPojoParamForJson(@RequestBody List<User> list){
        System.out.println("list pojo(json)参数传递 list ==> "+list);
        return "{'module':'list pojo for json param'}";
    }

简单看一下josn格式吧,这是之前pojo的例子:
在这里插入图片描述

在这里插入图片描述

名称@EnableWebMvc
类型配置类注解
位置SpringMVC配置类定义上方
作用开启SpringMVC多项辅助功能
名称@RequestBody
类型形参注解
位置SpringMVC控制器方法形参定义前面
作用将请求中请求体所包含的数据传递给请求参数,此注解一个处理器方法只能使用一次

@RequestBody与@RequestParam区别

  • 区别
    • @RequestParam用于接收url地址传参,表单传参【application/x-www-form-urlencoded】
    • @RequestBody用于接收json数据【application/json】
  • 应用
    • 后期开发中,发送json格式数据为主,@RequestBody应用较广
    • 如果发送非json格式数据,选用@RequestParam接收请求参数
  • 重新巩固下SpringMVCSpringMVC接收JSON数据的实现步骤为:
    (1)导入jackson包
    (2)使用PostMan发送JSON数据
    (3)开启SpringMVC注解驱动,在配置类上添加@EnableWebMvc注解
    (4)Controller方法的参数前添加@RequestBody注解
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。