上篇博客我們已經介紹了自定義JSP標籤的創建過程以及Servlet容器是如何處理自定義標籤的,這篇博客我們從理論出發,從實踐入手,繼續介紹自定義JSP標籤。
在開始之前,我要問一個問題,自己想過沒有,爲什麼要使用自定義標籤呢?我們現在所開發的系統中就運用到了自定義JSP標籤,那麼問一下自己,爲什麼要用自定義標籤呢?自定義JSP標籤是通過自定義標籤實現類來實現複雜的、可重複利用的功能,它可以簡化JSP頁面,提高代碼的複用性。比如,如果你的頁面需要一個下拉框,但是這個下拉框是從字典表取值,正常的處理辦法可能要每次都從字典表中去查詢;如果採用自定義JSP標籤的方式,就可以將這一系列的事統統放在JSP標籤的實現類中來實現。
接下來,我們來手動創建一個自定義標籤。這篇博客,我們先從簡單的入手,創建一個簡單的JSP標籤,下篇博客我們再提高難度,創建一個下拉框的自定義標籤。首先,按照我們上篇博客創建自定義標籤的步驟,先創建一個處理自定義標籤的處理類。
<span style="font-size:12px;">import javax.servlet.jsp.JspTagException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.TagSupport;
public class MyTagTest extends TagSupport {
private String tagShow;
/**
* <p>Description:構造函數</p>
* @param tagShow
*/
public MyTagTest(String tagShow) {
super();
this.tagShow = tagShow;
}
/**
* 標籤開始方法
*/
public int doStartTag() throws JspTagException{
return super.EVAL_BODY_INCLUDE;
}
/**
* 標籤結束方法
*/
public int doEndTag() throws JspTagException{
JspWriter printOut = pageContext.getOut();
try{
System.out.println(printOut);
}catch (Exception e) {
e.printStackTrace();
}
return super.SKIP_BODY;
}
/**
* 釋放資源
*/
public void release(){
super.release();
}
/*********************get/set方法****************************/
public String getTagShow() {
return tagShow;
}
public void setTagShow(String tagShow) {
this.tagShow = tagShow;
}
}</span>
我們可以看到實現類繼承了TagSupport,TagSupport類的主要屬性:
》》》1.parent屬性:代表嵌套了當前標http://write.blog.csdn.net/postedit/48806519籤的上層標籤的處理類
》》》2.jsp容器在調用doStartTag或者doEndTag方法前,會先調用setPageContext和setParent方法,設置pageContext和parent。因此在標籤處理類中可以直接訪問pageContext變量。
》》》3.在TagSupport的構造方法中不能訪問pageContext成員變量,此時的JSP容器還沒有調用setPageContext方法對pageContext進行初始化。
額外再說一點TagSupport的內容。TagSupport類提供了兩個處理標籤的方法
public int doStartTag() throws JspException
public int doEndTag() throws JspException
當JSP容器遇到自定義標籤的起始標誌時就會調用doStartTag()方法,該方法返回一個整數值,用來決定程序的後續流程。
A.Tag.SKIP_BODY:表示?>…之間的內容被忽略;
B.Tag.EVAL_BODY_INCLUDE:表示標籤之間的內容被正常執行。
但當JSP容器遇到自定義標籤的結束標誌時,就會調用doEndTag()方法,該方法也返回一個整數值,用來決定程序的後續流程。A.Tag.SKIP_PAGE:表示立刻停止執行網頁,網頁上未處理的靜態內容和JSP程序均被忽略任何已有的輸出內容立刻返回到客戶的瀏覽器上。
B.Tag_EVAL_PAGE:表示按照正常的流程繼續執行JSP網頁。
說完了TagSupport,我想說一下上面處理類的成員變量。可能我們這個自定義標籤的內容比較簡單,不容易看出來,我不知道大家看出來沒有,一般自定義標籤有哪些自定義的屬性,這些屬性就作爲成員變量出現在該標籤的處理類中,並且跟上get/set方法。所以要創建一個自定義標籤的處理類,要具備如下資源:
》》》1.必須要引入如下資源:
<span style="font-size:14px;">import javax.servlet.jsp.*;
import javax.servlet.http.*;
import java.util.*;
import java.io.*;</span>
》》》2.要繼承TagSupport類並覆蓋doStartTag()和doEndTag()方法。
》》》3.從ServeltContext對象中獲取java.util.Properties對象
》》》4.從Properties對象中獲取key對應的屬性值
》》》5.對獲取的屬性進行相應的處理並輸出結果
接下來,繼續創建一個xxx.tld文件。在WEB-INF下創建一個tlds文件夾,在該文件夾下創建一個myTagTest.tld文件。
<?xml version="1.0" encoding="UTF-8" ?>
<taglib xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
version="2.0">
<description>A tag library exercising SimpleTag handlers.</description>
<tlib-version>1.0</tlib-version>
<short-name>hh</short-name>
<uri>/myTagTest</uri>
<info>自定義JSP標籤</info>
<tag>
<description> Display hello </description>
<name>hello</name>
<tag-class>com.wdl.taglib.MyTagTest</tag-class>
<attribute>
<name>tagShow</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
</taglib>
然後在web.xml中配置taglib元素。
<taglib>
<taglib-uri>/MyTagTest</taglib-uri>
<taglib-location>/WEB-INF/tlds/myTagTest.tld</taglib-location>
</taglib>
最後,我們在頁面中引用自定義標籤。
<%@ taglib uri="/MyTagTest" prefix="hh"%>
<hh:hello showTag="Hello"/>
到最後,我們創建的自定義JSP標籤就創建完成了,因爲上篇文章對原理性的內容已經做過講解,所以這裏不再贅述。下篇博客我們繼續創建一個自定義JSP標籤,下篇博客見!