首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> JSP 程式設計 >> 關於JSP

JSTL 實現 JSP 應用快速開發:核心標簽庫、SQL 標簽實戰與最佳實踐

     編輯:關於JSP

JSTL (JSP Standard Tag Library) 是 JSP 開發的標準化標簽庫集合,提供迭代、條件、XML 處理、國際化、資料庫訪問等核心功能。本文聚焦 **Core** 與 **SQL** 標簽庫,通過實戰範例展示如何利用 JSTL 構建簡潔、可維護、無腳本程序的 JSP 頁面,並對比 PHP/ColdFusion 等傳統模式的優勢。

JSTL 核心標簽庫速覽

庫URI前綴核心功能
Corehttps://java.sun.com/jsp/jstl/corec變量設置、條件判斷、迭代循環、URL 處理、異常捕獲、重定向
XMLhttps://java.sun.com/jsp/jstl/xmlxXML 解析、XPath 選擇、XSLT 轉換、流控制
I18Nhttps://java.sun.com/jsp/jstl/fmtfmt格式化數字/日期、消息包、請求編碼、時區、本地化
SQLhttps://java.sun.com/jsp/jstl/sqlsql查詢、更新、事務、數據源配置、結果集遍歷
Functionshttps://java.sun.com/jsp/jstl/functionsfn字符串操作、集合操作、長度、分割、替換、轉義

環境搭建 (Tomcat + MySQL)

  1. 下載 JSTL 實現:jakarta-taglibs-standard (包含 `jstl.jar`, `standard.jar`)。
  2. 放入 `WEB-INF/lib` 目錄。
  3. MySQL JDBC 驅動 (`mysql-connector-java.jar`) 同放入 `WEB-INF/lib`。
  4. 4. 配置數據源 (推薦 `context.xml` JNDI):
    <Resource name="jdbc/MyDB" auth="Container" type="javax.sql.DataSource"
        maxTotal="20" maxIdle="5" maxWaitMillis="10000"
        username="root" password="secret" driverClassName="com.mysql.jdbc.Driver"
        url="jdbc:mysql://localhost:3306/testdb?useUnicode=true&characterEncoding=UTF-8"/>

Core 標簽實戰:無腳本頁面構建

1. 變量與作用域管理

<c:set var="siteName" value="MyShop" scope="application"/>
<c:set var="user" value="${sessionScope.user}" scope="page"/>
<c:remove var="tempVar" scope="session"/>

2. 條件控制

<c:choose>
  <c:when test="${user.role == 'admin'}">
    <a href="/admin">管理後台</a>
  </c:when>
  <c:when test="${user.role == 'editor'}">
    <a href="/editor">編輯工作台</a>
  </c:when>
  <c:otherwise>
    <a href="/profile">個人中心</a>
  </c:otherwise>
</c:choose>

3. 迭代循環 (核心優勢)

<c:forEach var="product" items="${productList}" varStatus="status">
  <tr class="${status.index % 2 == 0 ? 'even' : 'odd'}">
    <td>${status.count}</td>
    <td><c:out value="${product.name}"/></td>
    <td><fmt:formatNumber value="${product.price}" type="currency"/></td>
    <td><c:if test="${product.stock > 0}">有庫存</c:if></td>
  </tr>
</c:forEach>

4. URL 重寫與參數編碼

<a href="<c:url value='/product/detail'><c:param name='id' value='${product.id}'/></c:url>">詳情</a>

SQL 標簽實戰:頁面級數據訪問 (謹慎使用)

⚠️ **警告**:SQL 標簽將數據庫邏輯置於視圖層,**違反分層架構**,僅適用於:原型驗證、極簡內部工具、無服務層的微型項目。生產項目**強烈建議**使用 Service + DAO + Controller 模式。

1. 配置數據源 (頁面內,不推薦生產)

<sql:setDataSource var="ds" driver="com.mysql.jdbc.Driver"
    url="jdbc:mysql://localhost/testdb" user="root" password="secret"/>

2. 查詢與遍歷

<sql:query var="products" dataSource="${ds}" maxRows="20">
  SELECT id, name, price, stock FROM products WHERE category = ?
  <sql:param value="${param.category}"/>
</sql:query>

<c:forEach var="row" items="${products.rows}">
  ${row.name} - ${row.price} - ${row.stock}<br/>
</c:forEach>

<c:if test="${products.rowCount == 0}">無匹配產品</c:if>

3. 更新與事務

<sql:transaction dataSource="${ds}" isolation="read_committed">
  <sql:update var="count">
    UPDATE products SET stock = stock - 1 WHERE id = ?
    <sql:param value="${param.id}"/>
  </sql:update>
  <sql:update>
    INSERT INTO orders (product_id, user_id, qty) VALUES (?, ?, 1)
    <sql:param value="${param.id}"/>
    <sql:param value="${sessionScope.user.id}"/>
  </sql:update>
</sql:transaction>

JSTL 與 PHP/ColdFusion 對比

維度JSTL + JSPPHPColdFusion
標準化JCP 標準規范 (JSR-52),多容器可移植單一實現,語言內建商業產品 (Adobe/Lucee),標準化程度低
類型安全EL 表達式 + 容器類型轉換弱類型,隱式轉換陷阱多弱類型,標簽屬性驗證較強
標簽擴展性Tag Library Descriptor (TLD) 規範,可自定義標簽庫函數/類擴展,無標簽標準自定義標簽 (CFX/CFC),生態封閉
企業級特性事務、連接池、JNDI、安全管理、集群 Session需框架/擴展實現內建但綁定平台
學習曲線中等 (需理解 Servlet/JSP 生命周期、EL、作用域)低 (語法簡單、文檔豐富)低 (標簽語義化程度高)
生態成熟度極高 (Spring、Struts、JSF 整合無縫)極高 (Laravel、Symfony、WordPress)中等 (社區較小)

最佳實踐總結

  1. 盡用 Core/fmt/fn,慎用 SQL/XML:視圖層只負責展示,數據邏輯下沉 Service 層。
  2. EL 表達式替代腳本程序:`${user.name}` 而非 `<%= user.getName() %>`。
  3. 啟用容器 EL 忽略舊語法:`web.xml` 配置 `false`。
  4. 統一使用 `` 輸出變量:自動 HTML 轉義,防 XSS。
  5. 資源束管理國際化文本:`` + ``,而非硬編碼字符串。
  6. 複雜邏輯移至 Tag File 或 Java 標簽類:保持 JSP 頁面整潔。

結語

JSTL 確立了 JSP 開發的「無腳本」規範,配合 EL 表達式,將視圖邏輯限制在聲明式標簽範圍內,極大提升了頁面可讀性、可維護性與安全性。雖然現代 Web 框架 (Spring MVC + Thymeleaf, JSF, React/Vue) 已成為主流,但理解 JSTL 設計哲學——**標準化聲明式視圖邏輯**——對於維護存量系統、設計自定義標簽庫、把握視圖層職責邊界,仍具不可替代的指導價值。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved