tag屬性分析

學習編寫標記文件(tag):

自定義標記的用途就是給程序員可以自定一些特定功能的標記, 以及封裝代碼, 達到分工, 重用性等

多種好處.

JSP規範2.0中新增了標記文件(tag file)的使用, 免除以前自定義標記必須爲一個Java類, 以及必須

加上一個標記描述文件(tld)的編碼難度.

以下我們來看標籤文件的使用.


1. 存放:


一個標記文件以tag爲後綴名, 以同一類型的檢籤放到同一個文件夾中組成一個標記庫, 再放到

"/WEB-INF/tags/"中保存.

例如接下來我打算建立一組有關數學的標記庫, 我在"/WEB-INF/tags/"下建立一個"maths"文件夾, 然

後就可以在"/WEB-INF/tags/maths/"下建立後綴名爲tag的標記文件了.

現在我想先做一個數字相加的標記, 起名爲"add.tag", 放到maths標記庫下.


2. 語法:


標記文件其實就是一個jsp文件, 所以語法基本上跟jsp是一樣的, 在第一行加上以下這個元素來告訴

服務器
它是一個標記文件:

<%@ tag %>


我們還要加上一些屬性來告訴
服務器 這個標記文件的設定:

1) body-content - 設定這個標記的主體內容類型:


A. empty

這個是一個空標記.
B. scriptless
主體可以有內容, 而jsp容器會去處理裏面的jsp元素, 換句話就是可以是
文本, EL表達式, 標準動作甚至另一個自定義標記.
C. tagdependent
主體可以有內容, 而jsp容器會把它們當作純文件處理 .

2) pageEncoding - 設定這個標記的編碼


我們的add標記是個空標記, 而編碼是"UTF-8", 所以加上這樣的一句:


<%@ tag body-content="empty" pageEncoding="UTF-8" %>


標記中使用以下這個元素來聲明屬性:


<%@ attribute %>


attribute元素也有幾個屬性:


1) name - 這個attribute的名稱.


2) required - true/false, 是否必須的.


3) rtexprvalue - true/false, 這個attribute可否使用EL表達式, 否則爲純文本.


4) type - 設定這個attribute的類型, jsp容器會把結果自動轉換成這個類.


我們的add.tag有兩個屬性, 分別代表兩個要相加的數字, x跟y, 它們都是必須的, 可以用EL表達式:


<%@ attribute name="x" required="true" rtexprvalue="true" %>

<%@ attribute name="y" required="true" rtexprvalue="true" %>

那這個標記都設定好了, 那我們應該怎樣讀取這些傳入的屬性呢? 其實很簡單, 標記文件就是一個

jsp文件, 這些輸入的屬性值都存放在作用域中, 所以利用EL表達式就可以了:

${x + y}


這個標記文件就完成了, 以下爲完整代碼, 你也可以直接打開"/WEB-INF/tags/maths/add.tag":


<%--

maths標記庫add標記

功能: 把傳入參數相加

參數:
x, 數字1, 必須
y, 數字2, 必須
--%>

<%@ tag body-content="empty" pageEncoding="UTF-8" %>


<%-- 聲明屬性 --%>

<%@ attribute name="x" required="true" rtexprvalue="true" %>
<%@ attribute name="y" required="true" rtexprvalue="true" %>

<%-- 內容 --%>

${x + y}

標記文件完成了, 那我們要怎樣在jsp文件中調用它呢? 首先我們導入maths標記庫, 跟調用標準動作

一樣使用taglib指令, 但是把url屬性換成tagdir, 指定我們自定義標記庫的位置, 並給它一個前綴
名, 以下我們用"maths":

<%@ taglib tagdir="/WEB-INF/tags/maths/" divfix="maths" %>


然後我們就可以調用標準動作一樣去使用它啦, 當然必須的屬性一定要有, 不然會報錯:


<maths:add x="10" y="10"/>


