Web開發之-JSP學習總結-第四篇:自定義標籤總結
阿新 • • 發佈:2019-02-19
一、自定義標籤開發步驟—以高仿<c:if test=""></c:if>
標籤為例
1、編寫一個普通的java類,繼承SimpleTagSupport類,叫標籤處理器類。並且覆蓋doTag方法
/**
* 標籤處理器類
* 1)繼承SimpleTagSupport
*/
public class IfTag extends SimpleTagSupport {
private boolean test;
public void setTest(boolean test) {
this.test = test;
}
/**
* 2)覆蓋doTag方法
*/
@Override
public void doTag() throws JspException, IOException {
//根據test的返回值決定是否輸出標籤體內容
if(test){
this.getJspBody().invoke(null);
}
}
}
2、在web專案的WEB-INF目錄下建立xxx.tld檔案,這個tld叫標籤庫的宣告檔案。(參考核心標籤庫的tld檔案)
<?xml version="1.0" encoding="UTF-8" ?>
<taglib xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd"
version="2.1">
<!-- 標籤庫的版本 -->
<tlib-version>1.1</tlib-version>
<!-- 標籤庫字首 -->
<short-name>lwb</short-name>
<!-- tld檔案的唯一標記 -->
<uri>http://blog.csdn.net/learning_lu</uri>
<!-- 一個標籤的宣告 -->
<tag>
<!-- 標籤名稱 -->
<name>if</name>
<!-- 標籤處理類的全名 -->
<tag-class>lwb.tag.IfTag</tag-class>
<!-- 輸出標籤體的內容格式 -->
<body-content>scriptless</body-content>
<!-- 屬性宣告 -->
<attribute>
<name>test</name>
<!-- 是否必填 -->
<required>true</required>
<!-- 是否支援EL表示式 -->
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
</taglib>
3、在jsp頁面的頭部匯入自定義標籤庫
<%@taglib uri="http://blog.csdn.net/learning_lu" prefix="lwb"%>
4、在jsp中使用自定義標籤
<itcast:if test="${2}">
條件成立
</itcast:if>
二、自定義標籤的執行過程
tomcat伺服器啟動時,載入到每個web應用,載入每個web應用的WEB-INF目錄下的所有檔案!!!例如。web.xml, tld檔案!!!
1、訪問XXX.jsp資源
2、tomcat伺服器把jsp檔案翻譯成java原始檔->編譯class->構造類物件->呼叫_jspService()方法
3、檢查jsp檔案的taglib指令,是否存在一個名為http://blog.csdn.net/learning_lu的tld檔案。如果沒有,則報錯
4、上一步已經讀到xxx.tld檔案(自定義標籤庫檔案)
5、讀到<lwb:if test="">
到xxx.tld檔案中查詢是否存在<name>
為if的這裡寫<tag>
標籤
6、找到對應的<tag>
標籤,則讀到<tag-class>片
內容
7、得到 lwb.tag.IfTag
構造ShowIpTag物件,然後呼叫IfTag裡面的方法
三、自定義標籤處理器類的生命週期
SimpleTag介面:
void setJspContext(JspContext pc)
--設定pageContext物件,傳入pageContext(一定呼叫)、通過getJspCotext()方法得到pageContext物件
void setParent(JspTag parent)
--設定父標籤物件,傳入父標籤物件,如果沒有父標籤,則不呼叫此方法。通過getParent()方法得到父標籤物件。
void setXXX(值)
--設定屬性值。
void setJspBody(JspFragment jspBody)
--設定標籤體內容。標籤體內容封裝到JspFragment物件中,然後傳入JspFragment物件。
通過getJspBody()方法得到標籤體內容。如果沒有標籤體內容,則不會呼叫此方法
void doTag()
--執行標籤時呼叫的方法。(一定呼叫)
四、自定義標籤的作用
1)控制標籤體內容是否輸出
2)控制標籤餘下內容是否輸出
3)控制重複輸出標籤體內容
4)改變標籤體內容
5)帶屬性的標籤