一、自定義標簽入門之無參數自定義標簽
1.開發自定義標簽類
當我們在JSP頁面使用一個簡單的標簽時,底層實際上由標簽處理類提供支持,從而可以使用簡單的標簽來封裝復雜的功能,從而使團隊更好地協作開發(能讓美工人員更好地參與JSP頁面的開發)。
自定義標簽類都必須繼承一個父類:javax.servlet.jsp.tagext.SimpleTagSupport,或者TagSupport除此之外,JSP自定義標簽類還有如下要求。
如果標簽類包含屬性,每個屬性都有對應的getter和setter方法。
重寫doTag()或者doStartTag()或doEndTag()方法方法,這個方法負責生成頁面內容。
首先介紹是不帶屬性的標簽以HelloWorld為例:
Java代碼如下:
public class HelloWorldTag extends TagSupport { private static final long serialVersionUID = -3382691015235241708L; @Override public int doEndTag() throws JspException { try { pageContext.getOut().write("Hello World !"); return super.doEndTag(); } catch (JspException e) { e.printStackTrace(); return 0; } catch (IOException e) { e.printStackTrace(); return 0; } } @Override public int doStartTag() { try { pageContext.getOut().write("Hello World"); return super.doStartTag(); } catch (JspException e) { e.printStackTrace(); return 0; } catch (IOException e) { e.printStackTrace(); return 0; } }}
注意:
問題1:tagsupport中的dostartTag和doEndTag這兩個方法有什么區別
doStartTag是在掃描到起始標簽時調用,doEndTag是在掃描到結束標簽是調用。
例如:<helloWorld> helloWorld</helloWorld>
則jsp引擎分析到<helloWorld> 時調用doStratTag, 分析到</helloWorld>時調用doEndTag
2、建立TLD文件
TLD是Tag Library Definition的縮寫,即標簽庫定義,文件的后綴是tld,每個TLD文件對應一個標簽庫,一個標簽庫中可包含多個標簽,TLD文件也稱為標簽庫定義文件。
標簽庫定義文件的根元素是taglib,它可以包含多個tag子元素,每個tag子元素都定義一個標簽。通常我們可以到Web容器下復制一個標簽庫定義文件,并在此基礎上進行修改即可。例如Tomcat6.0,在webapps/examples/WEB-INF/jsp2路徑下包含了一個jsp2-example-taglib.tld文件,這就是示范用的標簽庫定義文件。
將該文件復制到Web應用的WEB-INF/路徑,或WEB-INF的任意子路徑下,并對該文件進行簡單修改,修改后的helloworld.tld文件代碼如下:
<?xml version="1.0" encoding="UTF-8"?><taglib xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee web-jsptaglibrary_2_0.xsd" version="2.0"> <tlib-version>1.0</tlib-version> <short-name>myhelloworld</short-name> <!-- 定義該標簽庫的URI 必須添加但可以空--> <uri></uri> <!-- 定義第一個標簽 --> <tag> <!-- 定義標簽名 --> <name>helloWorld</name> <!-- 定義標簽處理類 --> <tag-class>org.lxh.taglib.HelloWorldTag</tag-class> <!-- 定義標簽體為空 --> <body-content>empty</body-content> </tag></taglib>
問題1: 為什么要用TagSupport與BodyTagSupport的區別主要是標簽處理類是否需要與標簽體交互,如果不需要交互的就用TagSupport,否則就用BodyTagSupport。
交互就是標簽處理類是否要讀取標簽體的內容和改變標簽體返回的內容。用TagSupport實現的標簽,都可以用BodyTagSupport來實現,因為BodyTagSupport繼承了TagSupport而不去實現IterationTag接口的,因為BodyTagSupport繼承了TagSupport類,并且該類已經實現了IterationTag接口并且實現了功能.
doStartTag()方法在標簽開始時執行,要記住每次都要對類進行初始化,避免上一次的遺留數據對操作造成影響。然后判斷是否有數據需要處理,如果有,則返回EVAL_BODY_INCLUDE開始處理標簽里的內容,如果沒有,返回 EVAL_PAGE跳過標簽內容執行標簽下面的內容。
doAfterBody()方法在每次處理完標簽內部內容后執行,判斷循環是否已經結束,如果可以繼續循環,返回EVAL_BODY_AGAIN用循環得到新的數據再次處理標簽內部內容,如果循環結束就返回EVAL_PAGE結束標簽。
二、自定義JSP標簽的處理過程:
1.在JSP中引入標簽庫:
2.在JSP中使用標簽庫標簽
3.Web容器根據第二個步驟中的prefix,獲得第一個步驟中聲明的taglib的uri屬性值
4.Web容器根據uri屬性在web.xml找到對應的元素
5.從元素中獲得對應的元素的值
6.Web容器根據元素的值從WEB-INF/目錄下找到對應的.tld文件
7.從.tld文件中找到與tagname對應的元素
8.湊元素中獲得對應的元素的值
9.Web容器根據元素的值創建相應的tag handle class的實例
10. Web容器調用這個實例的doStartTag/doEndTag方法完成相應的處理
三、創建和使用一個Tag Library的基本步驟:
1.創建標簽的處理類(Tag Handler Class)
2.創建標簽庫描述文件(Tag Library Descrptor File)
3.在web.xml文件中配置元素
4.在JSP文件中引人標簽庫
四、TagSupport類簡介:
1.處理標簽的類必須擴展javax.servlet.jsp.TagSupport.
2.TagSupport類的主要屬性:
A.parent屬性:代表嵌套了當前標簽的上層標簽的處理類
B.pageContex屬性:代表Web應用中的javax.servlet.jsp.PageContext對象
3.JSP容器在調用doStartTag或者doEndTag方法前,會先調用setPageContext和setParent方法,設置pageContext和parent。因此在標簽處理類中可以直接訪問pageContext變量
4.在TagSupport的構造方法中不能訪問pageContext成員變量,因為此時JSP容器還沒有調用setPageContext方法對pageContext進行初始化
五、TagSupport處理標簽的方法:
1.TagSupport類提供了兩個處理標簽的方法:
public int doStartTag() throws JspException
public int doEndTag() throws JspException
2.doStartTag:但JSP容器遇到自定義標簽的起始標志,就會調用doStartTag()方法,doStartTag()方法返回一個整數值,用來決定程序的后續流程。
A.Tag.SKIP_BODY:表示跳過了開始和結束標簽之間的代碼
B.Tag.EVAL_BODY_INCLUDE:表示標簽之間的內容被正常執行
C.Tag.EVAL_BODY_BUFFERED :對包含的內容進行解析
3.doEndTag:但JSP容器遇到自定義標簽的結束標志,就會調用doEndTag()方法。doEndTag()方法也返回一個整數值,用來決定程序后續流程。
A.Tag.SKIP_PAGE:表示立刻停止執行網頁,網頁上未處理的靜態內容和JSP程序均被忽略任何已有的輸出內容立刻返回到客戶的瀏覽器上。
B.Tag.EVAL_PAGE:表示按照正常的流程繼續執行JSP網頁
4.doAfterTag:遇到標簽體執行
A.Tag.EVAL_BODY_AGAIN;// 如果集合中還有對像,則循環執行標簽體,對標簽體循環處理,(存在于javax.servlet.jsp.tagext.IterationTag接口中)
B.Tag.SKIP_BODY
六、創建含有字段的標簽:
1.創建標簽處理器類FieldTag
package com.able.tag; import java.io.IOException; import javax.servlet.jsp.JspException;import javax.servlet.jsp.JspWriter;import javax.servlet.jsp.tagext.TagSupport; public class FieldTag extends TagSupport { private static final long serialVersionUID = 1540529069962423355L; private String field; private Integer count; @Override public int doEndTag() throws JspException { try { JspWriter out = pageContext.getOut(); out.print(field); out.print(count); } catch (IOException e) { e.printStackTrace(); } return super.doEndTag(); } public String getField() { return field; } public void setField(String field) { this.field = field; } public Integer getCount() { return count; } public void setCount(Integer count) { this.count = count; } }
2.在tag.tld文件中天劍tag標簽
<tag> <!-- 定義標簽名 --> <name>field</name> <!-- 定義標簽處理類 --> <tag-class>com.able.tag.FieldTag</tag-class> <!-- 定義標簽體為空 --> <body-content>empty</body-content> <attribute> <name>field</name> <required>true</required> <!-- 是否必亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb 亚洲香蕉成人av网站在线观看| 国产在线观看精品一区二区三区| 欧美性受xxx| 亚洲国产精品美女| 久久欧美在线电影| 97在线免费观看| 国产亚洲精品美女久久久| 欧美视频在线观看免费网址| 97国产在线视频| 精品亚洲一区二区三区在线观看| 欧美一区二区大胆人体摄影专业网站| 国产91精品不卡视频| 欧洲午夜精品久久久| 久久99热这里只有精品国产| 亚洲精品一区在线观看香蕉| 亚洲小视频在线观看| 亚洲第一网站男人都懂| 亚洲国产中文字幕在线观看| 亚洲欧美成人精品| 九九视频直播综合网| 亚洲欧洲在线观看| 在线国产精品视频| 亚洲美女av在线播放| 国产精品稀缺呦系列在线| 国产精品成久久久久三级| 日韩精品福利网站| 不卡在线观看电视剧完整版| 国内精品400部情侣激情| 欧美成人精品在线播放| 欧美夜福利tv在线| 亚洲国产一区自拍| 日韩av中文字幕在线免费观看| 91精品国产91| 亚洲精品久久7777777| 欧美亚洲国产成人精品| 国产精品中文字幕在线观看| 色综合久久悠悠| 草民午夜欧美限制a级福利片| 国产精品毛片a∨一区二区三区|国| 欧美刺激性大交免费视频| 欧美大人香蕉在线| 亚洲第五色综合网| 欧美性xxxxx极品娇小| 亚洲第一区中文99精品| 美日韩精品免费视频| 精品亚洲va在线va天堂资源站| 欧美大片免费观看在线观看网站推荐| 国产亚洲成精品久久| 日韩精品日韩在线观看| 国产欧美日韩丝袜精品一区| 欧美高清在线视频观看不卡| 精品av在线播放| 欧美性极品xxxx娇小| 性欧美亚洲xxxx乳在线观看| 欧美美女操人视频| 69视频在线免费观看| 久久精品人人做人人爽| 在线观看日韩视频| 久久九九全国免费精品观看| 久久国产天堂福利天堂| 久久国产精品视频| 日本sm极度另类视频| 日韩暖暖在线视频| 久久电影一区二区| 亚洲天堂av在线免费观看| 欧美在线视频导航| 性欧美办公室18xxxxhd| 久久福利视频导航| 人妖精品videosex性欧美| 国产精品久久久久久久久久ktv| 尤物九九久久国产精品的特点| 午夜精品99久久免费| 国产精自产拍久久久久久| 亚洲精品国精品久久99热| 欧美日韩一区二区在线| 色婷婷亚洲mv天堂mv在影片| 日韩欧美在线国产| 欧美第一页在线| 国产精品成人播放| 亚洲激情视频在线播放| 91中文字幕在线观看| 亚洲精品成人久久电影| 久久99亚洲热视| 国产婷婷色综合av蜜臀av| 日韩免费在线电影| 欧美激情精品在线| 亚洲欧美日韩一区二区在线| 韩国精品美女www爽爽爽视频| 97在线看福利| 成人淫片在线看| 成人在线播放av| 午夜精品久久久久久久男人的天堂| 一本大道香蕉久在线播放29| 亚洲自拍偷拍第一页| 秋霞午夜一区二区| 91精品国产乱码久久久久久久久| 久久久久久午夜| 日韩av电影免费观看高清| 亚洲第一福利视频| 国产精品久久一区主播| 亚洲图片欧美日产| 亚洲精品国产综合区久久久久久久| 国产精品丝袜一区二区三区| 精品无人区太爽高潮在线播放| 日韩一中文字幕| 8050国产精品久久久久久| 91九色视频导航| 91视频国产精品| 日韩av在线网站| 欧美日韩ab片| 中文综合在线观看| 欧美激情一区二区三区高清视频| www.日韩免费| 国产精品久久中文| 久久久久久久久久久免费精品| 国产一区二区三区在线| 国产一区二中文字幕在线看| 国产成人精品久久二区二区| 日韩一区av在线| 日韩毛片在线看| 国产精品久久999| 亚洲片国产一区一级在线观看| 成人精品视频久久久久| 一区二区三区在线播放欧美| 国产精品三级久久久久久电影| 日韩在线免费视频| 久久99国产综合精品女同| 欧美猛交ⅹxxx乱大交视频| 精品无人区乱码1区2区3区在线| 国产91av在线| 4438全国亚洲精品在线观看视频| 精品国产鲁一鲁一区二区张丽| 欧美性高跟鞋xxxxhd| 国产午夜精品视频| 北条麻妃久久精品| 久久久久久久久久久国产| 久久精品国产久精国产思思| 亚洲成在人线av| 日韩网站免费观看| 亚洲在线观看视频| 欧美中文字幕第一页| 国产成人在线一区二区| 国产成人自拍视频在线观看| 欧美成人精品一区二区三区| 日韩欧美主播在线| 狠狠躁夜夜躁人人爽天天天天97| 国产午夜精品一区理论片飘花| 精品国偷自产在线视频| 91性高湖久久久久久久久_久久99| 国产一区二区三区免费视频| 97视频色精品| 日韩欧美aⅴ综合网站发布| 136fldh精品导航福利| 欧美成人精品一区二区| 狠狠综合久久av一区二区小说| 中文字幕久热精品视频在线| 国产精品高潮在线| 91免费的视频在线播放| 91精品视频网站| 国产精品99久久久久久www| 亚洲最大av在线| 日韩在线欧美在线国产在线| 中文字幕亚洲无线码在线一区| 在线视频精品一|