全國(guó)咨詢(xún)/投訴熱線:400-618-4000

首頁(yè)技術(shù)文章正文

JAVA培訓(xùn)之自定義EL函數(shù)庫(kù)

更新時(shí)間:2017-04-16 來(lái)源:黑馬程序員Java培訓(xùn)學(xué)院 瀏覽量:

EL函數(shù)庫(kù)中,我們學(xué)習(xí)的那些方法都是由JSTL提供的,我們自己也可以定義函數(shù)庫(kù)。自定義EL函數(shù)庫(kù)有以下三個(gè)步驟:
  • 寫(xiě)一個(gè)類(lèi),在該類(lèi)中定義一個(gè)有返回值的靜態(tài)方法;
  • 編寫(xiě)tld文件;
  • 在頁(yè)面中添加taglib指令,導(dǎo)入自定義標(biāo)簽庫(kù)。
下面根據(jù)以上步驟,我們來(lái)完成自定義EL函數(shù)庫(kù),點(diǎn)擊此處 1554260397032_1492336640063055268.png下載案例源代碼,具體如下所示:
(1)新建一個(gè)web應(yīng)用Example9,在src目錄下新建一個(gè)類(lèi),MyFunciton,主要代碼如例1-1所示:
例1-1 MyFunction.java
package cn.itcast.fn;
public class MyFunction {
    public static String print(){
        return "創(chuàng)智播客之EL函數(shù)庫(kù)";
    }
}
例1-1中,MyFunction中的print()方法必須是靜態(tài)的,有返回值的。
(2)因?yàn)閠ld文件我們不希望別人能夠直接訪問(wèn),因此我們將tld文件放在WEB-INF目錄下。在該目錄下創(chuàng)建一個(gè)目錄tlds,然后將itcast.tld文件放在tlds目錄中,文件內(nèi)容如例1-2所示:
例1-2 itcast.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>itcast</description>
  <display-name>itcast-function</display-name>
  <tlib-version>1.0</tlib-version>
  <short-name>it</short-name>
  <uri>http://www.itcast.cn/el/functions</uri>
 
  <function>
    <name>print</name>
    <function-class>cn.itcast.fn.MyFunction</function-class>
    <function-signature>java.lang.String print()</function-signature>
  </function>
</taglib>
例1-2中,文件的頭與約束都是從jstl函數(shù)庫(kù)中的fn.tld文件中拷貝過(guò)來(lái)的,下面對(duì)文件中的比較重要的標(biāo)簽進(jìn)行解析,如下所示:
  • <tlib-version>:當(dāng)前函數(shù)庫(kù)的版本號(hào);
  • <short-name>:函數(shù)庫(kù)的前綴,例如fn;
  • <uri>:代表當(dāng)前函數(shù)庫(kù)的地址,在本案例中該標(biāo)簽不起作用;
  • <function>:定義函數(shù)的一個(gè)標(biāo)簽;
  • <name>:指明函數(shù)的名稱(chēng);
  • <function-class>:指明函數(shù)所在的類(lèi)的名稱(chēng);
  • <function-signature>:指明函數(shù)的名字及返回值類(lèi)型,如果有參數(shù),也包括參數(shù)類(lèi)型,如:<function-signature>boolean contains(java.lang.String, java.lang.String)</function-signature>。
另外在tld文件中,還存在一個(gè)標(biāo)簽,如下:
<function>
    <description>
      Tests if an input string contains the specified substring.
    </description>
    <name>contains</name>
    <function-class>org.apache.taglibs.standard.functions.Functions</function-class>
    <function-signature>boolean contains(java.lang.String, java.lang.String)</function-signature>
    <example>
      &lt;c:if test="${fn:contains(name, searchString)}">
    </example>
  </function>
其中<example>標(biāo)簽表示的是該函數(shù)在jsp頁(yè)面中的示范。
(3)在Example9的WebRoot目錄下新建一個(gè)fn目錄,然后在該目錄下新建一個(gè)fn.jsp頁(yè)面,主要代碼如例1-3所示:
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <%@ taglib prefix="it" uri="/WEB-INF/tlds/itcast.tld" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
   <h1>${it:print() }</h1>
</body>
</html>
例1-3中,taglib指令中的uri屬性的值為“/WEB-INF/tlds/itcast.tld”,該值正是itcast.tld文件的位置。
(4)將Example9發(fā)布到服務(wù)器,然后啟動(dòng)服務(wù)器,在瀏覽器端訪問(wèn):http://localhost:8080/Example9/fn/fn.jsp,瀏覽器顯示的結(jié)果如圖1-1所示:
1554260402641_1492336640094003686.png圖1-1 瀏覽器顯示結(jié)果


本文版權(quán)歸黑馬程序員Java培訓(xùn)學(xué)院所有,歡迎轉(zhuǎn)載,轉(zhuǎn)載請(qǐng)注明作者出處。謝謝!

作者:黑馬程序員Java培訓(xùn)學(xué)院

首發(fā):http://409rqu1.cn/special/hmjavaeezly/


分享到:
在線咨詢(xún) 我要報(bào)名
和我們?cè)诰€交談!