教育行業(yè)A股IPO第一股(股票代碼 003032)

全國咨詢/投訴熱線:400-618-4000

JAVA培訓(xùn)之自定義標(biāo)簽實(shí)例

更新時間:2016年09月29日16時59分 來源:傳智播客JAVA培訓(xùn)學(xué)院 瀏覽次數(shù):

通過自定義標(biāo)簽詳解,大家對如何自定義標(biāo)簽的步驟有了初步的了解,今天我們動手實(shí)踐完成自定義標(biāo)簽,具體操作如下所示:
(1)創(chuàng)建web應(yīng)用Example11,在該應(yīng)用下新建一個標(biāo)簽處理類,名稱為MyTag,該類實(shí)現(xiàn)了SimpleTag接口,主要代碼如例1-1所示:
例1-1 MyTag.java
public class MyTag implements SimpleTag{
     private PageContext pageContext;
     private JspFragment body;
    @Override
    public void doTag() throws JspException, IOException {
       //向頁面中輸出內(nèi)容
       pageContext.getOut().print("hello tag");
    }
    @Override
    public JspTag getParent() {
       return null;
    }
    @Override
    public void setJspBody(JspFragment jspBody) {
       this.body=jspBody;
    }
    @Override
    public void setJspContext(JspContext pc) {
       this.pageContext=(PageContext) pc;//將參數(shù)pc賦值給成員變量pageContext
    }
    public void setParent(JspTag parent) {}
}
在例1-1中,MyTag類中定義了兩個成員變量,分別是pageContext和body。當(dāng)Tomcat服務(wù)器調(diào)用了setJspBody(JspFragment jspBody)、setJspContext(JspContext pc)方法時,將方法中的參數(shù)賦值給成員變量。那么我們就可以通過pageContext獲得其他內(nèi)置對象,然后在doTage()方法中使用pageContext獲得out對象,再調(diào)用print(String s)方法向?yàn)g覽器輸出內(nèi)容。
(2)在WEB-INF目錄下新建一個目錄,名稱為tld,然后在該目錄下新建一個tld文件,名稱為itcast-tag.tld,主要代碼如例1-2所示:
例1-2 itcast-tag.tld
<?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>itcast</short-name>
 <uri>http://xamj520.com/tags/it-1.0</uri>
</taglib>
(3)例1-2中,文件的約束可以參考c標(biāo)簽的tld文件,我們在jstl-1.2.jar文件中找到c.tld文件,然后將文件的約束拷貝到itcast-tag.tld文件中,如例1-3所示:
<?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">
   
  <description>JSTL 1.1 core library</description>
  <display-name>JSTL core</display-name>
  <tlib-version>1.1</tlib-version>
  <short-name>c</short-name>
  <uri>http://java.sun.com/jsp/jstl/core</uri>
 
 <tlib-version>1.0</tlib-version>
 <jsp-version>1.2</jsp-version>
 <short-name>itcast</short-name>
 <uri>http://xamj520.com/tags/it-1.0</uri>
</taglib>
(4)例1-3中,上面的部分代碼是c.tld文件中的代碼,我們需要將內(nèi)容修改成我們自定義的標(biāo)簽信息,如例1-4所示:
<?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.0</tlib-version>
  <short-name>itcast</short-name>
  <uri>http://xamj520.com/tags/it-1.0</uri>
</taglib>
(5)在例1-4的基礎(chǔ)上添加自定義標(biāo)簽的處理類相關(guān)信息,如例1-5所示:
<?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.0</tlib-version>
  <short-name>itcast</short-name>
  <uri>http://xamj520.com/tags/it-1.0</uri>
 
  <tag>
  <name>MyTag</name>
  <tag-class>cn.itcast.tag.MyTag</tag-class>
  <body-content>empty</body-content>
  </tag>
</taglib>
下面我們來分析例1-5中自定義標(biāo)簽處理類的相關(guān)信息,如下所示:
  • <name>myTag</name>:指定當(dāng)前標(biāo)簽的名稱;
  • <tag-class>cn.itcast.tag.MyTag</tag-class>:指定當(dāng)前標(biāo)簽的標(biāo)簽處理類;
  • <body-content>empty</body-content>:指定標(biāo)簽體的類型,我們這里使用的是空標(biāo)簽,類似于HTML標(biāo)簽中的<br/>標(biāo)簽。
