You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Spring MVC与JavaScript在JSP中创建动态表格及提取日期月份求助

嘿,我来帮你搞定这个需求!咱们一步步来实现:用Spring MVC准备数据、在JSP里通过JavaScript渲染动态表格,同时搞定从yyyy-MM-dd格式日期中提取月份的问题。下面是具体的代码示例和说明:

一、Spring MVC 后端准备数据

首先咱们得在后端把需要展示的数据准备好,这里模拟一些包含日期的业务数据,你可以换成从数据库查询的真实数据。同时提供两种月份提取思路:后端提前处理或者交给前端JS处理。

后端代码示例(Controller)

@Controller
public class DynamicTableController {
    @GetMapping("/show-dynamic-table")
    public ModelAndView renderDynamicTable() {
        ModelAndView mav = new ModelAndView("dynamic-table");
        
        // 模拟业务数据,替换成你的真实数据来源(比如DAO查询)
        List<Map<String, Object>> tableData = new ArrayList<>();
        tableData.add(Map.of("id", 1, "title", "项目A", "createDate", "2024-02-18"));
        tableData.add(Map.of("id", 2, "title", "项目B", "createDate", "2024-06-25"));
        tableData.add(Map.of("id", 3, "title", "项目C", "createDate", "2024-09-05"));
        
        // 【可选】后端提前提取月份(适合不需要前端动态修改日期的场景)
        DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
        for (Map<String, Object> item : tableData) {
            String dateStr = (String) item.get("createDate");
            LocalDate date = LocalDate.parse(dateStr, dateFormatter);
            // 提取数字月份,比如2、6、9,要中文月份可以用date.getMonth().getDisplayName(TextStyle.FULL, Locale.CHINESE)
            item.put("month", date.getMonthValue());
        }
        
        mav.addObject("tableData", tableData);
        return mav;
    }
}
二、JSP页面实现动态表格与日期提取

接下来在JSP页面里,咱们可以选择两种方式渲染表格:一种是用JSTL直接循环后端数据,另一种是用JavaScript动态生成表格(更适合需要前端交互的场景)。

JSP页面代码示例(dynamic-table.jsp)

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
    <title>动态数据表格</title>
    <style>
        table {
            border-collapse: collapse;
            width: 80%;
            margin: 30px auto;
            box-shadow: 0 2px 5px rgba(0,0,0,0.1);
        }
        th, td {
            border: 1px solid #e0e0e0;
            padding: 10px;
            text-align: center;
        }
        th {
            background-color: #f8f9fa;
            font-weight: bold;
        }
        tr:hover {
            background-color: #f5f5f5;
        }
    </style>
</head>
<body>
    <h3 style="text-align: center;">动态表格展示</h3>
    <table id="dataTable">
        <thead>
            <tr>
                <th>ID</th>
                <th>项目名称</th>
                <th>创建日期</th>
                <th>月份</th>
            </tr>
        </thead>
        <tbody>
            <!-- 方式1:用JSTL直接渲染后端数据(简单高效) -->
            <c:forEach items="${tableData}" var="item">
                <tr>
                    <td>${item.id}</td>
                    <td>${item.title}</td>
                    <td>${item.createDate}</td>
                    <td>${item.month}月</td>
                </tr>
            </c:forEach>

            <!-- 方式2:用JavaScript动态渲染(适合需要前端交互的场景,比如筛选、修改) -->
            <%-- <tbody id="tableBody"></tbody> --%>
        </tbody>
    </table>

    <script>
        // 如果选择用JS动态渲染,先把后端数据转成JS对象
        const tableData = <c:out value="${tableData}" escapeXml="false" />;

        // 前端提取月份的方法(适合后端没提前处理的场景)
        function extractMonth(dateStr) {
            // 方法A:字符串拆分(兼容性最好,不用考虑Date对象的浏览器差异)
            const dateParts = dateStr.split('-');
            return parseInt(dateParts[1]); // 转成数字月份,比如"02"→2

            // 方法B:用Date对象(注意部分旧浏览器对日期格式的兼容性)
            // const date = new Date(dateStr);
            // return date.getMonth() + 1; // JS的月份是0-11,加1得到真实月份
        }

        // 动态渲染表格的逻辑(取消注释即可使用)
        // const tableBody = document.getElementById('tableBody');
        // tableData.forEach(item => {
        //     const row = document.createElement('tr');
        //     row.innerHTML = `
        //         <td>${item.id}</td>
        //         <td>${item.title}</td>
        //         <td>${item.createDate}</td>
        //         <td>${extractMonth(item.createDate)}月</td>
        //     `;
        //     tableBody.appendChild(row);
        // });
    </script>
</body>
</html>
两种月份提取方式的对比
  • 后端处理:兼容性更好,不用考虑前端浏览器对Date对象的解析差异,适合数据固定、不需要前端修改的场景。
  • 前端JS处理:灵活性更高,适合需要前端动态修改日期(比如用户选择日期后实时显示月份)的场景,推荐用字符串拆分的方式,比Date对象更稳定。

内容的提问来源于stack exchange,提问作者Java reading

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:08:49