熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

詳細講解JSP自定義標簽

2013-11-23 18:53:31  來源: Java核心技術 
    一基本概念
   
    標簽(Tag)
   
    標簽是一種XML元素通過標簽可以使JSP網頁變得簡潔並且易於維護還可以方便地實現同一個JSP文件支持多種語言版本由於標簽是XML元素所以它的名稱和屬性都是大小寫敏感的
   
    標簽庫(Tag library)
   
    由一系列功能相似邏輯上互相聯系的標簽構成的集合稱為標簽庫
   
    標簽庫描述文件(Tag Library Descriptor)
   
    標簽庫描述文件是一個XML文件這個文件提供了標簽庫中類和JSP中對標簽引用的映射關系它是一個配置文件和webxml是類似的
   
    標簽處理類(Tag Handle Class)
   
    標簽處理類是一個Java類這個類繼承了TagSupport或者擴展了SimpleTag接口通過這個類可以實現自定義JSP標簽的具體功能
   
    二自定義JSP標簽的格式
   
    為了使到JSP容器能夠使用標簽庫中的自定義行為必須滿足以下兩個條件
   
    )從一個指定的標簽庫中識別出代表這種自定義行為的標簽
   
    )找到實現這些自定義行為的具體類
   
    第一個必需條件找出一個自定義行為屬於那個標簽庫是由標簽指令的前綴(Taglib Directives Prefix)屬性完成所以在同一個頁面中使用相同前綴的元素都屬於這個標簽庫每個標簽庫都定義了一個默認的前綴用在標簽庫的文檔中或者頁面中插入自定義標簽所以你可以使用除了諸如jspjspxjavaservletsunsunw(它們都是在JSP白皮書中指定的保留字)之類的前綴
   
    uri屬性滿足了以上的第二個要求為每個自定義行為找到對應的類這個uri包含了一個字符串容器用它來定位TLD文件在TLD文件中可以找到標簽庫中所有標簽處理類的名稱
   
    當web應用程序啟動時容器從WEBINF文件夾的目錄結構的METAINF搜索所有以tld結尾的文件也就是說它們會定位所有的TLD文件對於每個TLD文件容器會先獲取標簽庫的URI然後為每個TLD文件和對應的URI創建映射關系
   
    在JSP頁面中我們僅需通過使用帶有URI屬性值的標簽庫指令來和具體的標簽庫匹配
   
    三自定義JSP標簽的處理過程
   
    在JSP中引入標簽庫
   
    在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標簽的靜態文本
   
    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讀取並保存屬性文件
   
    創建javautilProperties類對象
   
    獲取ServletContext對象
   
    將屬性文件以輸入流的形式讀入到某個輸入流對象中
   
    將輸入流對象加載到Properties對象中
   
    將Properties對象保存到ServletContext對象中
   
    十三如何在Web應用啟動時裝載靜態文本
   
    創建繼承了HttpServlet類的子類在webxml中配置這Servlet時設置loadonstartup屬性
   
    someclass
   
    somepackageSomeClass
   
    在這個Servlet的init()方法中創建javautilProperties類
   
    獲取當前Web應用的ServletContext對象
   
    將WEBINF目錄下的屬性文件讀入到輸入流InputStream中
   
    InputStream in = contextgetResourceAsString(WEBINF/somepropertiesproperties
   
    將輸入流加載到屬性對象中
   
    psload(in)
   
    將屬性對象保存到上
   
    contextsetAttribute(attributeNameps)
   
    十四如何創建標簽處理類
   
    引入必需的資源
   
    import javaxservletjsp*; import javaxservlethttp*; import javautil*; import javaio*;
   
    繼承TagSupport類並覆蓋doStartTag()/doEndTag()方法
   
    從ServletContext對象中獲取javautilProperties對象
   
    從Properties對象中獲取key對應的屬性值
   
    對獲取的屬性進行相應的處理並輸出結果
   
    十五創建標簽庫描述文件(Tag Library Descriptor)
   
    標簽庫描述文件簡稱TLD采用XML文件格式定義了用戶的標簽庫TLD文件中的元素可以分成
   
    A標簽庫元素
   
    B標簽元素
   
    C標簽屬性元素
   
    標簽庫元素用來設定標簽庫的相關信息它的常用屬性有
   
    Ashortname:指定Tag Library默認的前綴名(prefix)
   
    Buri:設定Tag Library的惟一訪問表示符
   
    標簽元素用來定義一個標簽它的常見屬性有
   
    Aname:設定Tag的名字
   
    Btagclass:設定Tag的處理類
   
    Cbodycontent:設定標簽的主體(body)內容
   
    )empty:表示標簽中沒有body;
   
    )JSP:表示標簽的body中可以加入JSP程序代碼
   
    )tagdependent:表示標簽中的內容由標簽自己去處理
   
    標簽屬性元素用來定義標簽的屬性它的常見屬性有
   
    Aname:屬性名稱
   
    Brequired:屬性是否必需的默認為false;
   
    Crtexprvalue:屬性值是否可以為requesttime表達式也就是類似於< %=…% >的表達式
   
    十六在Web應用中使用標簽
   
    如果Web應用中用到了自定義JSP標簽則必須在webxml文件中加入元素它用於聲明所引用的標簽所在的標簽庫
   
    /sometaglib
   
    /WEBINF/someTLDtld
   
    設定Tag Library的惟一標示符在Web應用中將根據它來引用Tag Libray;
   
    指定和Tag Library對應的TLD文件的位置
   
    在JSP文件中需要加入
   
    prefix表示在JSP網頁中引用這個標簽庫的標簽時的前綴uri用來指定Tag Library的標識符它必須和webxml中的屬性保持一致


From:http://tw.wingwit.com/Article/program/Java/hx/201311/25941.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.