2010年8月23日 星期一

JSP & Servlet 自訂標籤設計(2)

這篇筆記介紹 Tag File 的使用,為之前的自訂標籤的第二篇

Tag File 是自訂標籤的一部份
可以用來呼叫重複利用的內容,做到類似嵌入的效果 
它提供非 Java 開發人員不需要撰寫Java類別以及TLD就建立自訂標籤的選擇

Tag File 與其他的方法上比較有所差異的部分在觀念上
以概念來說,Web Application中不應該出現在請求之外的傳遞參數
所以之前提過的頁面客製化的作法在概念上並不是那麼的合理

使用方法為以下步驟:
  1.將被嵌入的檔案的副檔名改成.tag
  2.將Tag File (副檔名是.tag的檔案)放在WEB-INF下名為 "tags" 的目錄或其子目錄裡
  3.在JSP頁面加上 taglib 指令並使用 tagdir 屬性,接著如下範例呼叫標籤:
     <%@taglib prefix="fragment" tagdir="/WEB-INF/tags" %>>

     <html><body>
    <fragment:Header />
    </body></html>

範例會在頁面中呼叫Header.tag 檔
傳遞參數的方法則是使用標籤的屬性,例如<fragment:Header  subTitle="Hello" />
接著可以在被引入的檔案裡用 ${subTitle} 讀取此參數
也因為是標籤的屬性的緣故,傳遞的參數只能在引用的頁面裡面使用
不像其它的作法,若使用<jsp:param>會讓傳遞的參數被其他的部份看到
在設計的理念上,Tag File 是比較合理的

Tag File 與其他標籤程式庫不同
它不需要撰寫 tld 檔,除非要將它部屬在 JAR 檔中
那就必須用TLD,以<path>元素替它宣告實體位置
所以有一些專門用在 Tag File 上的指令會在下面說明

在 .tag 檔案裡可以可以加入 attribute 指令
作用類似後續會在自訂標籤筆記提到的 tld 裡的<attribute>元素
如:<%@ attribute  name="subTitle"  required="true"  rtexprvalue="true" %>
required屬性設定成 true 表示這個屬性是必要的
rtexprvalue 設定成 true 讓傳遞時可以用字串實字或表達式來輸入參數值

當屬性值很龐大時,有主體可以讓閱讀上比較方便
程式碼:
Header.tag======

<p><jsp:doBody /></p>


show.jsp=======

<%@taglib prefix="fragment" tagdir="/WEB-INF/tags" %>>

<html><body>
     <fragment:Header>
       這裡是主體內的內容
       這裡是主體內的內容
    </fragment:Header>
</body></html>

<jsp:doBody />的用意是不管標籤主體內容為何,將評算結果放進來
而body-content的宣告需要透過 tag 指令來下
如:<%@ tag body-content="tagdependent" %>
上面的程式碼設定標籤主體的內容做為純文字來處理
這個屬性的預設值是 scriptless,另外還可以設定empty
不過不管怎樣都不能在 Tag File 中使用Scriptlet

Tag File 是JSP的一部分,所以也是可以存取隱含物件
只是沒有 ServletContext 能用,須改用 JspContext 物件來存取

前一篇提過的 SkipPageException 在嵌入頁面的使用上
它會讓讓被嵌入的頁面中止,但呼叫它的頁面會繼續輸出
注意使用時的區別

沒有留言:

張貼留言