iT邦幫忙

2017 iT 邦幫忙鐵人賽
DAY 22
0

前言

昨天大概整理了core的標籤的用法
前幾天也看到EL時有碰到一點TLD
今天來整理TLD這個設定的的介紹用法
還有需要注意的地方
為本書的ch9

TLD是什麼

全名為Tag Library Description
主要是提供自訂標籤所使用
在執行自訂標籤的第一步,就會先讀取TLD檔
定義了所有tag相關的用法及對應

TLD提供內容如下:

  • 1.標籤名稱及語法
    可以自行定義前贅字,以及定義是否有主體,要放什麼進去,還有每個屬性的型別
    屬性是否可以為表達式或是字串

  • 2.標籤程式庫URI
    TLD描述這個標籤程式庫特有的名稱
    URI是放在taglib指令裡面
    告訴container如何在Web中識別TLD
    簡單說就是JSP透過這個名稱,去TLD找相關對應
    再去呼叫java後端的code

TLD架構

此部分就直接提供一個範例
在下面做說明

test.tld

<?xml version="1.0" encoding="UTF-8"?>
<taglib version="2.0" 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
     web-jsptaglibrary_2_0.xsd">
    <!--- 宣告的板號 --> 
    <tlib-version>1.0</tlib-version>
    <!--- 供開發工具使用 --> 
    <short-name>RandomTags</short-name>
    <!--- taglib所使用的對應名稱 --> 
    <uri>myTag</uri>
    
    <tag>
    <!--- 可省略,只是說明一下此tag --> 
    <description>test tag</description>
    <!--- 設定的tag名稱 --> 
    <name>newtag</name>
    <!--- 對應的java程式 --> 
    <tag-class>com.myFirstTag</tag-class>
    <!--- 設定此標籤是否可以有主體--> 
    <body-context>empty</body-context>


    <!--- 若要設定此tag可接受屬性,則需要此內容--> 
    <attribute>
        <!---若required設為true,則代表此tag必須要有屬性才能使用--> 
    	<name>userName</name>
    	<required>true</required>
        <!---設定此tag是否只能接受字串--> 
    	<rtexpevalue>true</rtexpevalue>
    </attribute>
    </tag>
</taglib> 

rtexprvalue

rtexprvalue這個設定,預設為false
若設定為false時
在此用此tag時,屬性的值必須是字串
即設為true才可以使用EL表示

<%@ taglib prefix="test" uri="myTag"%>
<test:newtag  userName="${currentName}" //若rtexprvalue=false,這樣會失敗

rtexprvalue可搭配各種方式去做使用

//1.EL表達式
<test:newtag  userName="${currentName}" 
//2.Scripting運算式
<test:newtag userName='<%request.getAttribute("currentName")%>' />
//3.<jsp:attribute>標準動作
//即使這個tag已經設定不能有body,使用標準動作仍可以設定
<test:newtag>
  <jsp:attribute name="userName">${currentName}</jsp:attribute>
</test:newtag>

body-content

TLD的這個設定用來確認是否可開放body

<!--- 設定empty表示不能有body--> 
<body-context>empty</body-context>

<!--- 設定scriptless表示不能使用scripting元素--> 
<body-context>scriptless</body-context>

<!--- 設定tagdependent表示內容當作文字去處理EL不會自動判斷--> 
<body-context>tagdependent</body-context>

<!--- 設定這個tag 的body可以包含任何可以出現在JSP裡的東西--> 
<body-context>JSP</body-context>

若body-content設為empty
則在JSP顯示的方式只能有下列三種:

  • 1.空的標籤
<test:newtag userName="${currentName}" /> 
  • 2.開始與結束的tag中沒有任何東西
<test:newtag userName="${currentName}"></<test:newtag> 
  • 3.使用jsp:attribute
//body-content真的要包含tag
//只能使用jsp:attribute去增加其屬性,其他都不能含有任何內容
<test:newtag>
  <jsp:attribute name="userName">${currentName}</jsp:attribute>
</test:newtag>

TLD會存放的位置

Container會在以下地方去搜尋TLD
也就是說TLD只會放置在這些位置

  • 1.WEB-INF下
  • 2.WEB-INF的子目錄
  • 3.jar檔(WEB-IND/lib/)META-INF目錄
  • 4.jar檔(WEB-IND/lib/)META-INF的子目錄

小結

整理到這裡好像有點複雜
從JSP的基本用法到標準表示式到EL在到使用TLD去自訂tag
這幾天會持續在整理這個部分
可能有想到怎樣比較好補充也會在更新


上一篇
[Day 21] JSTL筆記 - Core標籤程式庫
下一篇
[Day 23] fmt標籤
系列文
30 days JSP & Servlet學習紀錄 30

尚未有邦友留言

立即登入留言