【JavaWeb探究】自定義JSP標籤(二)

     上篇博客我們已經介紹了自定義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標籤,下篇博客見!


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章