以下爲調用add標記的jsp頁的完整代碼, 同樣的你可以直接打開"/add.jsp":


<%-- maths標記庫add標記的演試 --%>

<%@ page contentType="text/html; charset=UTF-8" language="java" %>
<%-- 調用自定義標記庫maths --%>
<%@ taglib tagdir="/WEB-INF/tags/maths" divfix="maths" %>

<html>

<head>
<title>Maths標記庫add標記演試</title>
</head>
<body>
結果:<br/>
<%-- 使用add標記 --%>
<maths:add x="10" y="10"/>
</body>
</html>

相信大家都瞭解基本工作原理了吧? 你可以把標記文件看作一個jsp頁面, 你可以對它傳入一些參數,

調用它的面頁就像包含它一樣, 所以你可以標記文件打上一句"HelloWorld", 一段html代碼, 甚至包
含其他的動作, 調用它的面頁就會顯示, 大家可以打開"/helloworld.jsp"看一下, 它調用了別一個
標記庫others裏面的helloworld標記.

add標記是一個空標記, 我們學過body-content="scriptless", 那我們應該怎樣去處理標記主體的數

據呢? 我們來新增一個新的標記庫, 叫string, 再增加一個標記文件"show.tag", 同樣的加上tab指
令告訴服務器 這個是一個標記文件, 這一次body-content屬性改爲scriptless:

<%@ tag body-content="scriptless" pageEncoding="UTF-8" %>


然後我們加入一個標準動作:


<jsp:doBody>


它的用途是讀入標記的主體內容, 當沒有指定要保存到的變量時, 它把內容直接輸出到調用的頁面上.


我們寫一個"/show.jsp"來簡單調用這個show標記:


?<%-- string標記庫show標記的演試 --%>

<%@ page contentType="text/html; charset=UTF-8" language="java" %>
<%-- 調用自定義標記庫string --%>
<%@ taglib tagdir="/WEB-INF/tags/string" divfix="string" %>

<html>

<head>
<title>string標記庫trim標記演試</title>
</head>
<body>
<%-- 使用show標記 --%>
<string:show>
這個是標記的主體內容
</string:show>
</body>
</html>

<jsp:doBody>有三個屬性:


1) var - 當指定這個變量, 讀取的主體內容就會以String保存這個變量內, 不會直接輸出頁

面.

2) varReader - 用途跟var一樣, 但是保存的不是一個String, 而是一個java.io.Reader.


3) scope - 變量保存到的作用域, 包括: page, request, session, application, 默認爲

page.

接下來我們擴充string標記庫, 加入一個新的標記"trim.tag", 同樣的加入tag指令, 設定

body-content爲scriptless代表它可以有主體內容, 因爲我們會使用到核心標記庫, 所以加上taglib
指令導入核心標記庫, 並加入jsp:doBody指令讀取主體內容並保存到變量body中:

<%@ tag body-content="scriptless" pageEncoding="UTF-8" %>


<%-- 導入核心標記庫 --%>

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" divfix="c" %>

<%-- 把主體內容保存到body變量中, 沒有指定作用域下, 保存在page --%>

<jsp:doBody var="body"/>

我們獲得一個主體內容的字符串了, 那可以編寫一段代碼來把字符串中的空白去掉, 我們可以利用核

心標記庫的一個標記forTokens來把字符串跟據空白來分割, 再輸出就可以達到這個效果了, 以下給出
這個標記的完整代碼, 大家也可以直接打開"/WEB-INF/tags/string/trim.tag":

<%--

string標記庫trim標記

功能: 把標記主體的內文中的空白去掉

--%>

<%@ tag body-content="scriptless" pageEncoding="UTF-8" %>


<%-- 導入核心標記庫 --%>

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" divfix="c" %>

<%-- 把主體內容保存到body變量中, 沒有指定作用域下, 保存在page --%>

<jsp:doBody var="body"/>

<%-- 實現把主體字符串的空白去掉 --%>

