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
相关产品推荐
相关产品推荐

