1. 程式人生 > >BodyTagSupport與TagSupport自定義標籤

BodyTagSupport與TagSupport自定義標籤

BodyTagSupport與TagSupport的區別在於,BodyTagSupport標籤處理類與標籤體進行互動,TagSupport標籤處理類不與標籤體進行互動,因為BodyTagSupport是TagSupport的子類,所以用TagSupport實現的都可以用BodyTagSupport實現.




--下面就讓我們來看一下自定義標籤的編寫流程

首先我們需要在編寫工具(小白用的是eclipse)+tomcat服務容器,建立這些東西:一個java的類,一個.tld的標籤庫檔案,還有一個jsp頁面



有了這些後,我們就可以來研究一下標籤的自定義過程

首先我們先開啟.tld這個標籤庫檔案,並進行設定

<!DOCTYPE taglib
  PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
   "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
<!-- 標籤庫描述符 -->
<taglib xmlns="http://java.sun.com/JSP/TagLibraryDescriptor">
	<tlib-version>1.0</tlib-version>
	
	<jsp-version>1.2</jsp-version>
	
	<short-name>Simple Tags</short-name>
	
	<uri>/outtag</uri>
	
	<tag>	
		<!-- 標籤名 -->
		<name>out</name>
		
		<!-- 標籤助手類 -->
		<tag-class>com.zking.outtag.OutTag</tag-class>
		
		<!-- 標籤的內容型別:empty表示空標籤(使用空標籤會報錯),jsp表示可以為任何合法的JSP元素 -->
		<body-content>JSP</body-content>
		
		<!--屬性設定(可以不設定屬性)-->
		<attribute>
		
		<!--屬性名字-->
			<name>value</name>
			
			<!--是否為必須屬性-->
			<required>true</required>
			
			<!--是否可以使用表示式,如:EL表示式-->
			<rtexprvalue>true</rtexprvalue>  
			
		</attribute>
		
	</tag>
	
</taglib>

根據以上的自定義標籤的設定,我們就得到了一個名字叫out的一個標籤,out的標籤內必須要有屬性value,並且可以使用表示式

然後jsp頁面使用我們自己定義的標籤

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@taglib prefix="o" uri="/outtag"%>
<!-- 這裡的uri應該與.tld檔案中的uri所對應  -->
<!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>自定義標籤</title>
</head>
<body>
<!-- 標籤名:out,屬性:value ,最後達到頁面輸出結果:123-->
<o:out value="123"></o:out>

</body>
</html>

那麼問題來了,這個value的值是怎麼樣輸出來的呢?,為什麼會被輸出呢?

所以,問題的答案追溯到我們的Java的類(標籤助手類)中來解答吧?

package com.zking.outtag;

import java.io.IOException;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.BodyTagSupport;

/*繼承了BodyTagSupport*/
public class OutTag extends BodyTagSupport{

	//對應的屬性---value
	private Object value;
	
	/*
	 * 無參有返回構造方法
	 */
	public Object getValue() {
		return value;
	}
	
	/*
	 * set方法
	 */
	public void setValue(Object value) {
		this.value = value;
	}

	/*
	 * 開始執行jsp檔案對應的<o:out value="123">
	 */
	public int doStartTag() throws JspException {
		/*
		 * pageContext一個請求域,通過請求域與jsp達到一個連線的作用
		 * 這也就是value值能否顯示的原因
		 */
try {
	pageContext.getOut().print(value);
} catch (IOException e) {
	e.printStackTrace();
}
/*
 * 返回的值
 * EVAL_BODY_INCLUDE(執行出標籤體包含的值,也就是開籤與閉籤之間的值)
 * SKIP_BODY  (跳過標籤體,直接執行到閉籤處)
 */
		return SKIP_BODY;
	}
	
	
	
	/*
	 * 開始執行jsp檔案對應的</o:out>
	 */
	public int doEndTag() throws JspException {
		/*
		 * 返回的值
		 * EVAL_PAGE(繼續執行下面內容,也就是說從該標籤開始,下面的所有內容都能執行)
		 * SKIP_PAGE(從該標籤開始,跳過下面全部內容,直接執行到</html>標籤)
		 */
		return SKIP_PAGE;
	}
	
	
}

我們寫出的這個標籤可以使用EL表示式${}和小指令碼<%%>哦~

以上就是小白簡單的介紹了一下自定義標籤的設定過程,如果看懂了就試一下編寫一個屬於自己的標籤吧~