【J2EE】- JSP自定義標籤
阿新 • • 發佈:2019-03-04
用途:在進行JSP頁面顯示處理的時候,有時候JSTL/Struts/Spring提供的標籤庫並不能滿足專案中顯示的需求,特別是對一些要求比較高的定製化服務中,可以使用自定義的標籤庫去處理。
JSP自定義標籤的步驟
①:編寫標籤庫對應的tld檔案:Tag Library Descrptor File
②:標籤庫處理類:繼承TagSupport類,並用set方法設定標籤的屬性
③:web.xml配置自定義的tld檔案的uri
④:JSP直接web.xml中自定義的標籤庫的uri引入標籤庫
tld檔案:
-
short-name: 標籤字首:類比C標籤的c:if》c
-
name:標籤字尾名:類比C標籤的c:if》if
-
tag-class:頁面渲染時處理標籤的工作類
-
body-content:主體內容
- jsp:接收所有的jsp語法的內容
- empty:開始和結束中間沒有內容
- scriptless:接收文字、el和jsp指令碼
- tagDependent:標籤體內容直接寫入bodyContext由自定義標籤類進行處理
-
attribute:標籤的屬性,類比input標籤的name/value等屬性
- name:屬性名(與標籤處理類的屬性(set)必須保持一致)
- required:屬性的必要性
- rtexprvalue:是否支援特殊表示式:EL表示式等
<?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引擎是先處理標籤體包裹的資訊然後在解析處理標籤體