1. 程式人生 > >JavaWeb學習——標簽文件

JavaWeb學習——標簽文件

instance out el表達式 就會 odi true 本體 spa resp

JSP 標簽文件(tag file)


前言:在之前我們介紹了自定義標簽,通過寫無腳本的JSP文件,可以促進分工,頁面設計者可以和後臺邏輯編碼者同時進行工作。但是,編寫自定義標簽太過冗長瑣碎。從JSP2.0開始,通過 tag file 的方式,無須編寫標簽處理類和標簽描述文件,也能夠自定義標簽。

一、tag file簡介

tag file 從兩個方面簡化了自定義標簽的開發。首先,tag file 無須提前編譯,直到第一次被調用才會編譯。除此之外,僅僅使用JSP語法就可以完成標簽的擴展定義。

其次,標簽庫描述文件也不再需要了。

JSP容器提供多種方式將 tag file 編譯成Java的標簽處理類。例如Tomcat將 tag file 翻譯成繼承於 javax.servlet.jsp.tagext.SimpleTag接口的標簽處理類。

一個 tag file 和JSP頁面一樣,擁有指令,腳本,EL表達式,動作元素以及自定義的標簽。一個tag file以 tag 或者 tagx 為後綴,它們可以包含其他資源文件。一個被其他文件包含的 tag file 應該以 tagf 為後綴。

tag file 中也有一些隱藏對象,通過腳本或者EL表達式可以訪問這些隱藏對象。這些對象與JSP中的隱藏對象相似。

對象 類型
request javax.servlet.http.HttpServletRequest
response javax.servlet.http.HttpServletResponse
out javax.servlet.jsp.JspWriter
session javax.servlet.http.HttpSession
appliction javax.servlet.ServletContext
config javax.servlet.ServletConfig
jspContext javax.servlet.jsp.JspContext

二、第一個 tag file

下面這個例子包含一個 tag 文件和一個使用這個tag文件的JSP頁面。這個tag file的名稱是firstTag.tag,代碼清單如下:

firstTag.tag

<%@ tag import="java.util.Date" import="java.text.DateFormat"%>
<% 
     DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.LONG);
     Date now = new Date(System.currentTimeMillis());
     out.print(dateFormat.format(now));
%>

firstTagTest.jsp 頁面

<%@ taglib prefix="easy" tagdir="/WEB-INF/tags"%>
Today is <easy:firstTag/>

效果如下:

技術分享圖片

三、tag file 指令

和JSP頁面一樣,tag file 可以使用指令來指揮JSP容器如何編譯這個tag file。

除了page指令,其他所有的JSP指令都可以用於tag file。在tag file 中,可以使用tag指令代替page指令。 另外,你還可以使用兩個新指令:attribute 和 variable。

tag file指令
指令 描述
tag 作用與JSP頁面中的page指令類似
include 用於將其他資源導入tag file
taglib 用於將自定義標簽庫導入tag file
attribute 用於將自定義標簽庫導入tag file
variable 用於將自定義標簽庫導入tag file

1. tag指令

tag指令與JSP中的page指令類似。以下是屬性表。

屬性     描述
display-name 在XML工具中顯示的名稱。默認值是不包含後綴的tag file
body-content 指定標簽body的類型,body-content屬性值有empty、tagdependent、scriptless,默認值是scriptless
dynamic-attributes   指定tag file動態屬性的名稱。當dynamiattributes值被設定時,會產生一個Map來存放這些動態屬性的名稱和對應的值
small-icon 指定一個圖片路徑,用於在XML上顯示小圖標
large-icon 指定一個圖片路徑,用於在XML上顯示大圖標
description 標簽的描述信息
example 標簽使用實例的描述
language tag file 中使用的腳本你語言類型。必須設為“java”
import 用於導入一個java類型,和JSP頁面中的import相同
pageEncoding 指定tag file使用的編碼格式

除了import屬性,其他所有的屬性在一個tag指定或一個tag file 中都只能出現一次。

2. include指令

tag file 中的include指令和JSP頁面中的include是一樣的。

3. taglib指令

可以通過taglib指令在tag lib中使用自定義標簽。taglib指令的語法如下:

<%@ taglib uri="taglibraryURI" prefix="tagPrefix" %>

4. attribute指令

attribute 用於設定tag file中的標簽的屬性。它與標簽庫描述文件中的attribute元素等效。

attributr 指令的的屬性如下,其中只有name屬性是必須的。

屬性     描述
name 用於設定該屬性的名稱。在一個tag file中,每個屬性的名稱是唯一的
required 用於設定該屬性是否是必須的。值可以取TRUE和FALSE
fragment 用於設定該屬性是否是fragment。
rtexprvalue   用於設定該屬性的值是否在運行時被動態計算
type 用於設定該屬性的類型
description 用於設定該屬性的描述信息

5. variable指令

通過variable 可以將tag file 中的一些值傳遞到JSP頁面。variable指令的語法如下:

<% variable (attribute="value")* %>

variable 指令的屬性參見下表:

屬性     描述
name-given 變量名。
name-from-attribute 和name-given屬性類似,由標簽屬性的值來決定變量的名稱。如果兩者屬性同時出現或都不出現會出現錯誤
alias 設定一個用來接收變量值的局部範圍
variable-class 變量的類型
declare 設定該變量是否聲明
scope 用於指定該變量的範圍
description 用於描述該變量

與JspWriter對比:JspWriter只能簡單地將一個String傳遞到JSP頁面,靈活性很差。

四、doBody

doBody動作元素只能在tag file中使用,它用來調用一個標簽的本體內容。

doBody動作元素也可以有屬性。你可以通過這些屬性來指定某個變量來接收主題內容,如果不適用這些指令,那麽doBody動作會把主體內容寫到JSP頁面的JspWriter上。

doBody動作元素的屬性如下表:

屬性     描述     
var 用於保存標簽主體內容的變量值,主體內容就會以String的類型保存這個變量內。var和varReader只能出現一個  
varReader 用於保存標簽主體內容的變量值,主體內容就會以Reader的類型保存在這個變量內
scope 變量保存的作用域

五、invoke

invoke動作元素和doBody類似,在tag file中,可以使用它來調用一個fragment。invoke動作元素的屬性:

屬性     描述     
fragment 要調用的fragment名稱   
var 用於保存片段主體內容的變量值,主題內容就會以String類型保存在這個變量中,var和varReader屬性只能出現一個  
varReader 用於保存片段主體內容的變量值,主題內容就會以Reader類型保存在這個變量中,var和varReader屬性只能出現一個
scope 變量保存到的作用域

------ 天若有情天亦老,人間正道是滄桑 ------

JavaWeb學習——標簽文件