2020年12月2日 星期三

Java EE - JSP 自訂標籤 - 自訂 EL 函式

紀錄一下 在 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)}

參考資料:

沒有留言 :

張貼留言