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数据直接写回给客户端。
相关推荐
wmd131643067121 分钟前
IDEA插件CamelCase,快速转变命名格式
java·ide·intellij-idea
捂月35 分钟前
Spring Boot 核心逻辑与工作原理详解
java·spring boot·后端
埋头编程~37 分钟前
【C++】踏上C++学习之旅(十):深入“类和对象“世界,掌握编程黄金法则(五)(最终篇,内含初始化列表、静态成员、友元以及内部类等等)
java·c++·学习
菜鸟起航ing1 小时前
Java中日志采集框架-JUL、Slf4j、Log4j、Logstash
java·开发语言·log4j·logback
Nightselfhurt1 小时前
RPC学习
java·spring boot·后端·spring·rpc
苹果醋31 小时前
vue3 在哪些方便做了性能提升?
java·运维·spring boot·mysql·nginx
孔汤姆1 小时前
部署实战(二)--修改jar中的文件并重新打包成jar文件
java·pycharm·jar
Ling_suu1 小时前
SpringMVC——简介及入门
spring·mvc
荆州克莱1 小时前
Vue3 源码解析(三):静态提升
spring boot·spring·spring cloud·css3·技术
世伟爱吗喽2 小时前
NUXT3学习日记四(路由中间件、导航守卫)
学习