Day17_2--JSON学习之序列化非字符串数据传给前端页面

使用Java Servlet和JSON进行前后端数据交互

在现代Web应用开发中,前后端数据交互是一个至关重要的环节。本文将演示如何使用Java Servlet将非字符串数据序列化为JSON格式,并通过AJAX将其传递给前端页面。我们将通过一个简单的例子来实现这个过程,包括后端Java代码和前端HTML/JavaScript代码。

后端代码:Java Servlet

首先,我们需要创建一个Java Servlet来处理JSON数据的生成和传递。以下是一个简单的Servlet实现,它将一个Student对象的列表序列化为JSON字符串,并将其发送到前端页面。

Java Servlet代码

@WebServlet("/json")
public class JsonServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 创建一个学生对象列表
        ArrayList<Student> students = new ArrayList<>();
        Student student1 = new Student(12, "小龙", "男", 18, "IT");
        students.add(student1);

        // 设置响应数据的编码
        resp.setCharacterEncoding("UTF-8");

        // 导入阿里巴巴的JSON转换工具,将学生列表序列化为JSON字符串
        String jsonResponse = JSON.toJSONString(students);

        // 设置数据类型为JSON
        resp.setContentType("application/json");

        // 获取响应的输出流,并写入JSON数据
        PrintWriter writer = resp.getWriter();
        writer.write(jsonResponse);
        // 确保数据被写入并释放资源
        writer.flush();
        writer.close();
    }
}

前端代码:HTML和JavaScript

前端页面将通过AJAX请求从Servlet获取JSON数据,并将其展示在网页上。以下是前端HTML和JavaScript代码的实现:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>学生信息展示</title>
</head>
<body>
    <div id="show" style="border: 1px red; width: 200px; height: 100px"></div>
    学号: <span class="sno"></span><br>
    姓名: <span class="name"></span><br>
    <button onclick="fetchStudentData()">获取</button>

    <script>
        function fetchStudentData() {
            // 1: 创建XMLHttpRequest对象
            let xhr = new XMLHttpRequest();

            // 2: 配置后端请求
            xhr.open("GET", "/stage1_war_exploded/json", true);

            // 3: 发送请求
            xhr.send();

            // 4: 监听数据是否请求成功
            xhr.onreadystatechange = function () {
                // 5: 如果服务器成功解析数据则readyState=4, 如果后端成功返回数据则status=200
                if (xhr.readyState == 4 && xhr.status == 200) {
                    // 6: 获取后端数据并反序列化为JSON对象
                    let data = JSON.parse(xhr.responseText);

                    // 7: 将数据插入前端页面
                    document.querySelector(".sno").innerHTML = data[0].sno;
                    document.querySelector(".name").innerHTML = data[0].name;
                }
            };
        }
    </script>
</body>
</html>

在这个HTML页面中,我们创建了一个按钮和两个用于显示学生学号和姓名的<span>元素。点击按钮时,会调用fetchStudentData函数,该函数通过AJAX向Servlet发送请求,并将返回的JSON数据插入到页面中。

