Spring MVC系统学习(三)——数据绑定和响应

在Spring MVC中,数据绑定和响应是处理请求和响应的核心部分之一,涉及从请求参数中提取数据并转换为Java对象,以及将处理结果返回到客户端。

1. 数据绑定概述

数据绑定指的是将HTTP请求中的参数自动映射到Java对象中,Spring MVC会根据参数名称和对象字段名进行匹配并完成赋值操作。它通过@RequestParam@ModelAttribute等注解来获取请求数据,Spring MVC会自动进行类型转换。

2. 简单数据绑定

简单数据绑定包括基本数据类型(如intString)、POJO(Plain Old Java Object,即普通Java对象)绑定以及自定义类型转换器。我们分别来看:

2.1 默认类型数据绑定

默认类型数据绑定是指对于HTTP请求中的基本类型(如intdoubleString),Spring MVC能够自动完成绑定。通常我们使用@RequestParam注解来绑定这些简单类型的参数。例如:

java 复制代码
@RequestMapping("/simple")
public String handleSimpleDataBinding(@RequestParam("age") int age, @RequestParam("name") String name) {
    // age 是一个 int 类型,name 是一个 String 类型
    return "result";
}

在这个例子中,agename参数会从请求中获取并绑定到方法的参数中,Spring MVC会自动完成类型转换。

2.2 简单数据类型绑定

除了基本类型外,Spring MVC也能绑定类似日期等常用的简单数据类型。例如可以将请求参数自动转换为Date类型:

java 复制代码
@RequestMapping("/date")
public String handleDateBinding(@RequestParam("birthday") @DateTimeFormat(pattern = "yyyy-MM-dd") Date birthday) {
    // birthday 参数会自动转换为 Date 类型
    return "result";
}

@DateTimeFormat注解用于指定日期格式,这样Spring MVC就能够解析请求中的日期字符串并转换为Date对象。

2.3 POJO 绑定

POJO绑定是指将请求参数自动绑定到一个Java对象中,Spring MVC根据请求参数的名称自动映射到POJO对象的属性中。例如:

java 复制代码
public class User {
    private String name;
    private int age;

    // Getter和Setter方法
}

@RequestMapping("/pojo")
public String handlePOJOBinding(User user) {
    // Spring MVC 会自动将请求参数绑定到User对象的name和age属性
    return "result";
}

请求中的参数名要与POJO对象中的属性名匹配,Spring会自动完成数据绑定。

2.4 自定义类型转换器

对于自定义类型,Spring提供了类型转换器(Converter)接口。你可以创建自己的类型转换器来将请求中的字符串转换为复杂的Java对象。例如:

java 复制代码
public class StringToUserConverter implements Converter<String, User> {
    @Override
    public User convert(String source) {
        String[] data = source.split(",");
        User user = new User();
        user.setName(data[0]);
        user.setAge(Integer.parseInt(data[1]));
        return user;
    }
}

然后你需要在配置类或配置文件中注册这个转换器:

java 复制代码
@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void addFormatters(FormatterRegistry registry) {
        registry.addConverter(new StringToUserConverter());
    }
}

通过这种方式,你可以自定义复杂对象的绑定方式。

3. 复杂数据绑定

复杂数据绑定包括数组、集合、复杂POJO以及JSON数据的绑定。

3.1 数组绑定

Spring MVC支持从请求中将多个参数绑定到数组。例如:

java 复制代码
@RequestMapping("/array")
public String handleArrayBinding(@RequestParam("ids") int[] ids) {
    // ids 是一个 int 数组
    return "result";
}

多个同名参数会自动绑定到数组中。

3.2 集合绑定

类似地,你也可以将多个请求参数绑定到集合中:

java 复制代码
@RequestMapping("/list")
public String handleListBinding(@RequestParam("names") List<String> names) {
    // names 是一个 List<String>
    return "result";
}
3.3 复杂POJO绑定

Spring MVC也支持嵌套的POJO绑定。例如:

java 复制代码
public class Address {
    private String city;
    private String street;
    // Getter和Setter
}

public class User {
    private String name;
    private Address address;
    // Getter和Setter
}