<c:forTokens var="char" items="${body}" delims=" ">${char}</c:forTokens>

這裏有一個要注意的, 最後一行必須要這樣寫, 什麼意思? 很多人(包括我)可能會這樣寫:


<c:forTokens var="char" items="${body}" delims=" ">

${char}
</c:forTokens>

這個是好習慣, 代碼看上去整齊多了, 但是jsp容器會把換行換成一個空白...哈哈, 不懂的自己試一

下吧^^

這個演試可以看到標記文件不單沒有以前標記處理類加上一個tld來得那麼麻煩, 而且在一個標記文

件中, 我們可以再導入另一個標記庫來擴充功能, 實在是非常方便.

相信大家都對標記文件的基本應用都有一定的瞭解了, 下面我們來看標記文件的其他功能.


如果我們想建立一些標記文件供網頁人員使用, 而且這個標記文件支持所有html元素的屬性, 那你可

能立刻就想到, 我們必須爲每一個可能出現的html標記屬性建立一個屬性標記, 那是多費時的工作,
所以我們可以在tab指令中加上dynamic-attributes這個屬性, 表示這個標記可以容許任何的屬性值
出現, jsp容器會自動把所有未聲明的屬性保存到一個以你給出的值爲命名的Map集合中, 而這個集合
保存在page作用域中. 我們來新建一個標記文件到others標記庫中, 並加上以下代碼行:

<%@ tag body-content="empty" pageEncoding="UTF-8"

dynamic-attributes="attributesList" %>?

當調用這個標記時, 所有未被聲明的屬性都會保存到"attributesList"這個Map集合中, 我們可以用

核心標記庫的forEach把它們列出, 以下爲完整代碼, 你也可以直接打開"/WEB-INF/tags/others/
showAttributes.tag":

? <%--

others標記庫showAttributes標記

功能: 讀取dynamic-attributes所保存的屬性集合, 輸出到調用的頁面上.

--%>
<%@ tag body-content="empty" pageEncoding="UTF-8"
dynamic-attributes="attributesList" %>?
<%-- 導入核心標記庫 --%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" divfix="c" %>

<%-- 輸出所有屬性 --%>

<p>本標記包含了以下的動態屬性</p>
<%-- 使用forEach遍歷"attributesList"集合並輸出到調用頁面 --%>
<c:forEach var="item" items="${attributesList}" varStatus="i">
<p>${i.index + 1}. ${item.key}: ${item.value}</p>
</c:forEach>

另外編寫一個jsp頁面調用showAttributes標記, 以下爲完整代碼, 你也可以直接打開

"/showAttributes.jsp":

? <%-- others標記庫showAttributes標記的演試 --%>

<%@ page contentType="text/html; charset=UTF-8" language="java" %>
<%-- 調用自定義標記庫others --%>
<%@ taglib tagdir="/WEB-INF/tags/others/" divfix="others" %>

<html>

<head>
<title>others標記庫showAttributes標記演試</title>
</head>
<body>
<others:showAttributes param1="hello" param2="on9" color="red"/>
</body>
</html>


下來我們看一個屬性的擴展功能 - 屬性片段(attribute fragment), 先解譯什麼是片段, 大家可以
把片段看作一段jsp代碼, JSP規範中所謂的jsp fragment, 例如我們之前使用了jsp:doBody讀取的主
體內容就是一個片段. 我們可以將一段巳命名的片段(named fragment)作爲一個標記的屬性使用, 並
而在標記中多次或一次調用這個傳入的片段. 要調用這個片段, 我們使用另一個標淮動作:

<jsp:invoke/>


它是一個空標記, 有以下的屬性:


1) fragment - 要調用的片段名.


2) var - 給出變量名, 把片段經過jsp容器計算過之後的結果作爲字符串保存.


3) varReader - 同上, 不過將結果作爲一個java.io.Reader保存.


4) scope - 作用域= =, 有var就有它, 不多說了, 默認page.


