一基本概念
標簽(Tag):
標簽是一種XML元素通過標簽可以使JSP網頁變得簡潔並且易於維護還可以方便地實現同一個JSP文件支持多種語言版本由於標簽是XML元素所以它的名稱和屬性都是大小寫敏感的
標簽庫(Tag library):
由一系列功能相似邏輯上互相聯系的標簽構成的集合稱為標簽庫
標簽庫描述文件(Tag Library Descriptor):
標簽庫描述文件是一個XML文件這個文件提供了標簽庫中類和JSP中對標簽引用的映射關系它是一個配置文件和webxml是類似的
標簽處理類(Tag Handle Class):
標簽處理類是一個Java類這個類繼承了TagSupport或者擴展了SimpleTag接口通過這個類可以實現自定義JSP標簽的具體功能
二自定義JSP標簽的格式
<% @ taglib prefix=someprefix uri=/sometaglib %>
為了使到JSP容器能夠使用標簽庫中的自定義行為必須滿足以下兩個條件
)從一個指定的標簽庫中識別出代表這種自定義行為的標簽
)找到實現這些自定義行為的具體類
第一個必需條件-找出一個自定義行為屬於那個標簽庫-是由標簽指令的前綴(Taglib Directives Prefix)屬性完成所以在同一個頁面中使用相同前綴的元素都屬於這個標簽庫每個標簽庫都定義了一個默認的前綴用在標簽庫的文檔中或者頁面中插入自定義標簽所以你可以使用除了諸如jspjspxjavaservletsunsunw(它們都是在JSP白皮書中指定的保留字)之類的前綴
uri屬性滿足了以上的第二個要求為每個自定義行為找到對應的類這個uri包含了一個字符串容器用它來定位TLD文件在TLD文件中可以找到標簽庫中所有標簽處理類的名稱
當web應用程序啟動時容器從WEBINF文件夾的目錄結構的METAINF搜索所有以tld結尾的文件也就是說它們會定位所有的TLD文件對於每個TLD文件容器會先獲取標簽庫的URI然後為每個TLD文件和對應的URI創建映射關系
在JSP頁面中我們僅需通過使用帶有URI屬性值的標簽庫指令來和具體的標簽庫匹配
三自定義JSP標簽的處理過程
.在JSP中引入標簽庫
<% @ taglib prefix=taglibprefix uri=tagliburi %>
.在JSP中使用標簽庫標簽
.Web容器根據第二個步驟中的prefix獲得第一個步驟中聲明的taglib的uri屬性值
.Web容器根據uri屬性在webxml找到對應的元素 .從元素中獲得對應的元素的值 .Web容器根據元素的值從WEBINF/目錄下找到對應的tld文件 .從tld文件中找到與tagname對應的元素 .湊元素中獲得對應的元素的值 .Web容器根據元素的值創建相應的tag handle class的實例 Web容器調用這個實例的doStartTag/doEndTag方法完成相應的處理
四創建和使用一個Tag Library的基本步驟
創建標簽的處理類(Tag Handler Class)
創建標簽庫描述文件(Tag Library Descrptor File)
在webxml文件中配置元素 在JSP文件中引人標簽庫
五TagSupport類簡介
處理標簽的類必須擴展javaxservletjspTagSupport
TagSupport類的主要屬性
Aparent屬性代表嵌套了當前標簽的上層標簽的處理類
BpageContex屬性代表Web應用中的javaxservletjspPageContext對象
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()方法返回一個整數值用來決定程序的後續流程
ATagSKIP_BODY表示?>…之間的內容被忽略
BTagEVAL_BODY_INCLUDE表示標簽之間的內容被正常執行
doEndTag但JSP容器遇到自定義標簽的結束標志就會調用doEndTag()方法doEndTag()方法也返回一個整數值用來決定程序後續流程
ATagSKIP_PAGE表示立刻停止執行網頁網頁上未處理的靜態內容和JSP程序均被忽略任何已有的輸出內容立刻返回到客戶的浏覽器上
BTag_EVAL_PAGE表示按照正常的流程繼續執行JSP網頁
七用戶自定義的標簽屬性
如果在標簽中還包含了自定義的屬性那麼在標簽處理類中應該將這個屬性作為成員變量並且分別提供設置和讀取屬性的方法
八創建標簽處理類的步驟
創建包含JSP網頁靜態文本的文件(即是要替換自定義JSP標簽的文本)
在Web應用啟動時裝載靜態文本
創建標簽處理類
九如何創建包含JSP網頁靜態文本的文件
使用javautilProperties類來存放要替換網頁中自定義JSP標簽的靜態文本 (lian素材)
Properties類代表了一系列屬性的集合其實例既可以被保存到流中也可以從流中加載這些文本以key/value的形式存放在WEBINF目錄下例如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 outString 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讀取並保存屬性文件(wwwliancom)
創建javautilProperties類對象
獲取ServletContext對象
將屬性文件以輸入流的形式讀入到某個輸入流對象中
將輸入流對象加載到Properties對象中
將Properties對象保存到ServletContext對象中
From:http://tw.wingwit.com/Article/program/Java/JSP/201311/20054.html