(6)在WebRoot目錄下新建一個jsp頁面,名稱為myTag.jsp,在該頁面中導(dǎo)入自定義標(biāo)簽庫,主要代碼如例1-6所示:
例1-6 myTag.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="it" uri="/WEB-INF/tld/itcast-tag.tld" %>
<!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>
   <it:MyTag/>
</body>
</html>
例1-6中,<%@ taglib prefix="it" uri="/WEB-INF/tld/itcast-tag.tld" %>是用來導(dǎo)入標(biāo)簽庫,目的是為頁面指定tld文件的位置,也可以將uri的值設(shè)為http://xamj520.com/tags/it-1.0,這個路徑是我們在itcast-tag.tld文件中配置的。當(dāng)標(biāo)簽庫被導(dǎo)入了,在頁面中使用自定義的標(biāo)簽時,頁面會有提示。
(7)將Example11發(fā)布到服務(wù)器中,然后啟動服務(wù)器,在瀏覽器端訪問myTag.jsp,瀏覽器顯示結(jié)果如圖1-1所示:

圖1-1 瀏覽器顯示結(jié)果
以上自定義標(biāo)簽的處理類實(shí)現(xiàn)了SimpleTag接口,需要重寫五個方法,而且需要我們自己在類中定義成員變量pageContext,然后對該變量進(jìn)行賦值操作,這樣很麻煩。有一種簡便的方法可以讓我們只重寫doTag()方法,其他方法不用考慮,那就是繼承SimpleTagSupport類。SimpleTagSupport類的結(jié)構(gòu)如圖1-2所示:

圖1-2 SimpleTagSupport類
由圖1-2中可知,SimpleTagSupport類實(shí)現(xiàn)了SimpleTag接口,那么它必然重寫了SimpleTag接口的五個方法,我們再來看看SimpleTagSupport類又定義了哪些方法,如下所示:

圖1-3 SimpleTagSupport類的相關(guān)方法
例1-3中,除了重寫的SimpleTag接口的方法,它還提供了以下三個方法:
  • JspTag findAncestorWithClass(JspTag from,Class<?> klass):查找最接近給定實(shí)例的給定類類型的實(shí)例。此方法使用來自 Tag 和/或 SimpleTag 接口的 getParent 方法。此方法用于協(xié)調(diào)各協(xié)作標(biāo)記,了解即可;
  • JspFragment getJspBody():返回服務(wù)器通過setJspBody()方法傳入的正文;
  • JspContext getJspContext():返回服務(wù)器通過setJspContext()方法傳入的頁面上下文。
(8)在Example11中新建一個標(biāo)簽處理類,名稱為MyTag1,該類繼承SimpleTagSupport類,主要代碼如例1-7所示:
例1-7 MyTag1.java
public class MyTag1 extends SimpleTagSupport{
    @Override
    public void doTag() throws JspException, IOException {
        this.getJspContext().getOut().print("繼承SimpleTagSupport類的標(biāo)簽");
    }
}
例1-7中,MyTag1重寫了父類的doTag()方法,調(diào)用父類的getJspContext()方法獲得JspContext類的對象,然后獲得out對象,利用out對象向?yàn)g覽器端輸出內(nèi)容。
(9)在itcast-tag.tld文件中添加MyTag1的配置信息,如例1-8所示:
此處省略例1-5中的代碼
<tag>
  <name>MyTag1</name>
  <tag-class>cn.itcast.tag.MyTag1</tag-class>
  <body-content>empty</body-content>
</tag>
(10)在myTag.jsp頁面中添加一個標(biāo)簽,如例1-9所示:
此處省略例1-6中的代碼
<br> SimpleTagSupport:<it:MyTag1/>
(11)在瀏覽器端再次訪問myTag.jsp頁面,瀏覽器顯示結(jié)果如圖1-4所示:

圖1-4 瀏覽器顯示結(jié)果


本文版權(quán)歸傳智播客java學(xué)院所有,歡迎轉(zhuǎn)載,轉(zhuǎn)載請注明作者出處。謝謝!
作者:傳智播客java學(xué)院
0 分享到:
和我們在線交談!