紀錄一下 在 JAVA EE JSP 中,
如何建立客制的、自己所使用的 "自訂EL 函式 (or 自訂 JSTL tag 標籤函式)" 。
首先先設定下範例需求:
1. 想在 JSP 中,使用如下程式碼來使用,
<%@ taglib prefix="customEL" uri="/WEB-INF/customTld.tld"%> ${customEL:contains(list, value)}
第一行使引入自行定義的 TLD 檔,
第二行是使用了在自訂的 TLD 檔裡,被設定了的一個 function, "contains(list, value)",
作用為:傳入一個 Collection 的物件, "list" 和一個 Object 的物件 (或int 之類的簡單型別), "value",
然後傳回一個 boolean 值來表示在 list 中有無存在 value ,有的話回 true、否則回 false。
底層其實就是呼叫 Collection 的 contains() ,即 return list.contains(value);
2. 開始制作自訂EL函式,首先先實作其邏輯,就是一個簡單的 Class 和其內的 method:
CustomElFunction.java:
package com.xxx.tld; import java.util.Collection; public class CustomElFunction { public static boolean contains(Collection collection, Object object) { return collection.contains(object); } }可以看到只是一個很普通的 Class,裡面設定了一個呼叫 Collection.contains() 的 method,要注意的是 method 必須為 static 的。
因為之後會在 TLD 檔來以 package path + Class Name + Method 簽名的方式設定 自訂EL 函式,
所以如果有想要建立多個 自訂EL函式,可以在一個 Class 裡加入多個 method,
或是再建一個 Class 加入 method 都可以。
3. 再來是建立自己的 TLD 檔案,內容如下:
customTld.tld:
<?xml version="1.0" encoding="UTF-8" ?> <taglib xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd" version="2.0"> <description>Custom JSTL functions library</description> <display-name>Custom JSTL functions</display-name> <tlib-version>1.0</tlib-version> <short-name>customEL</short-name> <uri>http://xxx.xxx.com/jsp/jstl/functions</uri> <function> <description> Returns true if this collection contains the specified element </description> <name>contains</name> <function-class>com.xxx.tld.CustomElFunction</function-class> <function-signature>boolean contains(java.util.Collection, java.lang.Object)</function-signature> <example> ${customEL:contains(list, value)} </example> </function> </taglib>
<descriptin>, <display-name>, <tlib-version>, <short-name> 等比較不重要可隨便填。
<uri> 只有在想用在 JSP 中用 uri 的方式時引入才需要,如是直接指定專案路徑下的相對位置,例如 /WEB-INF/customTld.tld , 則可以隨便填。
重要的是 <name>, <function-class>, <function-signature>,
<name> 是在 JSP 中呼叫自訂EL函式時要使用的函式名稱,
即
${customEL:contains(list, value)}
中的 contains
<function-class> 為指定自訂EL函式所在的 Class path
<function-signature> 設定了自訂EL函式的函式方法簽名
最後,把 TLD 檔放到自己知道地方,從 JSP 中引入,就可以開始使用了,
例如如下:
xxx.jsp:
<%@ taglib prefix="customEL" uri="/WEB-INF/customTld.tld"%> ${customEL:contains(list, value)}
參考資料:
沒有留言 :
張貼留言