在 JSP 頁面中,EL 表達式 ${...} 默認只能訪問 JavaBean 屬性、集合、隱含對象等。若需在 EL 中直接調用 Java 類的靜態方法(如 URL 編碼、日期格式化、字符串處理),必須通過自定義標簽庫實現。
package com.tsh.utils;
import java.net.URLEncoder;
public class ELFunc {
public static String urlEncode(String str) {
return URLEncoder.encode(str);
}
}
位置:WEB-INF/el-func.tld(不在 lib/classes 目錄下)
<?xml version="1.0" encoding="UTF-8"?>
<taglib version="2.0"
xmlns="https://java.sun.com/xml/ns/j2ee"
xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://java.sun.com/xml/ns/j2ee https://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd">
<tlib-version>1.0</tlib-version>
<short-name>ELFunc</short-name>
<uri>https://www.tsh.com/ELFunc</uri> <!-- 唯一標識,JSP 中引用 -->
<function>
<name>urlEncode</name> <!-- EL 中調用的方法名 -->
<function-class>com.tsh.utils.ELFunc</function-class> <!-- 實現類全限定名 -->
<function-signature>java.lang.String urlEncode(java.lang.String)</function-signature> <!-- 簽名:返回類型 方法名(參數類型) -->
</function>
</taglib>
<%@ taglib uri="https://www.tsh.com/ELFunc" prefix="ELFunc" %>
<!-- 對比:傳統 Scriptlet vs EL 調用 -->
<%= URLEncoder.encode("陶士涵") %>
${ELFunc:urlEncode("陶士涵") }
輸出均為:%E9%99%B6%E5%A3%AB%E6%B6%B5
無需自定義,直接使用 Apache 提供的標準函數庫(需導入 jstl.jar 和 standard.jar 到 Tomcat lib 或項目中)。
jstl.jar、standard.jar 放入 Tomcat/lib 或 WEB-INF/lib。fn.tld)複製到 WEB-INF 目錄(可選,現代容器自動掃描 JAR 中的 META-INF/*.tld)。<%@ taglib uri="https://java.sun.com/jsp/jstl/functions" prefix="fn" %>${fn:toUpperCase("hello")} <!-- HELLO -->
${fn:toLowerCase("WORLD")} <!-- world -->
${fn:substring("abcdef", 1, 4)} <!-- bcd -->
${fn:contains("hello world", "lo")} <!-- true -->
${fn:length(list)} <!-- 集合/數組長度 -->
${fn:escapeXml("")} <!-- <div> 防 XSS -->
${fn:replace("a-b-c", "-", ",")} <!-- a,b,c -->
${fn:split("a,b,c", ",")} <!-- 返回 String[] -->
${fn:join(arr, ";")} <!-- 字符串數組拼接 -->
核心注意點
- 方法必須為 public static,否則 TLD 解析失敗。
- 簽名必須精確匹配:包含完整包名的返回類型、方法名、參數類型列表(無參則空括號)。
- URI 唯一性:TLD 中的
<uri> 必須與 JSP taglib 指令的 uri 完全一致。
- 無參方法調用:EL 中仍需帶空括號
${prefix:methodName()},不可省略。