SpringMVC请求与响应

请求与响应

请求映射路径

请求映射路径是通过注解: @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")
    @ResponseBody
    public 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")
    @ResponseBody
    public 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")
    @ResponseBody
    public 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请求乱码处理
    @Override
    protected 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")
    @ResponseBody
    public 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")
    @ResponseBody
    public 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")
    @ResponseBody
    public 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")
    @ResponseBody
    public 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")
    @ResponseBody
    public 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")
    @ResponseBody
    public 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")
    @ResponseBody
    public String toText() {
    
    
        System.out.println("响应文本数据");
        return "response Text";
    }
}

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

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

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

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

@Controller
public class UserController {
    
    
    @RequestMapping("/toJsonList")
    @ResponseBody
    public 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再作为响应体

猜你喜欢

转载自blog.csdn.net/m0_71485750/article/details/128016698