當然, 叫做屬性片段, 我們必須告訴jsp容器標記中那些標記屬性的內容會是片段而不是靜態文本. 我

們可以在屬性元素上加上fragment="true"這個屬性:

<%@ attribute name="name" fragment="true" %>


接下來我們再編寫一個標記來演試一下屬性片段的應用, 我們在others標記庫中新增一個"invoke"

標記, 加上tag指令, 建立兩個屬性fragment1跟fragment2, 用來接收兩個屬性片段, 以下給出完整
代碼, 大家也可以直接打開"/WEB-INF/tags/others/invoke.tag":

<%--

others標記庫invoke標記

功能: 演試屬性片段

--%>?
<%@ tag body-content="scriptless" pageEncoding="UTF-8" %>
<%@ attribute name="fragment1" fragment="true" %>
<%@ attribute name="fragment2" fragment="true" %>

<%-- 調用標準動作jsp:invoke顯示讀取的屬性片段 --%>

<p style="font-size:24px; font-weight:bold">這裏輸出屬性片段一的計算結果:</p>
<jsp:invoke fragment="fragment1"/>
<p style="font-size:24px; font-weight:bold">這裏輸出屬性片段二的計算結果:</p>
<jsp:invoke fragment="fragment2"/>
<%-- 調用標準動作jsp:doBody顯示讀取的主體內容 --%>
<p style="font-size:24px; font-weight:bold">這裏輸出主體內容:</p>
<jsp:doBody/>

上面可以看到我們調用了兩次<jsp:invoke fragment="xxx"/>, 大家可以把它看作一個佔位符, 它的

位置就是讀取的屬性片段的計算結果. 最後我們再一次調用<jsp:doBody/>來讀取主體內容.

不懂? 沒關係, 下面我們先把調用頁面"invoke.jsp"建立好, 細心觀察瀏覽器出來的效果, 大家就可

以瞭解爲什麼我會說把<jsp:invoke/>看作一個佔位符, 其實<jsp:doBody/>也是同一個工作原理, 下
面給出"invoke.jsp"的完整代碼, 同樣大家可以直接打開"/invoke.jsp":


<%-- others標記庫invoke標記的演試 --%>

<%@ page contentType="text/html; charset=UTF-8" language="java" %>
<%-- 調用自定義標記庫others --%>
<%@ taglib tagdir="/WEB-INF/tags/others" divfix="others" %>
<%-- 調用自定義標記庫string --%>
<%@ taglib tagdir="/WEB-INF/tags/string" divfix="string" %>

<html>

<head>
<title>others標記庫invoke標記演試</title>
</head>
<body>
<%-- 使用invoke標記 --%>
<others:invoke>
<jsp:attribute name="fragment1"> <%-- 第一個片段我們引用helloworld標記 --%>
<others:helloworld/>
</jsp:attribute>
<jsp:attribute name="fragment2"> <%-- 第二個片段我們引用trim標記 --%>
<string:trim>
I am a boy!
</string:trim>
</jsp:attribute>
<jsp:body> <%-- 這裏就是主體內容 --%>
這裏就是<font color="red" size="25">主體內容</font>啦
</jsp:body>
</others:invoke>
</body>
</html>?

(上面代碼的排版有點亂, 註釋本來是自己開新行的, 但是屬性之間如果插入註釋,
服務器 會報錯= =)

這個jsp頁面包含我們今天所建立的另外兩個標記"helloworld"跟"trim", 它們分別就是兩個屬性片段

的內容, 另外大家會看到<jsp:body>...</jsp:body>這個沒介紹過的標準動作, 因爲一個標記的主體
如果巳經包含了<jsp:attribute/>元素的話, 主體的內容就必須放到<jsp:body/>之內, jsp容器纔可
正常的分別到哪些是屬性, 哪個是主體, 所以以下的語法是不容許的:

<others:invoke>

