> 文章列表 > SpringMVC请求与响应

SpringMVC请求与响应

SpringMVC请求与响应

文章目录

  • 请求与响应
    • 请求映射路径
    • 请求传参
      • 传递普通参数
      • 传递实体类参数
      • 传递数组参数
      • 传递集合参数
      • 传递JSON参数
      • 传递日期参数
    • 响应数据

请求与响应

请求映射路径

请求映射路径是通过注解: @RequestMapping

类型:方法注解, 类注解

位置:SpringMVC控制器方法定义上方

作用:设置当前控制器方法请求访问路径,如果设置在类上统一设置当前控制器方法请求访问路径前缀

属性: value(默认), 请求访问路径,或访问路径前缀

// 当前控制器添加@ResponseBody注解
@ResponseBody
@RequestMapping("/save")
public String save(){System.out.println("user save ...");return "{'info':'springmvc'}";
}
// 当前类添加注解, 设置请求访问路径@Controller
@RequestMapping("/book")
public class BookController {@RequestMapping("/save")@ResponseBodypublic String save() {System.out.println("book save...");return "{'module': 'book save'}";}
}

请求传参

传递普通参数

GET请求传递普通参数:url地址传参,地址参数名与形参变量名相同,定义形参即可接收参数

地址参数名和形参变量名相同:

示例请求: http://localhost:8080/commonParam?name=chenyq&age=18

@Controller
public class UserController {@RequestMapping("/commonParam")@ResponseBodypublic String commonParam(String name, int age) {System.out.println("普通参数传递 name ===> " + name);System.out.println("普通参数传递 age ===> " + age);return "{'module': 'common param'}";}
}

post请求传递普通参数:form表单post请求传参,表单参数名与形参变量名相同,定义形参即可接收参数

@Controller
public class UserController {@RequestMapping("/commonParam")@ResponseBodypublic String commonParam(String name, int age) {System.out.println("普通参数传递 name ===> " + name);System.out.println("普通参数传递 age ===> " + age);return "{'module': 'common param'}";}
}

当请求传递的参数名和形参变量名不一致时, 我们也可以使用@RequestParam注解绑定请求参数与处理器方法形参间的关系

例如url地址传递参数名是name, 形参变量名使用username, 我们可以使用注解将name和username绑定起来

@RequestParam注解参数

  • required:是否为必传参数
  • defaultValue:参数默认值

示例请求: http://localhost:8080/commonParam?name=chenyq&age=18

@Controller
public class UserController {@RequestMapping("/commonParam")@ResponseBody// @RequestParam注解绑定地址参数名public String commonParam(@RequestParam("name") String username, int age) {System.out.println("普通参数传递 name ===> " + username);System.out.println("普通参数传递 age ===> " + age);return "{'module': 'common param'}";}
}

Post请求中文乱码处理

为web容器添加过滤器并指定字符集,Spring-web包中提供了专用的字符过滤器

public class ServletContainersInitConfig extends AbstractAnnotationConfigDispatcherServletInitializer {// post请求乱码处理@Overrideprotected Filter[] getServletFilters() {CharacterEncodingFilter filter = new CharacterEncodingFilter();filter.setEncoding("utf-8");return new Filter[]{filter};}protected Class<?>[] getRootConfigClasses() {return new Class[0];}protected Class<?>[] getServletConfigClasses() {return new Class[]{SpringMvcConfig.class};}protected String[] getServletMappings() {return new String[]{"/"};}
}

传递实体类参数

POJO参数:请求的参数名与形参对象属性名相同,定义POJO类型形参即可接收参数

User实体类

public class User {private String name;private int age;
}

需要保证传递参数的变量名和对象属性名保持一致

示例请求: http://localhost:8080/pojoParam?name=chenyq&age=19

@Controller
public class UserController {@RequestMapping("/pojoParam")@ResponseBodypublic String pojoParam(User user) {System.out.println("pojo参数传递 user ===>" + user);return "{'module': 'pojo param'}";}
}

嵌套POJO参数:POJO对象中包含POJO对象

User实体类中嵌套了Address实体类

public class User {private String name;private int age;private Address address;
}

Address实体类

public class Address {private String province;private String city;
}

嵌套POJO参数:请求参数名与形参对象属性名相同,按照对象层次结构关系即可接收嵌套POJO属性参数

方法中无变化, 通过实体类参数依然可以接收

示例请求: http://localhost:8080/pojoParam?name=chenyq&age=19&address.province=chongqing&address.city=chongqing

@Controller
public class UserController {@RequestMapping("/pojoParam")@ResponseBodypublic String pojoParam(User user) {System.out.println("pojo嵌套参数传递 user ===>" + user);return "{'module': 'pojo param'}";}
}