@RequestMapping("/nested")
public String handleNestedPOJOBinding(User user) {
    // Spring MVC 会自动将请求参数绑定到嵌套的POJO中
    return "result";
}

在这个例子中,User对象中包含了Address对象,Spring会自动解析并绑定嵌套对象中的参数。

3.4 JSON数据绑定

对于Ajax请求发送的JSON数据,Spring MVC也可以将其直接转换为POJO对象。你可以使用@RequestBody注解来绑定JSON数据:

java 复制代码
@RequestMapping(value = "/json", method = RequestMethod.POST)
public String handleJsonBinding(@RequestBody User user) {
    // user 参数从请求体中的 JSON 数据中获取
    return "result";
}

此时,Spring MVC会自动将请求体中的JSON数据解析为POJO。

4. 页面跳转

在Spring MVC中,页面跳转有多种方式。不同的返回值类型会触发不同的跳转方式。

4.1 返回值为 void 类型的页面跳转

当控制器方法的返回值为void时,Spring MVC会默认跳转到与请求路径匹配的视图页面。例如:

java 复制代码
@RequestMapping("/default")
public void handleVoid() {
    // 跳转到 /WEB-INF/views/default.jsp
}
4.2 返回值为 String 类型的页面跳转

如果方法返回一个字符串,Spring MVC会将这个字符串解析为视图名称:

java 复制代码
@RequestMapping("/string")
public String handleString() {
    return "result";
}

返回值"result"会被解析为/WEB-INF/views/result.jsp

4.3 返回值为 ModelAndView 类型的页面跳转

ModelAndView允许你同时设置视图名称和传递数据。例如:

java 复制代码
@RequestMapping("/modelandview")
public ModelAndView handleModelAndView() {
    ModelAndView mav = new ModelAndView("result");
    mav.addObject("message", "Hello, Spring MVC!");
    return mav;
}

这个例子中返回视图result,并传递了一个消息。

5. 数据写回

在处理请求后,有时需要将数据写回到客户端,通常是返回字符串或JSON数据。

5.1 普通字符串的写回

你可以通过@ResponseBody注解将普通字符串直接写回到响应体中:

java 复制代码
@RequestMapping("/stringresponse")
@ResponseBody
public String handleStringResponse() {
    return "Hello, Spring MVC!";
}

这样,Hello, Spring MVC!字符串会作为HTTP响应体返回。

5.2 JSON数据的写回

通过@ResponseBody注解和Jackson库,你可以将Java对象转换为JSON并写回给客户端:

java 复制代码
@RequestMapping("/jsonresponse")
@ResponseBody
public User handleJsonResponse() {
    User user = new User();
    user.setName("John");
    user.setAge(30);
    return user;
}

Spring MVC会将User对象自动转换为JSON格式的响应。

6. 小结

  • 数据绑定 :Spring MVC可以通过@RequestParam@ModelAttribute等注解轻松绑定请求参数到Java对象,支持简单和复杂的POJO绑定,甚至支持JSON数据绑定。你还可以通过自定义转换器实现复杂的类型转换。
  • 页面跳转 :Spring MVC支持多种页面跳转方式,返回值可以是voidStringModelAndView,根据需求选择合适的跳转方式。
  • 数据写回 :通过@ResponseBody注解,Spring MVC支持将普通字符串或JSON数据直接写回给客户端。
相关推荐
Asthenia041224 分钟前
Spring扩展点与工具类获取容器Bean-基于ApplicationContextAware实现非IOC容器中调用IOC的Bean
后端
bobz96542 分钟前
ovs patch port 对比 veth pair
后端
Asthenia04121 小时前
Java受检异常与非受检异常分析
后端
uhakadotcom1 小时前
快速开始使用 n8n
后端·面试·github
JavaGuide1 小时前
公司来的新人用字符串存储日期,被组长怒怼了...
后端·mysql
bobz9651 小时前
qemu 网络使用基础
后端
Asthenia04122 小时前
面试攻略:如何应对 Spring 启动流程的层层追问
后端
Asthenia04122 小时前
Spring 启动流程:比喻表达
后端
Asthenia04122 小时前
Spring 启动流程分析-含时序图
后端
ONE_Gua2 小时前
chromium魔改——CDP(Chrome DevTools Protocol)检测01
前端·后端·爬虫