第十二章 Spring MVC 框架扩展和SSM框架整合(2023版本IDEA)


  前面章节中,系统的升级改造过程中遗留了一些和异步请求相关的功能,本章将完善这些内容,并学习Spring MVC 框架中数据转换、数据格式化处理的相关知识。(如果没有了解可以去我主页看看 第一至十一章的内容来学习)通过学习本章内容,我们将理解Spring MVC 框架处理JSON时间传递、多视图解析器的工作原理和数据格式转换的基本概念及流程,完成Spring MVC+Spring+MyBatis(SSM)框架的搭建工作。

12.1 Spring MVC 框架处理JSON数据

  JSON格式数据在现阶段的Web项目开发中扮演着非常重要的角色。在前端页面和后台交互的过程中,需要一种格式清晰、高效且两端都可以轻松使用的数据格式做交互的媒介,JSON正可以满足这一需求。

12.1.1 JSON数据的传递处理

在Java中处理JSON数据的传递通常涉及到序列化和反序列化操作。序列化是将Java对象转换为JSON格式的字符串,以便可以将其存储或通过网络传输;反序列化则是将JSON格式的字符串转换回Java对象。在Java中,有很多库可以帮助我们完成这些操作,如Jackson、Gson等。

以下是一个使用Jackson库进行JSON数据传递处理的简单示例。

1. 添加Jackson依赖
首先,你需要在你的项目中添加Jackson的依赖。如果你使用的是Maven,可以在pom.xml文件中添加如下依赖:

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

2. 创建一个Java类
接下来,创建一个Java类,用于表示你要序列化和反序列化的数据。

public class User {
     
    private String name;  
    private int age;  
  
    // 构造方法、getter和setter省略  
  
    public User(String name, int age) {
     
        this.name = name;  
        this.age = age;  
    }  
  
    // 省略getter和setter方法  
  
    @Override  
    public String toString() {
     
        return "User{" +  
                "name='" + name + '\'' +  
                ", age=" + age +  
                '}';  
    }  
}

3. 序列化Java对象为JSON字符串
现在,你可以使用Jackson的ObjectMapper类来将User对象序列化为JSON字符串。

import com.fasterxml.jackson.databind.ObjectMapper;  
  
public class JsonSerializerExample {
     
    public static void main(String[] args) {
     
        try {
     
            User user = new User("John Doe", 30);  
  
            ObjectMapper objectMapper = new ObjectMapper();  
            String jsonString = objectMapper.writeValueAsString(user);  
  
            System.out.println(jsonString);  
        } catch (Exception e) {
     
            e.printStackTrace();  
        }  
    }  
}

4. 反序列化JSON字符串为Java对象
同样地,你可以使用ObjectMapper类将JSON字符串反序列化为Java对象。

import com.fasterxml.jackson.databind.ObjectMapper;  
  
public class JsonDeserializerExample {
     
    public static void main(String[] args) {
     
        try {
     
            String jsonString = "{\"name\":\"Jane Doe\",\"age\":28}";  
  
            ObjectMapper objectMapper = new ObjectMapper();  
            User user = objectMapper.readValue(jsonString, User.class);  
  
            System.out.println(user);  
        } catch (Exception e) {
     
            e.printStackTrace();  
        }  
    }  
}

以上代码展示了如何在Java中使用Jackson库来处理JSON数据的序列化和反序列化。当然,你也可以选择使用Gson等其他库来完成这些操作,不同的库在使用上可能略有不同,但基本思想是一致的。

12.1.2 JSON数据传递过程中的中文乱码和日期问题

在处理JSON数据传递时,中文乱码和日期格式问题是很常见的。这些问题通常发生在数据被序列化为JSON字符串,或者从JSON字符串反序列化为Java对象的过程中。以下是如何在Java中处理这些问题的示例,这里仍然使用Jackson库。

1. 中文乱码问题
中文乱码问题通常是因为字符集不匹配导致的。在Java中,确保你的源数据(如字符串、文件等)和目标环境(如JSON库、网络传输等)都使用UTF-8或其他支持中文的字符集。Jackson库默认使用UTF-8编码,所以通常不需要额外配置。

