您現在的位置是:電腦技術吧?>? 故障問題 ??>??自定義標簽在哪,自定義標簽是什么意思??>??正文詳情

自定義標簽在哪,自定義標簽是什么意思

軍麗姿2019-12-19 15:22:59 人圍觀
簡介自定義個性標簽大全一般來說,要開發JSP自定義標記,我們需要參考以下兩個包:import javax。Servlet。JSP。標簽文本。*. 首先,我們需要對開發自定義標記所涉及qq自定義標簽高冷

一般情況下開發jsp自定義標簽需要引用以下兩個包import javax.servlet.jsp.*;import javax.servlet.jsp.tagext.*;首先我們需要大致了解開發自定義標簽所涉及到的接口與類的層次結構(其中SimpleTag接口與SimpleTagSupport類是JSP2.0中新引入的)。

目標1:自定義一個用表格顯示用戶信息的簡單標簽效果圖:

在jsp頁面使用此自定義標簽:假設我們有一個UserInfo的javabean,那么在JSP頁面使用此標簽只需調用此標簽即可

    !--創建需要展現UserInfo的實例(用于測試數據)--% UserInfouser=newUserInfo(); user.setUserName(Xuwei); user.setAge(33); user.setEmail([email protected]); pageContext.setAttribute(userinfo,user); % !--給標簽設置user屬性綁定要展現的UserInfo對象--cc:showUserInfouser=${pageScope.userinfo}/
