架構流程
- Servlet 處理請求,建立資料庫連線執行查詢。
- 將
ResultSet 轉為 List<Map<String, Object>> 或實體類別 List<User>。
- 放入
request.setAttribute("list", list)。
request.getRequestDispatcher("/list.jsp").forward(request, response) 轉發至 JSP。
- JSP 使用 JSTL
<c:forEach> 迭代顯示。
Servlet 核心程式碼
@WebServlet("/userList")
public class UserListServlet extends HttpServlet {
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
List<User> users = new ArrayList<>();
String sql = "SELECT id, name, email FROM users";
try (Connection conn = DriverManager.getConnection(URL, USER, PASS);
PreparedStatement ps = conn.prepareStatement(sql);
ResultSet rs = ps.executeQuery()) {
while (rs.next()) {
users.add(new User(rs.getInt("id"), rs.getString("name"), rs.getString("email")));
}
} catch (SQLException e) {
throw new ServletException(e);
}
req.setAttribute("users", users);
req.getRequestDispatcher("/WEB-INF/views/userList.jsp").forward(req, resp);
}
}
JSP 顯示範例
<%@ taglib prefix="c" uri="https://java.sun.com/jsp/jstl/core" %>
<table>
<tr><th>ID</th><th>Name</th><th>Email</th></tr>
<c:forEach items="${users}" var="u">
<tr>
<td>${u.id}</td>
<td>${u.name}</td>
<td>${u.email}</td>
</tr>
</c:forEach>
</table>
關鍵優勢
- 職責分離:Servlet 處理邏輯,JSP 專注呈現。
- 避免在 JSP 寫 JDBC 程式碼,提升可維護性與安全性。
- 使用
try-with-resources 自動關閉資源,防止洩漏。