<jsp:attribute name="fragment1">
屬性一的內容
</jsp:attribute>
<jsp:attribute name="fragment2">
屬性二的內容
</jsp:attribute>
<p>這裏是主體內容...</p>
</others:invoke>

下來留一個小測試給大家, 打開"/invoke.jsp", 在<jsp:body/>標記內加上這一段代碼:


${"a" == "a"}


重載"/invoke.jsp", 大家會發現在網頁的末尾, 出現了"true"一字, 然後我們來開"/WEB/INF/

tags/others/invoke.tag", 把tag指令中的body-content屬性改爲"tagdependent", 重載
"/invoke.jsp"看有什麼不一樣?

接下來這個會是個難點, 這個部份希望大家可以返覆多看幾遍, 試著修改一下例題來了解一下參數不

同會產生什麼不一樣的結果.

我們一直的工作流程都是, 一個jsp頁面調用一個自定義的標記, 給它一些屬性, 我們在標記裏讀取它

們, 然後處理代碼, 返回給jsp容器, jsp容器計算結果後給jsp頁面輸出靜態的文本, 那我們可不可以
在處理代碼後, 把結果以變量的形式返回呢? 就好像我們寫一個有返回值的函數一樣? 可能大家會想
想我們有<c:set/>這個聲明/賦值的標準動作, 但是想一下, 標記文件跟jsp頁面是兩個不同的page作
用域, 我們如果要傳遞變量的話就只有把變量放在session/application中了, 那不是很麻煩? 萬一我
在jsp接收變量後沒有把這個變量的內存空間釋放掉, 那服務器 有10GB內存也不夠用了, 所以JSP規範
中提供了一個指令:

<%@ variable %>


它可以讓我們在標記文件中的聲明一個輸出變量, 讓jsp頁面讀取, 它有以下的屬性:


1) name-given - 給這個變量取名.


2) name-from-attribute - 這個變量名由一個屬性來決定(跟name-given只可選一).


3) alias - 給輸出變量取別名(配合name-from-attribute使用).


4) variable-class - 給出輸出變量類型, jsp容器會自動轉換, 如果沒指定爲String.


5) scope - 輸出變量在jsp頁面上的更新模式, 可取值爲: AT_BEGIN/AT_END/NESTED, 默認

爲"NESTED".

相信第1,4屬性大家都看懂, 第2,3屬性我們在下一個例子中再說明, 我們來說明一下scope屬性.


scope的3個可取值代表什麼意思呢?


1) AT_BEGIN - 輸出變量在標記文件的<jsp:doBody/>/<jsp:invoke/>之前及標記文件執行結

束後更新輸出變量的值.

2) AT_END - 輸出變量只有在標記文件執行結束後更新輸出變量的值.


3) NESTED - 輸出變量在標記文件的<jsp:doBody/>/<jsp:invoke/>之前更新輸出變量的值,

在標記文件結束後, 將會把輸出變量還原到在調用標記前的值

不懂? 我也搞了4個小時, 返覆的試驗才清楚這三個取值有什麼不一樣. 現在不瞭解沒有關係, 它們關

繫到在標記文件中使用到<jsp:doBody/>/<jsp:invoke/>時, 其他的代碼在這些動作之前之後的不同,
我們現在只需要記得一個不同就好了. 如果你需要把輸出變量輸出到jsp頁面上(= =不然呢?), 就用
"AT_BEGIN", 如果你只需要在標記執行中在jsp頁面讀取到輸出變量, 那就用"NESTED".

可能大家還是會搞混了, 我不就是爲了輸出一個變量到jsp頁面嗎? 你給我一個"NESTED"幹嗎? 其實輸

出變量還有一個用途, 就是讓標記文件可以把變量傳到另一個標記文件上. 如果我的標記文體主體內
容是另一個標記, 我想把值傳給它而巳, 並沒有需要傳到jsp頁面的作用域上時, "NESTED"就有用了,
因爲還原的意思是, 如果調用的jsp頁面本來就沒有聲明這個輸出變量, 那就代表輸出變量只有在標記
主體執行時出現過, 結束後它就卸載了.