但是,如果你在处理文件或网络传输时遇到了中文乱码,请确保在读写这些资源时也使用了正确的字符集。

2. 日期格式问题
日期格式问题通常是因为JSON字符串中的日期格式与Java对象中的日期类型(如java.util.Date、java.time.LocalDate等)不匹配。Jackson提供了多种方式来处理这个问题,包括自定义序列化器和反序列化器,以及使用@JsonFormat注解。

使用@JsonFormat注解
你可以在你的Java对象的日期字段上使用@JsonFormat注解来指定日期格式。这样,Jackson在序列化和反序列化时就会按照指定的格式来处理这些字段。

import com.fasterxml.jackson.annotation.JsonFormat;  
import java.util.Date;  
  
public class Event {
     
    private String name;  
  
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")  
    private Date startTime;  
  
    // 构造方法、getter和setter省略  
}

在这个例子中,startTime字段会被序列化为"yyyy-MM-dd HH:mm:ss"格式的字符串,并且在反序列化时也会按照这个格式来解析。

自定义序列化器和反序列化器
对于更复杂的日期处理,你可能需要自定义序列化器和反序列化器。这可以通过继承JsonSerializer和JsonDeserializer类,并实现相应的方法来完成。

但是,对于大多数常见情况,使用@JsonFormat注解已经足够。

完整示例
下面是一个完整的示例,展示了如何序列化一个包含中文和日期的Java对象为JSON字符串,并反序列化回来。

import com.fasterxml.jackson.annotation.JsonFormat;  
import com.fasterxml.jackson.databind.ObjectMapper;  
  
import java.io.IOException;  
import java.text.ParseException;  
import java.text.SimpleDateFormat;  
import java.util.Date;  
  
public class JsonExample {
     
    public static void main(String[] args) {
     
        try {
     
            Event event = new Event("活动名称", new Date());  
  
            ObjectMapper objectMapper = new ObjectMapper();  
            String jsonString = objectMapper.writeValueAsString(event);  
            System.out.println(jsonString);  
  
            Event deserializedEvent = objectMapper.readValue(jsonString, Event.class);  
            System.out.println(deserializedEvent);  
  
        } catch (IOException e) {
     
            e.printStackTrace();  
        }  
    }  
  
    static class Event {
     
        private String name;  
  
        @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")  
        private Date startTime;  
  
        public Event(String name, Date startTime) {
     
            this.name = name;  
            this.startTime = startTime;  
        }  
  
        // 省略getter和setter方法  
  
        @Override  
        public String toString() {
     
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
            sdf.setTimeZone(java.util.TimeZone.getTimeZone("GMT+8"));  
            return "Event{" +  
                    "name='" + name + '\'' +  
                    ", startTime=" + sdf.format(startTime) +  
                    '}';  
        }  
    }  
}

请注意,我在@JsonFormat注解中添加了timezone = "GMT+8"属性来确保日期时间按照东八区的时间来格式化。同时,在toString方法中,我也使用了SimpleDateFormat来格式化日期,并设置了相同的时区,以确保打印出的日期时间与JSON中的一致。

12.1.3 多视图解析器

在Java Web开发中,特别是使用Spring MVC框架时,多视图解析器(Multiple View Resolvers)允许你根据请求的不同类型或条件来解析不同的视图。例如,你可能想要对于JSON请求使用JSON视图解析器,而对于HTML请求使用JSP或Thymeleaf等模板引擎。

下面是一个使用Spring MVC配置多视图解析器的简单示例。这个示例将包括两个视图解析器:一个用于JSP文件,另一个假设是一个用于某种非HTML视图(如JSON)的自定义视图解析器(实际上,对于JSON,你可能不需要专门的视图解析器,因为你可以直接在Controller中返回数据,并使用@ResponseBody注解)。但这里为了演示目的,我将展示如何配置两个视图解析器。

首先,你需要在Spring配置文件中(或者如果你使用的是Java配置,则在配置类中)配置视图解析器。

Java配置示例
如果你使用的是Java配置(基于@Configuration的类),可以像下面这样配置多视图解析器:

import org.springframework.context.annotation.Bean;  
import org.springframework.context.annotation.Configurat
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值