<think>好的,我需要帮助用户解决如何在前端将后端传递的LocalDate数据转换为字符串的问题。首先,我得仔细阅读用户的问题和提供的引用内容,确保理解他们的需求。 用户提到他们之前尝试在后端使用@JsonFormat注解但没有成功,也考虑过用String接收再转换,但觉得麻烦。现在他们希望在前端直接处理LocalDate到字符串的转换。引用中的信息显示,后端可能传的是LocalDateTime或Date类型,但用户现在明确提到的是LocalDate,所以需要针对这个类型处理。 首先,我需要确认前端接收到的是什么格式的数据。如果后端正确配置了日期转换,比如使用Converter或者配置Jackson的序列化格式,那么前端可能直接收到字符串。但用户的情况是后端传LocalDate,可能前端收到的是ISO格式的字符串,如"2023-10-05"。这时候前端可能需要解析这个字符串并格式化为所需的显示形式。 接下来,我应该考虑不同的前端框架或原生JS的处理方式。比如,在JavaScript中,可以使用Date对象或者第三方库如moment.js或date-fns来解析和格式化日期。用户可能在React、Vue或其他框架中,所以需要给出通用的方法以及可能的框架示例。 另外,引用3中提到后端配置Converter<String, LocalDateTime>,但用户现在的问题是关于LocalDate,可能需要类似的配置,但用户希望在前端处理,所以后端可能已经传了正确的字符串格式,前端只需格式化显示即可。 需要考虑用户可能的场景,比如显示在页面上需要特定的格式,如"YYYY年MM月DD日",或者表格中的日期显示。因此,需要提供如何将ISO字符串转换为这种格式的方法。 最后,要确保回答覆盖不同的方法,包括原生JS和常用库,并可能提到时区问题,确保转换后的时间正确。同时,提醒用户如果后端传的是时间戳,处理方式会不同,但根据用户的问题,后端传的是LocalDate,可能已经是字符串,所以重点放在解析和格式化上。</think>### 前端将后端传递的 `LocalDate` 转换为字符串的方法 #### 一、核心逻辑与场景分析 1. **数据传递流程** - 后端返回的 `LocalDate` 默认会序列化为 **ISO 8601 格式字符串**(如 `"2023-10-05"`),无需额外配置[^3][^4]。 - 前端需要将此类字符串转换为可读格式(如 `"2023年10月05日"` 或 `"10/05/2023"`)。 --- #### 二、实现方法(按技术栈分类) ##### 1. 原生 JavaScript ```javascript // 示例:后端返回的 ISO 字符串 "2023-10-05" const isoDateString = "2023-10-05"; // 方法1:直接使用字符串操作(适用于简单格式) const formattedDate1 = isoDateString.replace(/-/g, '/'); // "2023/10/05" // 方法2:通过 Date 对象转换 const date = new Date(isoDateString); const formattedDate2 = `${date.getFullYear()}年${date.getMonth() + 1}月${date.getDate()}日`; // "2023年10月5日" // 注意:浏览器时区可能影响结果,建议明确指定UTC ``` ##### 2. 使用第三方库(推荐) | 库名称 | 代码示例 | 特点 | |--------------|--------------------------------------------------------------------------|------------------------| | **date-fns** | ```javascript import { format } from 'date-fns'; format(new Date('2023-10-05'), 'yyyy-MM-dd'); ``` | 轻量级、函数式编程风格 | | **moment.js**| ```javascript moment('2023-10-05').format('YYYY年MM月DD日'); ``` | 功能全面(但体积较大) | | **day.js** | ```javascript dayjs('2023-10-05').format('YYYY/MM/DD'); ``` | Moment.js 的轻量替代 | ##### 3. 框架集成方案 - **React**(配合 `date-fns`) ```jsx import { format } from 'date-fns'; function DateDisplay({ isoDate }) { return <div>{format(new Date(isoDate), 'yyyy年MM月dd日')}</div>; } ``` - **Vue.js**(使用计算属性) ```vue <template> <p>{{ formattedDate }}</p> </template> <script> import { format } from 'date-fns'; export default { props: ['isoDate'], computed: { formattedDate() { return format(new Date(this.isoDate), 'MM/dd/yyyy'); } } } </script> ``` --- #### 三、关键注意事项 1. **时区处理** - 如果后端返回时间包含时区信息(如 `2023-10-05T00:00:00+08:00`),需明确是否要转换到用户本地时区: ```javascript // 使用 day.js 时区插件 import dayjs from 'dayjs'; import utc from 'dayjs/plugin/utc'; import timezone from 'dayjs/plugin/timezone'; dayjs.extend(utc); dayjs.extend(timezone); dayjs.tz('2023-10-05', 'Asia/Shanghai').format(); ``` 2. **空值防御** ```javascript // 对可能的空值进行兜底处理 const safeFormat = (dateStr) => { return dateStr ? format(new Date(dateStr), 'yyyy-MM-dd') : '暂无日期'; } ``` --- #### 四、验证与调试 1. **控制台快速测试** ```javascript // 在浏览器控制台验证转换结果 console.log(new Date('2023-10-05').toLocaleDateString('zh-CN')); // "2023/10/5" ``` 2. **单元测试示例**(Jest) ```javascript test('formats ISO date to Chinese style', () => { expect(formatDate('2023-10-05')).toBe('2023年10月05日'); }); ``` --- ### 相关问题 1. 如何在后端控制 `LocalDate` 的序列化格式? 2. 前端如何处理带时区的日期时间(如 `LocalDateTime`)? 3. 如何实现多语言环境下的日期本地化? 4. 日期选择器(如 Ant Design DatePicker)如何绑定格式化后的值? 通过上述方法,可直接在前端完成日期格式化,无需修改后端接口[^1][^3]。若需进一步优化时区一致性,建议前后端统一使用 UTC 时间戳传输[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT ·南栀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值