JSTL 快速啟動
- 導包:
jstl-1.2.jar (含標準實現),Servlet 容器通常已提供 API,需自帶實現包。
- 引入標簽庫:
<%@ taglib prefix="c" uri="https://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="https://java.sun.com/jsp/jstl/fmt" %>
<%@ taglib prefix="fn" uri="https://java.sun.com/jsp/jstl/functions" %>
核心標簽速查 (c:)
| 標簽 | 用途 | 示例 |
<c:out> | 安全輸出 (自動轉義 XML) | <c:out value="${user.name}" default="匿名"/> |
<c:set> | 設置變量 | <c:set var="total" value="${price*qty}"/> |
<c:if> | 條件判斷 | <c:if test="${user.vip}">...</c:if> |
<c:choose/when/otherwise> | 多條件分支 | 類似 switch |
<c:forEach> | 遍歷集合/數組/範圍 | <c:forEach items="${list}" var="item">${item}</c:forEach> |
<c:forTokens> | 字符串分割遍歷 | <c:forTokens items="a,b,c" delims="," var="x">${x}</c:forTokens> |
<c:url> | 編碼 URL (含 SessionID) | <c:url value="/shop/cart" var="url"/> |
<c:import> | 包含外部資源 (可跨域) | <c:import url="https://api.example.com/data"/> |
EL 表達式 (${...})
- 隱式對象:
pageScope/requestScope/sessionScope/applicationScope/param/paramValues/header/headerValues/cookie/initParam/pageContext。
- 運算符:
+ - * / div % mod、== eq != ne < lt > gt <= le >= ge、&& and || or ! not、empty (null/空串/空集合/空數組)。
- 自動類型轉換、空值安全 (不拋 NPE)。
自定義簡單標簽 (SimpleTagSupport, JSP 2.0+)
優勢:無 doStartTag/doEndTag 狀態機,只需實現 doTag(),不支持 body-content="JSP" (僅 empty/scriptless)。
步驟 1: 標簽類
package tags;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.tagext.SimpleTagSupport;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class DateTag extends SimpleTagSupport {
private String pattern; // 屬性
public void setPattern(String pattern) { this.pattern = pattern; }
@Override
public void doTag() throws JspException, IOException {
PageContext pc = (PageContext) getJspContext();
String formatted = new SimpleDateFormat(pattern).format(new Date());
pc.getOut().print(formatted);
}
}
步驟 2: TLD 描述符 (datetag.tld)
1.1
d1
https://example.com/tags
date
tags.DateTag
empty
pattern
true
true
步驟 3: JSP 使用
<%@ taglib prefix="my" uri="https://example.com/tags" %>
經典標簽 vs 簡單標簽選型
| 特性 | 經典標簽 (BodyTagSupport) | 簡單標簽 (SimpleTagSupport) |
| 標簽體內容 | 支持 JSP 腳本片段 | 僅 static text / EL / JSTL (scriptless) |
| 生命周期 | doStartTag → doAfterBody → doEndTag | doTag (一次性) |
| 訪問標簽體 | getBodyContent() 可多次處理 | getJspBody().invoke(writer) 僅一次 |
| 開發難度 | 較高 | 低,推薦新項目 |