下面我們就來看一個例子吧(還是不懂? 就只用"AT_BEGIN"吧, 管它還不還原), 以下建立了一個新的

標記文件"variable.tag"在others標記庫中, 同樣的加入tag指令, 導入核心標記庫(?), 以下給出完
整代碼, 大家也可以直接打開"/WEB-INF/tags/others/variable.tag":

<%--

others標記庫variable標記

功能: 演試variable指令輸出變量的功能

--%>
<%@ tag body-content="empty" pageEncoding="UTF-8" %>
<%-- 導入核心標記庫 --%>
<%@ taglib divfix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<%-- 聲明一個輸出變量, 取名爲"v" --%>

<%@ variable name-given="v" scope="AT_BEGIN" %>
<%-- 對輸出變量賦值 --%>
<c:set var="v" value="這個就是標記文件的輸出的內容"/>

爲什麼要使用要<c:set/>動作呢? 因爲variable指令只是聲明瞭一個變量, 我們還需要給它賦值, 下

面同樣我們再建立一個"/variable.jsp", 看看jsp頁面是如何讀取到這個變量, 以下給出完整代碼,
大家也可以直接打開"/variable.jsp":

<%-- others標記庫variable標記的演試 --%>

<%@ page contentType="text/html; charset=UTF-8" language="java" %>
<%-- 導入others標記庫 --%>
<%@ taglib tagdir="/WEB-INF/tags/others" divfix="others" %>

<html>

<head>
<title>others標記庫variable標記演試</title>
</head>
<body>
<%-- 調用variable標記並顯示 --%>
<others:variable/>
輸出變量v: ${v}
</body>
</html>?

有了variable指令, 我們就可以把一個標記文件處理後的結果, 放到輸出變量中, 再給它指定一個類

型, 作爲另一個標記文件的屬性傳遞, 是不是很方便呢?

但是問題來了, 這個輸出變量的取名是標記文件定義的, 如果調用它的頁面也有這個變量那怎辦? 所

以我們下面來了解一下variable指令上"name-from-attribute"跟"alias"這兩個屬性, 怎樣可以達成
"取別名"的效果.

我們來新建一個標記文件"alias"在"others"標記庫中, 同樣加入tag指令, 導入核心標記庫, 然後我

聲明一個屬性, 它的作用就是用來存放輸出變量的取名, 讓調用頁面可以傳入一個字符值來決定輸出
變量的取名, 然後我們使用variable指令:

<%@ variable name-from-attribute="output" alias="v" scope="AT_END" %>


"name-from-attribute"屬性告訴jsp容器這個輸出變量的取名爲那個屬性的值, 而"alias"屬性就爲

這個輸出變量取一個別名, 以便在標記裏使用這個變量, 以下給出完整代碼, 大家也可以直接打開
"/WEB-INF/tags/others/alias.tag":

<%--

others標記庫alias標記

功能: 演試variable指令的取別名功能

--%>
<%@ tag body-content="empty" pageEncoding="UTF-8" %>
<%-- 導入核心標記庫 --%>
<%@ taglib divfix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<%-- 存放輸出變量的名稱, 記得這個屬性必須爲靜態文本及必須的 --%>

<%@ attribute name="output" required="true" rtexprvalue="false" %>
<%-- 聲明輸出變量, 在標記文件中使用別名爲"v", 而在調用頁面上的名稱則
由屬性output決定 --%>
<%@ variable name-from-attribute="output" alias="v" scope="AT_END" %>

<%-- 爲輸出變量賦值 --%>

<c:set var="v" value="<p>這個就是標記文件的輸出的內容</p>"/>

同樣的, 我們建立一個"/alias.jsp"來演試一下, 以下給出完整代碼, 大家也可以直接打開

