此文章會講述簡單標簽處理器,因為經典自定義標簽處理器沒有簡單標簽處理器方便使用,故在此不進行描述。 參考:慕課網的《JSP自定義標簽》視頻; 《Servlet、JSP和Spring MVC初學指南》的第六章; IBM的《利用 JSP 2 提供的 SimpleTagSupport 開發自定義標簽》; ...
此文章會講述簡單標簽處理器,因為經典自定義標簽處理器沒有簡單標簽處理器方便使用,故在此不進行描述。
參考:慕課網的《JSP自定義標簽》視頻;
《Servlet、JSP和Spring MVC初學指南》的第六章;
IBM的《利用 JSP 2 提供的 SimpleTagSupport 開發自定義標簽》;
菜鳥教程的JSP自定義標簽文章。
自定義標簽
自定義標簽
自定義標簽就是將方法封裝到自定義標簽處理類中,然後使用方法與JSTL標簽來達到,解決JSP中JavaBean的展現與業務實現分離問題。自定義標簽提供了在JavaBean中所不能實現的便利,其中就包括,自定義標簽允許訪問JSP中隱藏的對象及它們的屬性。
自定義標簽的實現,叫做標簽處理器,而簡單標簽處理器是指實現SimpleTag介面(或繼承SimpleTagSupport類)實現的標簽處理器,經典標簽處理器是指實現BodyTag介面(或繼承BodyTagSupport類)等實現的標簽處理器。
自定義標簽的繼承結構
JSP<----Tag <----IterationTag<----TagSupport<----BodyTagSupport<-----BodyTag
JSP<----SimpleTag<-----SimpleSupportTag
簡單標簽處理器
簡單標簽處理器有簡單的生命周期,SimpleTag介面中用於標簽觸發的方法只有一個------doTag,並且該方法只會執行一次。業務邏輯、遍歷及頁面內容操作都在這裡實現。簡單標簽處理器中的頁面內容都在JspFragment類的實例中體現。
簡單標簽的生命周期如下:
1) JSP容器通過簡單標簽處理器的無參數構造器創建它的實例,因此,簡單標簽處理器必須有無參數構造器(一般不用自己寫, 用系統預設的就可以了)。
2) JSP容器通過setJspContext的方法,傳入JspContext對象:該對象中最重要的方法是getOut(),它能返回JspWriter,通過JspWriter就可以把響應返回前端了。
3) 如果自定義標簽被另一個自定義標簽所嵌套,JSP容器就會調用setParent的方法。
4) JSP容器調用該標簽中所定義的每個屬性的Set方法。
5) 如果需要處理頁面內容,JSP容器還會調用SimpleTag介面的setJspBody方法,把使用JspFragment封裝的頁面內容傳過來。當然,如果沒有頁面內容,那麼JSP容器不會調用該方法。
接下來是SimpleTag介面的詳解:
方法 |
說明 |
doTag()方法 |
是核心方法,用於編寫標簽處理邏輯。 |
setParent(JspTag)方法 |
將父標簽處理器對象傳遞給標簽處理器。 |
getParent()方法 |
獲取當前標簽的父標簽對象。 |
setJspContext(JspContext)方法 |
將JSP頁面的pageContext對象傳遞給標簽處理器對象。 |
setJspBody(JspFragment)方法 |
將代表當前標簽體的JspFragment對象傳遞給標簽處理器對象。(JspFragment中的invoke(Writer)方法用於執行JspFragment對象所代表的代碼段) |
是不是看著上面的一大串文字,有點懵?沒事兒,下麵就是關於實現SimpleTagSupport類(跟實現SimpleTag介面的功用類似)的例子。
首先需要準備一個SimpleTag的.tld文件,用於註冊自定義標簽,這個文件是在apache-tomcat文件裡面,一般地址是在E:\apache-tomcat-6.0.39\webapps\examples\WEB-INF\jsp裡面,名稱是jsp2-example-taglib.tld。
用一個顯示當前時間的jsp頁面來做為第一個例子:
自定義標簽的創建步驟:
1) 創建標簽處理類
package com.ny.tag2;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.SimpleTagSupport;
public class DisplayInfo extends SimpleTagSupport{
@Override
public void doTag() throws JspException, IOException {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String dateStr = simpleDateFormat.format(new Date());
JspWriter jspWriter = getJspContext().getOut();
jspWriter.write(dateStr);
}
}
2) 創建標簽庫文件
在WEB-INF目錄下創建一個.tld文件(如nyTag.tld),然後打開jsp2-example-taglib.tld文件,裡面有我們需要的taglib配置,打開這個文件之後找到下麵的代碼段,複製到nyTag.tld中。
如果tid文件位於WEB-INF文件下麵,Tomcat會自動載入tld文件中的標簽庫。如果位於其他位置,其實也可以在web.xml中配置。
<?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>A tag library exercising SimpleTag handlers. </description> <tlib-version>1.0</tlib-version> <short-name>SimpleTagLibrary</short-name> <uri>/SimpleTagLibrary</uri> </taglib>
3) 在標簽庫文件中註冊標簽
<?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>A tag library exercising SimpleTag handlers. </description> <tlib-version>1.0</tlib-version> <short-name>ny</short-name> <uri>/ny-tag</uri> <tag> <name>dateInfo</name> <tag-class>com.ny.tag2.DisplayInfo</tag-class> <body-content>empty</body-content> </tag> </taglib>
① <short-name>:指明推薦使用的prefix(這個屬性會在jsp頁面中引入標簽的時候出現)。
② <uri>:指明引用這個標簽庫時使用的uri(註意哦是uri不是url)。
③ <tag>:指明要定義標簽的信息。
其中,tag可以設置的屬性如下:
屬性 |
說明 |
name |
定義屬性的名稱,每個標簽的屬性名稱必須是唯一的。 |
tag-class |
指定映射的Java類。 |
required |
指定屬性是否是必須的或者可選的,如果是必須的就設置為true。 |
rtexprvalue |
聲明在運行表達式時,標簽屬性是否有效,有效則為true。 |
type |
定義該屬性的Java類類型,預設指定為String。 |
decription |
描述信息 |
fragment |
如果聲明瞭該屬性,屬性值將被視為一個JspFragment。 |
bodycontent |
指明標簽體的限定,可以有以下幾種取值(想瞭解更多可以在”參考”中查找到):a) empty:指定該標簽只能作用空標簽使用;b) scriptless:指定該標簽的標簽體可以是靜態HTML元素、表達式語言,但不允許出現JSP腳本。 |
4) 在頁面中引入標簽庫
<%@ taglib prefix="ny" uri="/ny-tag"%>
5) 在頁面中使用標簽
<body> <imooc:dateInfo/> </body>
所以JSP頁面中的代碼就是:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="imooc" uri="/imooc-tag2" %> <!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> <imooc:dateInfo/> </body> </html>
是不是感覺還挺簡單的呢? 其實自定義標簽的用法不止這些哦,加油吧!