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

Java MVC中如何通过Servlet实现数据库数据在无业务逻辑JSP表格展示?

Got it!这正是MVC模式的核心要求——视图与逻辑完全分离,我给你一套完整的实现方案,全程保证JSP里干干净净只做页面渲染,所有数据处理逻辑都交给Servlet和后端层来完成:

整体架构思路

咱们严格遵循MVC职责划分:

  • Model层:对应数据库表的实体类,以及负责数据访问的DAO(数据访问对象),专门处理数据库交互
  • Controller层:Servlet,负责接收前端请求、调用DAO获取数据、将数据存入请求域,最后转发到JSP视图
  • View层:JSP,只负责用JSTL和EL表达式渲染数据,不写任何业务/数据处理的Java代码

具体实现步骤

假设我们要展示的是数据库里的user表,包含id、username、email、create_time这几个字段,下面一步步来:

1. 定义实体类(Model)

先写一个和数据库表对应的JavaBean,用来封装单条用户数据:

public class User {
    private Integer id;
    private String username;
    private String email;
    private Date createTime;

    // 全参、无参构造器
    public User() {}
    public User(Integer id, String username, String email, Date createTime) {
        this.id = id;
        this.username = username;
        this.email = email;
        this.createTime = createTime;
    }

    // Getter和Setter方法
    public Integer getId() { return id; }
    public void setId(Integer id) { this.id = id; }
    public String getUsername() { return username; }
    public void setUsername(String username) { this.username = username; }
    public String getEmail() { return email; }
    public void setEmail(String email) { this.email = email; }
    public Date getCreateTime() { return createTime; }
    public void setCreateTime(Date createTime) { this.createTime = createTime; }
}

2. 实现数据访问层(DAO)

写一个DAO类,专门负责和数据库交互,这里用原生JDBC示例(你也可以用JdbcTemplate简化操作):

import java.sql.*;
import java.util.ArrayList;
import java.util.List;

public class UserDAO {
    // 建议把数据库配置放到properties文件,这里为了示例暂时硬编码
    private static final String URL = "jdbc:mysql://localhost:3306/your_db_name?useSSL=false&serverTimezone=UTC";
    private static final String USER = "db_username";
    private static final String PASSWORD = "db_password";

    public List<User> getAllUsers() throws SQLException {
        List<User> userList = new ArrayList<>();
        // 用try-with-resources自动关闭连接、语句、结果集
        try (Connection conn = DriverManager.getConnection(URL, USER, PASSWORD);
             Statement stmt = conn.createStatement();
             ResultSet rs = stmt.executeQuery("SELECT id, username, email, create_time FROM user")) {

            while (rs.next()) {
                User user = new User();
                user.setId(rs.getInt("id"));
                user.setUsername(rs.getString("username"));
                user.setEmail(rs.getString("email"));
                user.setCreateTime(rs.getTimestamp("create_time"));
                userList.add(user);
            }
        }
        return userList;
    }
}

3. 编写Servlet(Controller)

这是核心的控制层,负责协调数据获取和视图跳转,所有逻辑都在这里处理:

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.sql.SQLException;
import java.util.List;

@WebServlet("/users") // 访问路径:http://localhost:8080/你的项目名/users
public class UserListServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        UserDAO userDAO = new UserDAO();
        List<User> userList = null;

        try {
            // 调用DAO获取数据
            userList = userDAO.getAllUsers();
            // 将数据存入请求域,供JSP读取
            request.setAttribute("userList", userList);
            // 转发到JSP视图(转发不会改变URL,且能携带请求域数据)
            request.getRequestDispatcher("/WEB-INF/views/users.jsp").forward(request, response);
        } catch (SQLException e) {
            // 异常处理:可以转发到错误页面,或者给前端返回错误信息
            e.printStackTrace();
            request.setAttribute("errorMsg", "获取用户数据失败,请稍后重试");
            request.getRequestDispatcher("/WEB-INF/views/error.jsp").forward(request, response);
        }
    }
}

4. 编写JSP视图(View)

这里完全不写Java脚本,只用JSTL和EL表达式渲染表格:
首先要确保你已经引入了JSTL的core标签库(如果是Maven项目,要添加JSTL依赖;如果是手动部署,把jstl.jar和standard.jar放到WEB-INF/lib目录)。

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<!DOCTYPE html>
<html>
<head>
    <title>用户列表</title>
    <style>
        table { border-collapse: collapse; width: 80%; margin: 20px auto; }
        th, td { border: 1px solid #ddd; padding: 8px; text-align: center; }
        th { background-color: #f2f2f2; }
    </style>
</head>
<body>
    <h2 style="text-align: center;">用户列表</h2>
    
    <!-- 用JSTL遍历请求域中的userList -->
    <table>
        <thead>
            <tr>
                <th>ID</th>
                <th>用户名</th>
                <th>邮箱</th>
                <th>创建时间</th>
            </tr>
        </thead>
        <tbody>
            <c:forEach items="${userList}" var="user">
                <tr>
                    <td>${user.id}</td>
                    <td>${user.username}</td>
                    <td>${user.email}</td>
                    <td><fmt:formatDate value="${user.createTime}" pattern="yyyy-MM-dd HH:mm:ss"/></td>
                </tr>
            </c:forEach>
        </tbody>
    </table>

    <!-- 异常信息展示 -->
    <c:if test="${not empty errorMsg}">
        <p style="color: red; text-align: center;">${errorMsg}</p>
    </c:if>
</body>
</html>

关键注意事项
  • 禁止JSP脚本:绝对不要在JSP里写<% ... %>这种Java代码,所有逻辑都要放到Servlet或DAO里
  • JSTL依赖:必须确保项目中包含JSTL的jar包,否则<c:forEach>等标签无法生效
  • 资源关闭:DAO里一定要用try-with-resources自动关闭数据库连接、Statement、ResultSet,避免资源泄漏
  • 请求转发:Servlet到JSP要用forward转发,而不是sendRedirect重定向,因为重定向会丢失请求域中的数据
  • 配置解耦:把数据库的URL、用户名、密码放到db.properties配置文件里,不要硬编码在DAO中,方便后续修改

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:53:23