"/variable.jsp":

<%-- others標記庫alias標記的演試 --%>

<%@ page contentType="text/html; charset=UTF-8" language="java" %>
<%-- 導入others標記庫 --%>
<%@ taglib tagdir="/WEB-INF/tags/others" divfix="others" %>

<html>

<head>
<title>others標記庫alias標記的演試</title>
</head>
<body>
<%-- 調用alias標記, 對output屬性賦值就可以自定義輸出變量名 --%>
<others:alias output="super"/>
${super}
<%-- 試一下用別的名稱 --%>
<others:alias output="haha"/>
${haha}
</body>
</html>?

使用了"name-from-attribute"就可以避免命名衝突了, 記得存放輸出變量取名的屬性必須把

"rtexprvalue"設爲假, 不然服務器 也會報錯的.

以上就是JSP規範2.0中新增的標記文件的語法介紹了^^


3. 打包


今天計一下我們都創建了8個自定義動作, 如果我們想要跟人家分享我的作品, 或者要去第三方部署的

話, 那就麻煩了, 所以以下我們學習怎樣去把我們的標記庫打包.

第一步, 我們先改變一下文件結構, 在網站根目錄下, 創建一個"META-INF"文件夾, 然後把"WEB-INF"

裏面的"tags"文件夾複製過去, 形成以下文件結構:

網站根目錄/

META-INF/
tags/
maths/
...tag文件...
others/
...tag文件...
string/
...tag文件...
WEB-INF/
...tag文件夾...
...jsp文件...

我們先打包string標記庫, 所以把"maths"跟"others"文件夾刪除, 然後我們需要創建一個tld標籤描

述文件(對, 又是它, XML又來了)在"META-INF"下, 複製下面的內容到文件開始:

<?xml version="1.0" encoding="UTF-8" ?>

<taglib xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLScheme-instance"
xsi:schemeLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/sml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
version="2.0">

<!-- 標記庫版本 -->

<tlib-version>1.0</tlib-version>
<!-- 命名空間前綴 -->
<short-name>string</short-name>
<!-- 文件夾名 -->
<uri>string</uri>

<!-- 包含的標記 -->


<tag-file>

<!-- 標記名 -->
<name>show</name>
<!-- 路徑 -->
<path>/META-INF/tags/string/show.tag</path>
</tag-file>
<tag-file>
<name>trim</name>
<path>/META-INF/tags/string/trim.tag</path>
</tag-file>
</taglib>

taglib元素的一大串屬性不用管它, 這個不是我們的討論範圍, 以後要寫tld文件就複製過去就對了,

版本跟命名空間前綴也可以不管, 那個是給設計工具使用的, 沒什麼影響, uri元素必須爲標記庫的
文件夾名, 之後的tag-file元素聲明瞭這個標籤庫裏面有什麼標記, 語法爲:

...

<tag-file>
<name>標記名</name>
<path>相對路徑</path>
</tag-file>
...

完成後打開"命令提示符", 轉到網站的根目錄, 輸入下面的命令:


jar cvf string.jar META-INF


完成後大家就會看到根目錄下新增了一個jar文件"string.jar", 把它放到"/WEB-INF/lib"之下就OK

了. 那我們再新建一個jsp頁面來調用這個巳經打包好的標記庫吧, 以下爲"jar.jsp"的完整代碼,
同樣大家可以直接打開"/jar.jsp":

<%-- 使用jar文件導入標記庫的演試 --%>

<%@ page contentType="text/html; charset=UTF-8" language="java" %>
<%-- 導入string標記庫包 --%>
<%@ taglib uri="string" divfix="string" %>

<html>

<head>
<title>使用jar文件導入標記庫的演試</title>
</head>
<body>
<%-- 調用trim標記 --%>
<string:trim>
Please trim me!
</string:trim>

</body>

</html>?

發佈了33 篇原創文章 · 獲贊 4 · 訪問量 15萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章