传递数组参数

数组参数:请求参数名与形参对象属性名相同且请求参数为多个,定义数组类型形参即可接收参数

例如接收用户有哪些爱好: 请求地址中多个参数的变量名都使用同一个数组名即可接收

示例请求: http://localhost:8080/springmvc_03_request/arrayParam?likes=game&likes=music

例如参数1likes, 参数2likes, 与形参的数组名likes一致即可接收

@Controller
public class UserController {@RequestMapping("/arrayParam")@ResponseBodypublic String arrayParam(String[] likes) {System.out.println("数组参数传递 likes ===>" + Arrays.toString(likes));return "{'module': 'array param'}";}
}

传递集合参数

集合保存普通参数:请求参数名与形参集合对象名相同且请求参数为多个,@RequestParam绑定参数关系

传递集合参数需要使用@RequestParam注解绑定关系

示例请求: http://localhost:8080/listParam?likes=aaa&likes=bbb

@Controller
public class UserController {@RequestMapping("/listParam")@ResponseBodypublic String listParam(@RequestParam List<String> likes) {System.out.println("集合参数传递 likes ===>" + likes);return "{'module': 'list param'}";}
}

传递JSON参数

接收请求中的JSON数据步骤如下:

添加json数据转换相关坐标

<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.9.0</version>
</dependency>

开启自动转换json数据的支持

  • @EnableWebMvc注解功能强大,该注解整合了多个功能,此处仅使用其中一部分功能,即json数据进行自动类型转换
@Configuration
@ComponentScan("com.chenyq.controller")
@EnableWebMvc
public class SpringMvcConfig {
}

设置接收json数据

@RequestBody注解, 将请求中请求体所包含的数据传递给形参参数,此注解一个处理器方法只能使用一次

@Controller
public class UserController {@RequestMapping("/listJsonParam")@ResponseBodypublic String listJsonParam(@RequestBody List<String> likes) {System.out.println("集合参数传递 likes ===>" + likes);return "{'module': 'json list param'}";}
}

Postman设置发送json数据(请求body中添加json数据)

在这里插入图片描述

@RequestBody与@RequestParam区别:

区别:

@RequestParam用于接收url地址传参,表单传参【application/x-www-form-urlencoded】

@RequestBody用于接收json数据【application/json】

应用:

后期开发中,发送json格式数据为主,@RequestBody应用较广

如果发送非json格式数据,选用@RequestParam接收请求参数

传递日期参数

日期类型数据基于系统不同格式也不尽相同

2088-08-18

2088/08/18

08/18/2088

接收形参时,需要使用@DateTimeFormat注解, 根据不同的日期格式设置不同的接收方式

@DateTimeFormat写在控制器方法的形参前面, 通过属性pattern日期时间格式字符串, 设定日期时间型数据格式

示例请求: http://localhost:8080/dateParam?date=21/09/2022 22:30:00

@Controller
public class UserController {@RequestMapping("/dateParam")@ResponseBodypublic String dateParam(@DateTimeFormat(pattern = "dd/MM/yyyy HH:mm:ss") Date date) {System.out.println("date参数传递 date ===> " + date);return "{'module': 'date param'}";}
}

响应数据

响应页面(了解)

只需要返回页面名称的字符串

@Controller
public class UserController {
@RequestMapping("/toJumpPage")
public String toJumpPage() {System.out.println("跳转页面");return "index.jsp";
}

响应文本数据(了解)

@Controller
public class UserController {@RequestMapping("/toText")@ResponseBodypublic String toText() {System.out.println("响应文本数据");return "response Text";}
}

响应json数据-实体类对象转json

我们配置的json转换坐标, 会自动将pojo对象转换为json数据

@Controller
public class UserController {@RequestMapping("/toJson")@ResponseBodypublic User toJsonPojo() {System.out.println("返回JSON对象数据");// 创建一个User对象并返回User user = new User("chenyq", 18);return user;}
}

响应json数据-对象集合转json数组

@Controller
public class UserController {@RequestMapping("/toJsonList")@ResponseBodypublic List<User> toJsonList() {System.out.println("返回JSON对象集合数据");// 创建list集合, 添加User对象并返回List<User> list = new ArrayList<User>();User user1 = new User("chenyq", 18);User user2 = new User("kaisa", 20);list.add(user1);list.add(user2);return list;}
}

@ResponseBody注解: 设置当前控制器的返回值为响应体, 如果返回值是字符串就返回String, 如果是一个对象, 就转换为JSON再作为响应体