> 文章列表 > Spring请求与响应——请求

Spring请求与响应——请求

Spring请求与响应——请求

Spring请求与响应——请求

    • 请求映射路径
      • @@RequestMapping()
    • 请求参数
      • Get
        • Get发请求参数
        • 接收Get请求参数
      • POST
        • POST发送参数
      • 参数种类
        • POJO类型参数
        • 数组类型类型参数
        • 集合类型参数
        • 时间参数演示
      • JSON数据传输参数
        • 发送请求
        • 接收请求
          • 集合参数与pojo参数演示
        • @RequestBody与@RequestParam区别

Spring请求与响应——请求

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

我们举个示例来理解吧(我们用下面这个结构来举例):
Spring请求与响应——请求

请求映射路径

@@RequestMapping()

还记得什么是映射路径嘛?这玩意不能重名哦~,比如下面这种情况就会报错
Spring请求与响应——请求
我们修改也很简单,按照名字和路径给完整就好了比如:

@Controller
//类上方配置的请求映射与方法上面配置的请求映射连接在一起,形成完整的请求映射路径
@RequestMapping("/user")
public class UserController {//请求路径映射@RequestMapping("/save")@ResponseBodypublic String save(){System.out.println("user save ...");return "{'module':'user save'}";}//请求路径映射@RequestMapping("/delete")@ResponseBodypublic String delete(){System.out.println("user delete ...");return "{'module':'user delete'}";}}
@Controller
public class BookController {//请求路径映射@RequestMapping("/book/save")@ResponseBodypublic String save(){System.out.println("book save ...");return "{'module':'book save'}";}
}
  • 当类上和方法上都添加了@RequestMapping注解,前端发送请求的时候,要和两个注解的value值相加匹配才能访问到。
  • @RequestMapping注解value属性前面加不加/都可以

请求参数

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

Get

Get发请求参数

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

接收Get请求参数

//普通参数:请求参数与形参名称对应即可完成参数传递@RequestMapping("/commonParam")@ResponseBodypublic 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请求中文乱码问题
    Spring请求与响应——请求
    Spring请求与响应——请求

POST

POST发送参数

post请求的参数在请求体内:
Spring请求与响应——请求

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

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

当然如果你的参数名称不一样,我们可以使用@RequestParam注解,来绑定请求参数与形参映射关系,举个例子吧:还是上面那个请求name,age
Spring请求与响应——请求

参数种类

五种请求类型

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

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

POJO类型参数

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

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

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

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

Spring请求与响应——请求

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

数组类型类型参数

  • 接收:
//数组参数:同名请求参数可以直接映射到对应名称的形参数组对象中@RequestMapping("/arrayParam")@ResponseBodypublic String arrayParam(String[] likes){System.out.println("数组参数传递 likes ==> "+ Arrays.toString(likes));return "{'module':'array param'}";}
  • 请求:
  • Spring请求与响应——请求
    看看后台吧:
    Spring请求与响应——请求

集合类型参数

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

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

Spring请求与响应——请求
这个时候 @RequestParam 就该出场了。

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

时间参数演示

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

**//日期参数//使用@DateTimeFormat注解设置日期类型数据格式,默认格式yyyy/MM/dd@RequestMapping("/dataParam")@ResponseBodypublic 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'}";}**

Spring请求与响应——请求

名称 @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 {
}

发送请求

Spring请求与响应——请求

接收请求

@RequestBody

集合参数与pojo参数演示
//集合参数:json格式//1.开启json数据格式的自动转换,在配置类中开启@EnableWebMvc//2.使用@RequestBody注解将外部传递的json数组数据映射到形参的集合对象中作为数据@RequestMapping("/listParamForJson")@ResponseBodypublic 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")@ResponseBodypublic 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")@ResponseBodypublic String listPojoParamForJson(@RequestBody List<User> list){System.out.println("list pojo(json)参数传递 list ==> "+list);return "{'module':'list pojo for json param'}";}

简单看一下josn格式吧,这是之前pojo的例子:
Spring请求与响应——请求

Spring请求与响应——请求

名称 @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注解