一
基本概念
標簽(Tag)
標簽是一種XML元素
通過標簽可以使JSP網頁變得簡潔並且易於維護
還可以方便地實現同一個JSP文件支持多種語言版本
由於標簽是XML元素
所以它的名稱和屬性都是大小寫敏感的
標簽庫(Tag library)
由一系列功能相似
邏輯上互相聯系的標簽構成的集合稱為標簽庫
標簽庫描述文件(Tag Library Descriptor)
標簽庫描述文件是一個XML文件
這個文件提供了標簽庫中類和JSP中對標簽引用的映射關系
它是一個配置文件
和web
xml是類似的
標簽處理類(Tag Handle Class)
標簽處理類是一個Java類
這個類繼承了TagSupport或者擴展了SimpleTag接口
通過這個類可以實現自定義JSP標簽的具體功能
二
自定義JSP標簽的格式
為了使到JSP容器能夠使用標簽庫中的自定義行為
必須滿足以下兩個條件
)從一個指定的標簽庫中識別出代表這種自定義行為的標簽
)找到實現這些自定義行為的具體類
第一個必需條件
找出一個自定義行為屬於那個標簽庫
是由標簽指令的前綴(Taglib Directive
s Prefix)屬性完成
所以在同一個頁面中使用相同前綴的元素都屬於這個標簽庫
每個標簽庫都定義了一個默認的前綴
用在標簽庫的文檔中或者頁面中插入自定義標簽
所以
你可以使用除了諸如jsp
jspx
java
servlet
sun
sunw(它們都是在JSP白皮書中指定的保留字)之類的前綴
uri屬性滿足了以上的第二個要求
為每個自定義行為找到對應的類
這個uri包含了一個字符串
容器用它來定位TLD文件
在TLD文件中可以找到標簽庫中所有標簽處理類的名稱
當web應用程序啟動時
容器從WEB
INF文件夾的目錄結構的META
INF搜索所有以
tld結尾的文件
也就是說它們會定位所有的TLD文件
對於每個TLD文件
容器會先獲取標簽庫的URI
然後為每個TLD文件和對應的URI創建映射關系
在JSP頁面中
我們僅需通過使用帶有URI屬性值的標簽庫指令來和具體的標簽庫匹配
三
自定義JSP標簽的處理過程
在JSP中引入標簽庫
在JSP中使用標簽庫標簽
Web容器根據第二個步驟中的prefix
獲得第一個步驟中聲明的taglib的uri屬性值
Web容器根據uri屬性在web
xml找到對應的元素
從元素中獲得對應的元素的值
Web容器根據元素的值從WEB
INF/目錄下找到對應的
tld文件
從
tld文件中找到與tagname對應的元素
湊元素中獲得對應的元素的值
Web容器根據元素的值創建相應的tag handle class的實例
Web容器調用這個實例的doStartTag/doEndTag方法完成相應的處理
四
創建和使用一個Tag Library的基本步驟
創建標簽的處理類(Tag Handler Class)
創建標簽庫描述文件(Tag Library Descrptor File)
在web
xml文件中配置元素
在JSP文件中引人標簽庫
五
TagSupport類簡介
處理標簽的類必須擴展javax
servlet
jsp
TagSupport
TagSupport類的主要屬性
A
parent屬性
代表嵌套了當前標簽的上層標簽的處理類
B
pageContex屬性
代表Web應用中的javax
servlet
jsp
PageContext對象
JSP容器在調用doStartTag或者doEndTag方法前
會先調用setPageContext和setParent方法
設置pageContext和parent
因此在標簽處理類中可以直接訪問pageContext變量
在TagSupport的構造方法中不能訪問pageContext成員變量
因為此時JSP容器還沒有調用setPageContext方法對pageContext進行初始化
六
TagSupport處理標簽的方法
TagSupport類提供了兩個處理標簽的方法
public int doStartTag() throws JspException
public int doEndTag() throws JspException
doStartTag:但JSP容器遇到自定義標簽的起始標志
就會調用doStartTag()方法
doStartTag()方法返回一個整數值
用來決定程序的後續流程
A
Tag
SKIP_BODY:表示?>…之間的內容被忽略
B
Tag
EVAL_BODY_INCLUDE:表示標簽之間的內容被正常執行
doEndTag:但JSP容器遇到自定義標簽的結束標志
就會調用doEndTag()方法
doEndTag()方法也返回一個整數值
用來決定程序後續流程
A
Tag
SKIP_PAGE:表示立刻停止執行網頁
網頁上未處理的靜態內容和JSP程序均被忽略任何已有的輸出內容立刻返回到客戶的浏覽器上
B
Tag_EVAL_PAGE:表示按照正常的流程繼續執行JSP網頁
七
用戶自定義的標簽屬性
如果在標簽中還包含了自定義的屬性
那麼在標簽處理類中應該將這個屬性作為成員變量
並且分別提供設置和讀取屬性的方法
八
創建標簽處理類的步驟
創建包含JSP網頁靜態文本的文件(即是要替換自定義JSP標簽的文本)
在Web應用啟動時裝載靜態文本
創建標簽處理類
九
如何創建包含JSP網頁靜態文本的文件
使用java
util
Properties類來存放要替換網頁中自定義JSP標簽的靜態文本
Properties類代表了一系列屬性的集合
其實例既可以被保存到流中
也可以從流中加載
這些文本以key/value的形式存放在WEB
INF目錄下
例如key=value
在屬性列表中這些key/value都是String類型的
十
Properties類的常用API
setProperty(String key
String value)
調用Hashtable類的put方法添加屬性
getProperty(String key)
獲取屬性列表中key對應的屬性值
load(InputStream in)
從輸入流對象InputStream中讀取屬性列表(Properties list)
store(OutputStream out
String coMMent)
使用適當的格式將屬性列表的屬性對寫入輸出流對象中
默認使用ISO
編碼格式
以行的方式處理輸入
屬性的key/value之間以
=
配對
以回車
換行分隔key/value配對
十一
ServletContext類的常用API
getContext(String uripath)
返回服務器中uripath所代表的ServletContext對象
getInitParameter(String name)
返回ServletConfig對象中name參數的值
getMineType(String file)
返回file參數代表的文件的MIME類型
getRequestDispatcher(String path)
返回path代表的RequestDispacher對象
getResourceAsStream(String path)
以輸入流的形式返回path對應的資源
在輸入留中對象可以為任意形式的數據
path參數必須以
/
開始且相對於Context Root
十二
如何使用ServletContxt讀取並保存屬性文件
創建java
util
Properties類對象
獲取ServletContext對象
將屬性文件以輸入流的形式讀入到某個輸入流對象中
將輸入流對象加載到Properties對象中
將Properties對象保存到ServletContext對象中
十三
如何在Web應用啟動時裝載靜態文本
創建繼承了HttpServlet類的子類
在web
xml中配置這Servlet時設置load
on
startup屬性
someclass
somepackage
SomeClass
在這個Servlet的init()方法中創建java
util
Properties類
獲取當前Web應用的ServletContext對象
將WEB
INF目錄下的屬性文件讀入到輸入流InputStream中
InputStream in = context
getResourceAsString(
WEB
INF/someproperties
properties
)
將輸入流加載到屬性對象中
ps
load(in)
將屬性對象保存到上
context
setAttribute(
attributeName
ps)
十四
如何創建標簽處理類
引入必需的資源
import javax
servlet
jsp
*; import javax
servlet
http
*; import java
util
*; import java
io
*;
繼承TagSupport類並覆蓋doStartTag()/doEndTag()方法
從ServletContext對象中獲取java
util
Properties對象
從Properties對象中獲取key對應的屬性值
對獲取的屬性進行相應的處理並輸出結果
十五
創建標簽庫描述文件(Tag Library Descriptor)
標簽庫描述文件
簡稱TLD
采用XML文件格式
定義了用戶的標簽庫
TLD文件中的元素可以分成
類
A
標簽庫元素
B
標簽元素
C
標簽屬性元素
標簽庫元素用來設定標簽庫的相關信息
它的常用屬性有
A
shortname:指定Tag Library默認的前綴名(prefix)
B
uri:設定Tag Library的惟一訪問表示符
標簽元素用來定義一個標簽
它的常見屬性有
A
name:設定Tag的名字
B
tagclass:設定Tag的處理類
C
bodycontent:設定標簽的主體(body)內容
)empty:表示標簽中沒有body;
)JSP:表示標簽的body中可以加入JSP程序代碼
)tagdependent:表示標簽中的內容由標簽自己去處理
標簽屬性元素用來定義標簽的屬性
它的常見屬性有
A
name:屬性名稱
B
required:屬性是否必需的
默認為false;
C
rtexprvalue:屬性值是否可以為request
time表達式
也就是類似於< %=…% >的表達式
十六
在Web應用中使用標簽
如果Web應用中用到了自定義JSP標簽
則必須在web
xml文件中加入元素
它用於聲明所引用的標簽所在的標簽庫
/sometaglib
/WEB
INF/someTLD
tld
設定Tag Library的惟一標示符
在Web應用中將根據它來引用Tag Libray;
指定和Tag Library對應的TLD文件的位置
在JSP文件中需要加入
prefix表示在JSP網頁中引用這個標簽庫的標簽時的前綴
uri用來指定Tag Library的標識符
它必須和web
xml中的屬性保持一致
From:http://tw.wingwit.com/Article/program/Java/hx/201311/25941.html