Jsp 自訂tag標籤

來源:互聯網
上載者:User
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的區別已經顯而易見了,先簡單的寫到這,如有不妥請留言補充說明。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.