JSP (View) → Servlet/Controller → DAO → Database
↑___________ 渲染 HTML Table ___________↓
public class AccountDAO {
public List<Account> selectAll() {
String sql = "SELECT aname, sex, age FROM account";
try (Connection conn = DBUtil.getConn();
PreparedStatement ps = conn.prepareStatement(sql);
ResultSet rs = ps.executeQuery()) {
List<Account> list = new ArrayList<>();
while (rs.next()) {
Account acc = new Account();
acc.setAname(rs.getString("aname"));
acc.setSex(rs.getString("sex"));
acc.setAge(rs.getInt("age"));
list.add(acc);
}
return list;
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
}
<%@ taglib prefix="c" uri="https://java.sun.com/jsp/jstl/core" %>
<table class="data-table">
<thead>
<tr><th>用戶名稱</th><th>用戶性別</th><th>用戶年齡</th></tr>
</thead>
<tbody>
<c:forEach items="${accountList}" var="acc">
<tr>
<td>${acc.aname}</td>
<td>${acc.sex == 'm' ? '男' : '女'}</td>
<td>${acc.age}</td>
</tr>
</c:forEach>
</tbody>
</table>
Controller 僅需 request.setAttribute("accountList", dao.selectAll()); 轉發到 JSP。
<%
AccountDAO dao = new AccountDAO();
List<Account> list = dao.selectAll();
for (int i = 0; i < list.size(); i++) {
Account acc = list.get(i);
%>
<tr>
<td><%= acc.getAname() %></td>
<td><%= "m".equals(acc.getSex()) ? "男" : "女" %></td>
<td><%= acc.getAge() %></td>
</tr>
<% } %>
⚠️ Scriptlet 混合 HTML 維護困難,新項目強制使用 JSTL/EL 或模板引擎 (Thymeleaf/FreeMarker)。
<c:forEach items="${teachers}" var="t" varStatus="vs">
<tr>
<td><input type="checkbox" value="${t.tno}" /></td>
<td>${vs.index + 1}</td> <!-- 序號 -->
<td>${t.tname}</td>
<td>${t.tsex}</td>
<td>${t.prof}</td>
<td>${t.depart}</td>
<td>${t.tbirthday}</td>
<td>
<a href="view?id=${t.tno}">查看</a> |
<a href="edit?id=${t.tno}">修改</a> |
<a href="delete?id=${t.tno}" onclick="return confirm('確定刪除?')">刪除</a>
</td>
</tr>
</c:forEach>
// Controller
int pageNum = Integer.parseInt(request.getParameter("pageNum") != null ? request.getParameter("pageNum") : "1");
int pageSize = 10;
PageHelper.startPage(pageNum, pageSize);
List<Teacher> list = teacherDao.findAll();
PageInfo<Teacher> pageInfo = new PageInfo<>(list);
request.setAttribute("pageInfo", pageInfo);
JSP 端渲染分頁條:${pageInfo.pageNum}、${pageInfo.pages}、${pageInfo.hasNextPage} 等。


動態 JSP 與靜態 HTML 渲染效果完全一致,證明數據綁定正確。
${fn:escapeXml(str)} 防 XSS 攻擊。