開發步驟:簡單標簽的開發我們只要實現Tag接口即可,為了簡單起見可以直接繼承實現了此接口的TagSupport類1 創建自定義標簽類
    publicclassUserInfoTagextendsTagSupport{ privateUserInfouser; @Override publicintdoStartTag()throwsJspException{ try{ JspWriterout=this.pageContext.getOut(); if(user==null){ out.println(NoUserInfoFound...);
nbsp;returnSKIP_BODY; } out.println(tablewidth='500px'border='1'align='center'); out.println(tr); out.println(tdwidth='20%'Username:/td); out.println(td user.getUserName() /td); out.println(/tr); out.println(tr); out.println(tdAge:/td); out.println(td user.getAge() /td); out.println(/tr); out.println(tr); out.println(tdEmail:/td); out.println(td user.getEmail() /td); out.println(/tr); out.println(/table); }catch(Exceptione){ thrownewJspException(e.getMessage()); } returnSKIP_BODY; } @Override publicintdoEndTag()throwsJspException{ nbsp;returnEVAL_PAGE; } @Override publicvoidrelease(){ super.release(); this.user=null; } //getterandsetters publicUserInfogetUser(){ returnuser; } publicvoidsetUser(UserInfouser){ this.user=user; } } 2 在Web-Inf創建標簽庫描述文件.tdl(Tag Library Description)
    ?xmlversion=1.0encoding=UTF-8?taglibversion=2.0xmlns=http://java.sun.com/xml/ns/j2eexmlns:xsi=http://www.w3.org/2001/XMLSchema-instancexsi:schemaLocation=http://java.sun.com/xml/ns/j2eeweb-jsptaglibrary_2_0.xsdtlib-version1.0/tlib-versionjsp-version2.0/jsp-versionshort-namecc/short-nameuri/mytaglib/uritagnameshowUserInfo/nametag-classcom.mytags.UserInfoTag/tag-classbody-contentempty/body-contentattributenameuser/namerequiredfalse/requiredrtexprvaluetrue/rtexprvalue/attribute/tag/taglib
3 配置web.xml
    jsp-configtaglibtaglib-uri/mytaglib/taglib-urin
bsp; taglib-location/WEB-INF/mytaglib.tld/taglib-location /taglib /jsp-config4 在需要使用此標簽的jsp頁面頭部引入
    %@tagliburi=/mytaglibprefix=cc%
5 使用(參照上面的使用步驟)此致,一個簡單的JSP標簽開發完成標簽類說明:

我們創建的UserInfoTag類繼承了TagSupport類,而它又實現了Tag接口,Tag接口的生命周期由其所在的容器控制,如下圖:setPageContext() 將所在jsp頁面的pageContext注入進來,目的是為了在后面的方法中可以訪問到jsp頁面對象的pageContext屬性setParent() 設置此標簽的父標簽setAttribute() 將標簽中的屬性注入到此class的屬性,不需要自己實現但要提供屬性的get與set方法doStartTag() 在開始標簽屬性設置后調用,如果返回SKIP_BODY則忽略標簽之中的內容,如果返回EVAL_BODY_INCLUDE則將標簽體的內容進行輸出doEndTag() 在結束標簽之前調用,返回SKIP_PAGE跳過整個jsp頁面后面的輸出,返回EVAL_PAGE執行頁面余下部分release() 生命周期結束時調用特別說明:在tomcat4.1之后的版本中默認開啟了標簽緩沖池(websphere和weblogic并不會這么做),所以執行完標簽后并不會執行release()方法(_jspDestroy()時才釋放),也就是說同一個jsp頁面自定義標簽不管使用多少次只會存在一個實例,但也并不是每一個標簽都會為其創建一個緩沖池,要根據參數來判斷,例如:

    cc:UserInfoTaguser=/cc:UserInfoTag/
上面例子中由于參數不同就會創建兩個標簽緩沖池。

這個問題可以通過設定tomcat的配置文件加以解決:在%tomcat%confweb.xml加入enablePooling參數,并設置為false(不緩存自定義標簽)。

    init-paramparam-nameenablePooling/param-nameparam-valuefalse/param-value/init-param
清空%tomcat%conf目錄TagSupport類已經為我們實現并擴展了一些方法(比如在上述方法中我們可以直接使用pageContext對象,調用父標簽getParent()等),所以一般情況下我們只需重寫doStartTag(),doEndTag() 即可TLD文件說明:!--版本號--tlib-version1.0/tlib-versionjsp-version2.0/jsp-versionshort-namecc/short-nametag!指定標簽名 --nameshowUserInfo/name!指定標簽類文件的全路徑 --tag-classcom.mytags.UserInfoTag/tag-class!--如果不需要標簽體則設置empty,反之設定jsp --body-contentempty/body-content!設定屬性(如果有的話) --attribute!指定標簽名 --nameuser/name!是否是必須,如果非必須沒設置則為空 --requiredfalse/requiredrtexprvaluetrue/rtexprvalue!是否可在屬性中使用表達式 --/attribute/tagWeb.xml文件說明:jsp-configtaglib!--標簽庫的uri路徑即jsp頭文件中聲明%@ taglib uri=/mytaglib prefix=cc%的uri--taglib-uri/mytaglib/taglib-uri!tld文件所在的位置--taglib-location/WEB-INF/mytaglib.tld/taglib-location/taglib/jsp-config目標2:自定義一個類似于Asp.Net中的Reapter控件的標簽效果圖:

在jsp頁面使用此自定義標簽:

    !--創建需要展現javabean(UserInfo)集合的實例(用于測試數據)--% ListUserInfousers=newArrayListUserInfo(); users.add(newUserInfo(Zhangsan,12,[email protected])); users.add(newUserInfo(Lisi,22,[email protected])); users.add(newUserInfo(Wangwu,33,[email protected])); pageContext.setAttribute(users,users); % !--給標簽綁定數據源--tablewidth='500px'border='1'align='center'trtdwidth='20%'UserName/tdtdwidth='20%'Age/tdtdEmail/td/trcc:repeatervar=itemitems=${pageScope.users}trtd${item.userName}/tdtd${item.age}/tdtd${item.email}/td/tr/cc:repeater/table
;開發步驟:要完成此控件我們需要實現一個迭代接口,即IterationTag,由于TagSupport同樣實現了此接口,所以我們繼承此類1 創建自定義標簽類
    publicclassRepeaterextendsTagSupport{ privateCollectionitems; privateIteratorit; privateStringvar; @Override publicintdoStartTag()throwsJspException{ if(items==null||items.size()==0)returnSKIP_BODY; it=items.iterator(); if(it.hasNext()){ pageContext.setAttribute(var,it.next()); } returnEVAL_BODY_INCLUDE; } @Override publicintdoAfterBody()throwsJspException{ if(it.hasNext()){ pageContext.setAttribute(var,it.next()); returnEVAL_BODY_AGAIN; } returnSKIP_BODY; } @Override publicintdoEndTag()throwsJspException{ returnEVAL_PAGE; } publicvoidsetItems(Collectionitems){ this.items=items; } publicvoidsetVar(Stringvar){
nbsp;this.var=var; } }2在Web-Inf創建標簽庫描述文件.tdl(Tag Library Description)由于目標1種已經創建了此文件,我們只需增加此標簽的配置即可
    tagnamerepeater/nametag-classcom.mytags.Repeater/tag-classbody-contentjsp/body-contentattributenameitems/namerequiredfalse/requiredrtexprvaluetrue/rtexprvalue/attributeattributenamevar/namerequiredtrue/requiredrtexprvaluetrue/rtexprvalue/attribute/tag
3 配置web.xml (目標1中已完成,無需修改)4 在需要使用此標簽的jsp頁面頭部引入
    %@tagliburi=/mytaglibprefix=cc%
5 使用(參照上面的使用步驟)標簽類說明:我們用到了迭代接口,以下是容器處理此接口的流程

作為目標1中的補充: 在doAfterBody()如果返回值是EVAL_BODY_AGAIN那么將重新執行此方法目標3:使用BodyTagSupport此目標并不會使用實際例子進行顯示,主要是說明為什么,什么情況下需要使用到BodyTag接口或者BodyTagSupport類?如果我們需要在. 之間的標簽體的頭部和尾部加上一些標記或者是其他處理,一般的處理方法是在doStartTag和doEndTag方法中進行, 但是如果是個迭代標簽,標簽體的每段內容在循環輸出時每次都需要在頭部和尾部加上一些標記,我們使用BodyTagSupport就很方便了,此接口在doStartTag()方法返回值多了一個EVAL_BODY_BUFFERED,它將對主體進行計算,并輸出到緩沖區(注:此處是緩沖區并非直接輸出到客戶端,需要我們手動(this.bodyContent.getEnclosingWriter().write(this.bodyContent.getString());)進行輸出客戶端的調用,否則主體內容不會進行顯示)標簽類說明:關于BodyTagSupport接口的說明

目標4:自定義的函數庫1 創建函數庫類

    publicclassMyFunctions{ publicstaticStringformatMyName(Stringname){ returnyournameis name; } publicstaticintadd(inta,intb){ returna b; } }
2 在TLD文件中配置 (引用于目標1中的tld文件)
    functionnameformatMyName/namefunction-classcom.taglib.MyFunctions/function-classfunction-signaturejava.lang.StringformatMyName(java.lang.String)/function-signature/function functionnameadd/namefunction-classcom.taglib.MyFunctions/function-classfunction-signaturejava.lang.Stringadd(int,int)/function-signature/function
3 JSP中調用
    ${cc:formatMyName(wangfei)} ${cc:add(12,34)}

版權聲明:本文由 軍麗姿 整理編輯。

原標題:有趣的自定義標簽,qq自定義標簽有哪些

轉載注明出處:http://www.dn9ww09s.icu/fault/15564.html

文章評論

    共有條評論來說兩句吧...

    用戶名:

    驗證碼:

作者推薦

  • 安全隱患措施有哪些,身邊的安全隱患及措施

    安全隱患措施有哪些,身邊的安全隱患及措施 相關圖片避免安全隱患隨著Internet的發展,web技術日新月異。ASP(active server pages)作為繼通用網關接口(CGI)之后的一種典型的服務器端Web設計技我身邊的安全隱患及改正措施...

  • 安裝軟件說端口號被占用解決方法,解決端口占用

    安裝軟件說端口號被占用解決方法,解決端口占用 相關圖片8080端口號被占用本文主要介紹Android開發中端口號占用問題的解決方案。本文給出了一種簡單實用的方法來解決這個煩人的問題。你可以參考Android開發中的端口號占用問題,這個查看8...

  • navicat怎么連接mysql,navicat連接不上mysql

    navicat怎么連接mysql,navicat連接不上mysql 相關圖片mysql navicat最新版本的Navicat for MySQL有自己的注冊代碼。它已經被綠化了。您可以通過將其解壓縮到任何目錄來運行它。Navicat premium是一個多連接navicat連接mysql...

  • 如何建立空數據庫,怎么創建空數據庫

    如何建立空數據庫,怎么創建空數據庫 相關圖片建立空數據庫的快捷鍵現在我們知道了在構建數據庫之前應該注意的問題,讓我們從最基本的新空數據庫開始了解access數據庫的結構。在access 2000中,單擊access窗口左上角怎么新建空數據...

  • 如何建立空數據庫,怎么創建空數據庫

    如何建立空數據庫,怎么創建空數據庫 相關圖片建立空數據庫的快捷鍵怎么新建空數據庫...

  • html字符串轉化為,讓字符串轉成html

    html字符串轉化為,讓字符串轉成html 相關圖片js解析html字符串本文主要介紹了JavaScript檢測字符串中是否包含HTML標記的實現方法。本文直接給出了實現代碼。對于您的朋友,請參考下面的函數代碼:/**HTML標記是否js字符串轉html標簽...

  • 數據庫分區表有必要嗎,數據庫分區表類型

    數據庫分區表有必要嗎,數據庫分區表類型 相關圖片sql數據庫分區Oracle數據庫如何查看分區表信息?我想知道你是否總結了這些知識。接下來,我們創建兩個表test和GPRS?細胞體積?努力做實驗。腳本如下:create tadb2分區表創建...

  • 自定義狀態欄怎么設置,自定義狀態欄不見了

    自定義狀態欄怎么設置,自定義狀態欄不見了 相關圖片華為自定義狀態欄公司的開發項目需要在狀態欄上增加程序下載的進度條。對于之前編寫的程序,由于自定義狀態欄的邊框和子視圖的邊框和變換都是根據iPad的方向設置的,所以有些...

  • 復雜的事情簡單做例子,簡單生活的例子

    復雜的事情簡單做例子,簡單生活的例子 相關圖片堅持的例子一個比較簡單的asp.net文件上傳程序代碼,可以上傳rar、zip、TXT、JPG、GIF、DOC等格式的文件。您可以直接復制代碼并將其保存為ASPX文件進行偽代碼的簡單例子...

  • aspjs格式化,asp格式化2百位

    aspjs格式化,asp格式化2百位 相關圖片asp文件轉換格式本文主要介紹了asp.net頁面中時間格式的例子。您可以參考asp.net頁面以Eval格式顯示時間,格式代碼如下:table trtd style=widthasp時間格式...

熱評文章

  • 用戶IP地址,IP地址范圍

    用戶IP地址,IP地址范圍 相關圖片IP地址的分類在asp.net環境中獲取用戶IP的公共類。在許多情況下,我們需要記錄訪問者的IP地址。此類可以使用system.web.httpcontext.currentIP地址格式...

  • hello the world,helloworld是什么

    hello the world,helloworld是什么 相關圖片hello world是什么意思本文主要介紹react JS的HelloWorld編程及其相關知識。React是一個由Facebook開發的開源JS框架。它的受歡迎程度目前正在飆升。您可以參考hello world是什么意...

  • ios信號量,iOS socket

    ios信號量,iOS socket 相關圖片基于信號量同步的雙緩沖區為了解決這個問題,我提出了兩個解決方案:第一個是在執行操作之前確定操作是否已經初始化。如果尚未初始化,則使用數組隊列存儲操作參數和調用的方...

  • 機票查詢,數據庫查詢方法有哪些

    機票查詢,數據庫查詢方法有哪些 相關圖片如何提高數據庫查詢速度一。where子句中的連接順序:Oracle使用自下而上的順序來解析where子句。根據這一原理,表之間的連接必須在其他條件之前寫入,并且能夠過濾出最大記錄數的數...

  • 有特點的自我介紹,自我介紹特點

    有特點的自我介紹,自我介紹特點 相關圖片自我介紹優點不能在宏條件列中使用SQL表達式。一般來說,直接運行宏只是一個測試。在確保宏設計正確后,可以將宏附加到窗體、報表或控件以響應事件,或創建自定義菜單命令以運...

  • android添加菜單,菜單選擇切換android

    android添加菜單,菜單選擇切換android 相關圖片androidmenu菜單樣式本文介紹了Android的三個菜單。與您分享以供參考。具體分析如下:Android的菜單分為三種類型:選項菜單、上下文菜單和子菜單。一。選項菜單應用程序安卓上滑菜單...

  • 編輯啟動選項,電腦高級啟動選項

    編輯啟動選項,電腦高級啟動選項 相關圖片win10進入高級啟動模式大多數服務器管理員知道MySQL數據庫管理系統(RDBMS)是一個高度靈活的軟件塊,具有廣泛的啟動選項,可以用來修改相關的行為。然而,大多數人并不知道標準的...

  • java多線程編程注意事項,多線程注意事項

    java多線程編程注意事項,多線程注意事項 相關圖片java多線程編程培訓機構本文主要介紹了C 中MFC多線程編程注意事項的相關信息。您可以參考多線程編程中最簡單的方法,即使用afxbeginthread創建工作線程。看看這個函數的描述c多線程編...

  • php比較大小,php三個數比較大小

    php比較大小,php三個數比較大小 相關圖片php數組值比較大小本文給出了一個例子來說明PHP如何計算整個目錄的大小。與您分享以供參考。具體實現方法如下:?1234567891012131415161718192021222php字體大小...

  • 蓋格計數器,蓋革計數器原理

    蓋格計數器,蓋革計數器原理 相關圖片手持計數器下面介紹如何用數據庫實現簡單計數器。另存為計數。ASP<%set conn=服務器。創建對象(ADODB。連接)conn.open driver={Micros程序計數器...

關注微信

变脸官网查询