Jsp自訂tag標籤
自訂tag標籤的好處
程式員可以自定一些特定功能的標記, 用來封裝代碼, 達到分工, 重用性等多種好處.
如何存放tag標籤
通常在web工程WEB-INF檔案夾下建立tags檔案夾來存放自訂的tag,如/WEB-INF/tags
tag標籤的文法
要知道怎樣定義tag標籤就需要知道tag標籤的基本屬性,例如:
<%@ tag body-content="empty" trimDirectiveWhitespaces="true" pageEncoding="UTF-8"%>
通常我們在*.tag檔案的開頭加上以上的代碼來告訴jsp容器這是一個tag標記檔案。
body-content有以下三種屬性:
1. empty:這個是一個空標記.
2. scriptless:標記主體可以有內容, 並且jsp容器會去處理裡面的jsp元素, 這些內容可以是文本, EL運算式, 標準動作甚至另一個自訂標籤.
3. tagdependent:標記主體可以有內容, 而jsp容器會把它們當作純檔案處理
trimDirectiveWhitespaces=“true”表示刪除多餘的空行
pageEncoding=”UTF-8” 表示page的編碼格式
標記中也可以定義attribute,例如:
<%@ attribute name="x" required="true" rtexprvalue="true" %><%@ attribute name="y" required="true" rtexprvalue="true" %>
attribute的屬性介紹如下:
1. name :這個attribute的名稱.
2. required : true/false, 是否必須的.
3. rtexprvalue : true/false, 這個attribute可否使用EL運算式, 否則為純文字.
4. type : 設定這個attribute的類型, jsp容器會把結果自動轉換成這個類.
單純的說以上的定義是不是有點糊塗呢。農夫選豆種——舉例(粒)為證:
先展示出自訂的tag在web工程下的目錄結構,
我們看一下index.jsp的代碼:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%><%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %><%@ taglib tagdir="/WEB-INF/tags/" prefix="yu" %><!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>define tag</title></head><body> <!-- test tag [body-content="empty"] --> <yu:add x="1" y="2"/></body></html>
該index.jsp中引用了add.tag檔案,看一下add.tag檔案的定義:
<%@ tag body-content="empty" trimDirectiveWhitespaces="true" pageEncoding="UTF-8"%><%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %><%@ attribute name="x" required="true" rtexprvalue="true" %><%@ attribute name="y" required="true" rtexprvalue="true" %><div> <h4>The result of x+y is</h4> result = ${x+y}</div>
運行起來程式我們看看運行結果:
至此,基本上已經理解了tag檔案的使用了吧,那我們做進一步的學習。
繼續編寫index.jsp代碼,來驗證body-content=”scriptless”的tag檔案:
<!-- test tag [body-content="scriptless"] --><yu:scriptless_tag>This tag's body-content is [scriptless], let's have a test, i'm here.<br/><label>contextPath:<label/> ${pageContext.request.contextPath}</yu:scriptless_tag>
那我們來看一下scriptless_tag.tag檔案的定義:
<%@ tag body-content="scriptless" trimDirectiveWhitespaces="true" pageEncoding="UTF-8"%><div style="background-color: red; width=auto">my backgroud color is red</div><jsp:doBody></jsp:doBody><div style="background-color: blue; width=70px;">my backgroud color is blue</div>
細心的朋友發現這裡面多了一個\<\jsp:doBody>標籤,該標籤的作用就是講index.jsp中該標記檔案標記的主體顯示在該處,來看一下程式運行結果吧,一目瞭然:
在index.jsp檔案中scriptless_tag標籤標記的主體顯示在了紅色背景和藍色背景之間,並且將代碼${pageContext.request.contextPath}解析成了 /yuTestTag
繼續編寫index.jsp代碼,來驗證body-content=”tagindependent”的tag檔案:
<!-- test tag [body-content="tagindependent"] --><yu:tagdependent_tag>This tag's body-content is [tagindependent], let's have a test, i'm here.<label>contextPath:<label/> ${pageContext.request.contextPath}</yu:tagdependent_tag>
scriptless_tag.tag檔案的定義和scriptless_tag.tag的內容基本一樣:
<%@ tag body-content="tagdependent" trimDirectiveWhitespaces="true" language="java" pageEncoding="UTF-8"%><div style="background-color: red; width=auto">my backgroud color is red</div><jsp:doBody></jsp:doBody><div style="background-color: blue; width=70px;">my backgroud color is blue</div>
繼續看看運行結果:
代碼${pageContext.request.contextPath}沒有被解析,只是當做純文字檔案
最後附上index.jsp的完整代碼:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%><%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %><%@ taglib tagdir="/WEB-INF/tags/" prefix="yu" %><!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>define tag</title></head><body> <!-- test tag [body-content="empty"] --> <yu:add x="1" y="2"/> <hr> <!-- test tag [body-content="scriptless"] --> <yu:scriptless_tag> This tag's body-content is [scriptless], let's have a test, i'm here.<br/> <label>contextPath:<label/> ${pageContext.request.contextPath} </yu:scriptless_tag> <hr> <!-- test tag [body-content="tagindependent"] --> <yu:tagdependent_tag> This tag's body-content is [tagindependent], let's have a test, i'm here. <label>contextPath:<label/> ${pageContext.request.contextPath} </yu:tagdependent_tag></body></html>
到此我相信這三種類型的tag的區別已經顯而易見了,先簡單的寫到這,如有不妥請留言補充說明。