Contents

JSP 一些常看標籤小記(JSTL, EL, OGNL)

在維護 JSP 舊專案,尤其是 Struts2 系統時,最容易讓人混亂的不是畫面本身,而是同一頁裡可能同時出現 JSTL、EL 和 OGNL。三者看起來都像是在頁面上取值或判斷條件,但背後所屬技術與使用方式其實不同。

三者分別是什麼

JSTL

JSTL 是 JSP Standard Tag Library,也就是 JSP 的標準標籤函式庫,常見像是:

1
2
<c:if test="${ varName }">
</c:if>

它本身不是表達式語言,而是標籤庫,通常搭配 EL 一起使用。

EL

EL 是 Expression Language,用來在 JSP 中簡化取值語法,例如:

1
${user.name}

它很適合做基本屬性存取與簡單判斷。

OGNL

OGNL 是 Struts2 常見的表達式語言,Struts2 標籤像 <s:property><s:if> 多半就是走 OGNL:

1
2
3
<s:property value="msg" />
<s:if test='messageStore == "Hello Struts User"'>
</s:if>

為什麼容易搞混

因為在同一個 JSP 檔案中,你可能同時看到:

  1. <c:if> 這種 JSTL 標籤。
  2. ${...} 這種 EL 語法。
  3. <s:if test="..."> 這種 Struts2 標籤與 OGNL。

如果沒有先分清楚「是哪一個標籤在吃哪一種表達式」,很容易寫出語法看起來對、實際卻不會動的頁面。

一個實務判斷方式

我自己會這樣記:

  1. <c:...> 大多配 EL。
  2. <s:...> 大多配 OGNL。
  3. 純 JSP / JSTL 場景,優先想 EL。

像是 Struts2 的 <s:if>,通常就不要直接照 JSTL 的習慣塞 ${...} 進去,而是依照 OGNL 的語法寫條件。

常見踩雷點

1. 在 Struts2 標籤裡混用 EL

這是最常見的問題之一。畫面不一定直接報錯,但結果常常不是你預期的。

2. 把標籤庫和表達式語言當成同一層概念

JSTL 是標籤庫,EL / OGNL 是取值或判斷的語法。先把角色拆開理解,會清楚很多。

小結

JSTL、EL、OGNL 看似都在 JSP 頁面上做資料顯示和條件判斷,但它們不是同一層東西。維護舊 Java Web 專案時,先確認你用的是哪一套標籤,再決定該配 EL 還是 OGNL,會比一邊猜一邊改有效率很多。