用途:在進行JSP頁面顯示處理的時候,有時候JSTL/Struts/Spring提供的標籤庫並不能知足項目中顯示的需求,特別是對一些要求比較高的定製化服務中,能夠使用自定義的標籤庫去處理。html
①:編寫標籤庫對應的tld文件:Tag Library Descrptor Filejava
②:標籤庫處理類:繼承TagSupport類,並用set方法設置標籤的屬性web
③:web.xml配置自定義的tld文件的urispring
④:JSP直接web.xml中自定義的標籤庫的uri引入標籤庫less
short-name: 標籤前綴:類比C標籤的c:if》cjsp
name:標籤後綴名:類比C標籤的c:if》ifide
tag-class:頁面渲染時處理標籤的工做類ui
body-content:主體內容this
attribute:標籤的屬性,類比input標籤的name/value等屬性code
<?xml version="1.0" encoding="utf-8" ?> <!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN" "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd"> <taglib> <tlib-version>1.0</tlib-version> <jsp-version>1.2</jsp-version> <short-name>test</short-name> <tag> <name>out</name> <tag-class>com.zhiwei.tag.TagHandler</tag-class> <body-content>jsp</body-content> <attribute> <name>name</name> <required>false</required> <rtexprvalue>true</rtexprvalue> </attribute> </tag> </taglib>
標籤處理類:
package com.zhiwei.tag; import javax.servlet.jsp.JspException; import javax.servlet.jsp.JspWriter; import javax.servlet.jsp.tagext.TagSupport; /** * jsp自定義標籤處理類 * @author Yang ZhiWei */ public class TagHandler extends TagSupport{ private static final long serialVersionUID = 1L; /** * 自定義標籤的屬性名 */ private String name; /** * set方法是必須的,用來注入jsp傳過來的屬性值:相似spring的注入 * @param name */ public void setName(String name) { this.name = name; } /** * doStartTag:jsp容器在掃面到"<"時啓用 */ @Override public int doStartTag() throws JspException { StringBuffer results = new StringBuffer(""); System.err.println("------->doStartTag"); try { //父類的pageContext:表示當前jsp上下文 pageContext.getOut().write(results.toString()); } catch (Exception e) { throw new JspException("錯誤"); } /** * SKIP_BODY:跳過開始和結束之間的代碼 * EVAL_BODY_INCLUDE:表示標籤之間的內容被正常執行,將body之間的信息輸出到存在的輸出流中 */ return EVAL_BODY_INCLUDE; } /** * doEndTag在標籤在標籤結尾時啓用 */ @Override public int doEndTag() throws JspException{ System.err.println("------->doEndTag"); try { JspWriter out = pageContext.getOut(); out.print("Hello " + name+" !"); } catch (Exception e) { throw new JspException("錯誤"); } /** * SKIP_PAGE:忽略剩下的頁面 * EVAL_PAGE:表示按照正常的流程繼續執行JSP網頁 */ return EVAL_PAGE; } }
web.xml文件配置:
<jsp-config> <taglib> <taglib-uri>/tld/test</taglib-uri> <taglib-location> /WEB-INF/tlds/test.tld </taglib-location> </taglib> </jsp-config>
自定義標籤庫JSP文件中應用:
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <%@ taglib uri="/tld/test" prefix="test" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <title>TagHandler</title> </head> <body> Test Tag: <test:out name="TEST"/><br> Test Tag: <test:out name="TEST"> AAAAAAA</test:out> </body> </html>
效果呈現:
分析:JSP頁面正確渲染出咱們的自定義標籤庫,值得注意的是第2個自定義標籤裏面包含內容:
Test Tag: <test:out name="TEST"> AAAAAAA</test:out>
JSP頁面渲染的內容是Test Tag: AAAAAAAHello TEST !,這代表JSP引擎是先處理標籤體包裹的信息而後在解析處理標籤體自己的信息的。