標籤:自訂 標記 exce 介面 執行 context 查詢 建立 instance
1 自訂標籤
1.1 引入
需求: 向瀏覽器輸出當前客戶的IP地址 (只能使用jsp標籤)
1.2 第一個自訂標籤開發步驟
1)編寫一個普通的java類,繼承SimpleTagSupport類,叫標籤處理器類
/** * 標籤處理器類 * @author APPle * 1)繼承SimpleTagSupport * */ public class ShowIpTag extends SimpleTagSupport{ private JspContext context; /** * 傳入pageContext */ @Override public void setJspContext(JspContext pc) { this.context = pc; } /** * 2)覆蓋doTag方法 */ @Override public void doTag() throws JspException, IOException { //向瀏覽器輸出客戶的ip地址 PageContext pageContext = (PageContext)context; HttpServletRequest request = (HttpServletRequest)pageContext.getRequest(); String ip = request.getRemoteHost(); JspWriter out = pageContext.getOut(); out.write("使用自訂標籤輸出客戶的IP地址:"+ip); } } |
2)在web項目的WEB-INF目錄下建立itcast.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>itcast</short-name> <!-- tld檔案的唯一標記 --> <uri>http://gz.itcast.cn</uri> <!-- 一個標籤的聲明 --> <tag> <!-- 標籤名稱 --> <name>showIp</name> <!-- 標籤處理器類的全名 --> <tag-class>gz.itcast.a_tag.ShowIpTag</tag-class> <!-- 輸出標籤體內容格式 --> <body-content>scriptless</body-content> </tag> </taglib> |
3) 在jsp頁面的頭部匯入自訂標籤庫
<%@taglib uri="http://gz.itcast.cn" prefix="itcast"%>
4) 在jsp中使用自訂標籤
<itcast:showIp></itcast:showIp>
1.3 自訂標籤的執行過程
問題: http://localhost:8080/day14/01.hellotag.jsp 如何訪問到自訂標籤?
前提: tomcat伺服器啟動時,載入到每個web應用,載入每個web應用的WEB-INF目錄下的所有檔案!!!例如。web.xml, tld檔案!!!
1)訪問01.hellotag.jsp資源
2)tomcat伺服器把jsp檔案翻譯成java源檔案->編譯class->構造類對象->調用_jspService()方法
3)檢查jsp檔案的taglib指令,是否存在一個名為http://gz.itcast.cn的tld檔案。如果沒有,則報錯
4)上一步已經讀到itcast.tld檔案
5)讀到<itcast:showIp> 到itcast.tld檔案中查詢是否存在<name>為showIp的<tag>標籤
6)找到對應的<tag>標籤,則讀到<tag-class>內容
7)得到 gz.itcast.a_tag.ShowIpTag
構造ShowIpTag對象,然後調用ShowIpTag裡面的方法
1.4 自訂標籤處理器類的生命週期
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.5 自訂標籤的作用
1)控制標籤體內容是否輸出
2)控制標籤餘下內容是否輸出
3)控制重複輸出標籤體內容
4)改變標籤體內容
5)帶屬性的標籤
步驟:
5.1 在標籤處理器中添加一個成語變數和setter方法
//1.聲明屬性的成員變數 private Integer num; //2.關鍵點: 必須提供公開的setter方法,用於給屬性賦值 public void setNum(Integer num) { this.num = num; } |
1.6 輸出標籤體內容格式
JSP: 在傳統標籤中使用的。可以寫和執行jsp的java代碼。
scriptless: 標籤體不可以寫jsp的java代碼
empty: 必須是空標籤。
tagdependent : 標籤體內容可以寫jsp的java代碼,但不會執行。
Java jsp 自訂標籤