jstl自定義標(biāo)簽庫_第1頁
jstl自定義標(biāo)簽庫_第2頁
jstl自定義標(biāo)簽庫_第3頁
jstl自定義標(biāo)簽庫_第4頁
jstl自定義標(biāo)簽庫_第5頁
已閱讀5頁,還剩14頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

自定義標(biāo)簽庫筆記JSP規(guī)范的1.1版中增加了自定義標(biāo)簽庫。自定義標(biāo)簽庫是一種非常優(yōu)秀的組技術(shù)。通過使用自定義標(biāo)簽庫,可以在簡單的標(biāo)簽中封裝復(fù)雜的功能。實現(xiàn)自定義標(biāo)簽按如下步驟進(jìn)行:開發(fā)自定義標(biāo)簽處理類:建立一個*.t1d文件,每個*.t1d文件對應(yīng)一個標(biāo)簽庫,每個標(biāo)簽庫對應(yīng)多個標(biāo)簽:⑶在web.xm1文件中增加自定義標(biāo)簽的定義:(4)在JSP文件中使用自定義標(biāo)簽。一、開發(fā)自定義標(biāo)簽類使用標(biāo)簽類,可以使用簡單的標(biāo)簽來封裝復(fù)雜的功能,從而使團(tuán)隊更好地協(xié)作開發(fā)(能讓美i人員更好地參與JSP頁面的開發(fā))。自定義標(biāo)簽類都必須繼承一個父類:java.Servlet.jsp.tagext.TagSupport。除此之外,自定義標(biāo)簽類還有如下要求。?如果標(biāo)簽類包含屬性,每個屬性都有對應(yīng)的getter和setter方法。?重寫doStartTagO或doEndTagO方法,這兩個方法生成頁面內(nèi)容。?如果需要在銷毀標(biāo)簽之前完成資源回收,則重寫re1easeO方法。下面提供了一個最簡單的標(biāo)簽代碼://標(biāo)簽處理類,繼承TagSupport父類importjava.io.IOException;importjavax.servlet.jsp.JspTagException;importjavax.servlet.jsp.tagext.TagSupport;publicclassHelloWorldTagextendsTagSupport(//重寫doEndTagO法,該方法在標(biāo)簽結(jié)束生成頁面內(nèi)容publicintdoEndTag()throwsJspTagException(try(//獲取頁面輸出流,并輸出字符串pageContext.getOut().write("HelloWorld");}//捕捉異常catch(IOExceptionex)(//拋出新異常//thrownewJspTagException("錯誤"};}//值回返returnEVAL_PAGE;這是個非常簡單的標(biāo)簽,它只在頁面中生成一個"HelloWorld"的字符串。該標(biāo)簽沒有屬性,因此無須提供setter和getter方法:此外,該標(biāo)簽無須初始化資源,因此無須重寫init方法:在標(biāo)簽結(jié)束時無須回收資源,因此無須重寫destroy方法。二、 建立TLD文件TLD是TagLibraryDefinition的縮寫,即標(biāo)簽庫定義,文件的后綴是tld,每個TLD文件對應(yīng)一個標(biāo)簽庫,一個標(biāo)簽庫中可包含多個標(biāo)簽。TLD文件也稱為標(biāo)簽庫定義文件。標(biāo)簽庫定義文件的根元素是taglib,它可以有多個tag子元素,每個tag子元素都對應(yīng)一個標(biāo)簽。下面是test.tld的標(biāo)簽定義文件,該文件中包含了HelloWorldTag標(biāo)簽的定義代碼:<?xmlversion="1.0"encoding="ISO-8859-1"?><!DOCTYPEtaglibPUBLIC"-//SunMicrosystems,Inc.//DTDJSPTagLibrary1.2//EN""/dtd/web-jsptaglibrary_1_2.dtd"><taglib><!--定義標(biāo)簽庫版本--><tlib-version>1.0</tlib-version><!--定義JSP版本--><jsp-version>1.2</jsp-version><short-name>test</short-name><!--配置第一個標(biāo)簽--><tag><!--配置標(biāo)簽名--><name>helloworld</name><!--確定標(biāo)簽的處理類--><tag-class>mytag.HelloWorldTag</tag-class><!--確定標(biāo)簽的標(biāo)簽體,標(biāo)簽體為空--><body-content>empty</body-content></tag></taglib>這個標(biāo)簽庫配置文件非常簡單,沒有標(biāo)簽體及標(biāo)簽屬性等。只是一個空標(biāo)簽。三、 在web.xml文件中增加自定義標(biāo)簽的定義編輯了標(biāo)簽庫定義文件還不夠,Web容器還無法加載標(biāo)簽庫定義文件。還必須在web.xml文件中增加標(biāo)簽庫的定義。在web.xml文件中定義標(biāo)簽庫時使用taglib元素,該元素包含兩個子元素:taglib-uri和taglib-location,前者確定標(biāo)簽庫的URI;后者確定標(biāo)簽庫定義文件的位置。下面是web.xml文件中關(guān)于test.tld標(biāo)簽庫的定義片段:<jsp-config><!--定義標(biāo)簽庫--><taglib><!--確定標(biāo)簽庫的URI--><taglib-uri>/tags/test.tld</taglib-uri><!--確定標(biāo)簽庫定義文件的位置--><taglib-location>/WEB-INF/test.tld</taglib-location></taglib></jsp-config>如果需要使用多個標(biāo)簽庫,只需要增加多個taglib元素即可,因為每個taglib元素可對應(yīng)一個標(biāo)簽庫。四、使用標(biāo)簽庫使用標(biāo)簽庫分成以下兩步。導(dǎo)入標(biāo)簽庫:使用taglib編譯指令導(dǎo)入標(biāo)簽。使用標(biāo)簽:在JSP頁面中使用自定義標(biāo)簽。附錄:本節(jié)描述JSP頁面如何使用標(biāo)簽,并介紹不同類型的標(biāo)簽。要使用標(biāo)簽,頁面編寫者必須做以下兩件事:?聲明包含標(biāo)簽的標(biāo)簽庫?讓標(biāo)簽庫實現(xiàn)對于Web應(yīng)用程序可用聲明標(biāo)簽庫通過在使用任何自定義標(biāo)簽之前,將taglib指令加入頁面中聲明JSP頁面將使用在標(biāo)簽庫中定義的標(biāo)簽:<%@tagliburi="/WEB-INF/tutorial-template.tld"prefix="tt"%>uri屬性表示唯一標(biāo)識標(biāo)簽庫描述符(TLD)的URI,在標(biāo)簽庫描述符中描述了uri。這個URI可以是直接或者非直接的。prefix屬性定義了區(qū)分指定標(biāo)簽庫所定義的標(biāo)簽與其他標(biāo)簽庫提供的標(biāo)簽的前綴。標(biāo)簽庫描述符文件名必須有擴(kuò)展名.tld。TLD文件儲存在WAR的WEB-INF目錄中,或者在WEB-INF的子目錄中??梢灾苯踊蛘唛g接引用TLD。下面taglib指令直接引用一個TLD文件名:<%@tagliburi="/WEB-INF/tutorial-template.tld"prefix="tt"%>這個taglib指令使用一個短的邏輯名間接引用TLD:<%@tagliburi="/tutorial-template"prefix="tt"%>在Web應(yīng)用程序部署描述符中將邏輯名映射到一個絕對位置。要將邏輯名/tutorial-template映射為絕對位置/WEB-INF/tutorial-template.tld,在web.xml中添加元素taglib:<taglib><taglib-uri>/tutorial-template</taglib-uri><taglib-location>/WEB-INF/tutorial-template.tld</taglib-location></taglib>讓標(biāo)簽庫實現(xiàn)可用可以以兩種方式讓標(biāo)簽庫實現(xiàn)對Web應(yīng)用程序可用。實現(xiàn)了標(biāo)簽handler的類可以以非打包的形式儲存在Web應(yīng)用程序的WEB-INF/classes子目錄中。另一種方法是,如果以JAR的形式發(fā)布庫,就將它儲存在Web應(yīng)用程序的WEB-INF/lib目錄中。在多個應(yīng)用程序中共享的標(biāo)簽庫儲存在JavaWSDP的<JWSDP_HOME>/common/lib目錄中。taglib的語法格式如下:<%@tagliburi="tagliburi"prefix="tagPrefix”%>其中uri屬性確定標(biāo)簽庫定義文件的URI,這個URI就是在web.xml文件中為標(biāo)簽庫定義的URI。而prefix屬性確定的是標(biāo)簽前綴,即在JSP頁面中使用標(biāo)簽時,該標(biāo)簽庫負(fù)責(zé)處理的標(biāo)簽前綴。使用標(biāo)簽的語法格式如下:<tagPrefix:tagNametagAttribute=tagValue...><tagBody/></tagPrefix>如果該標(biāo)簽沒有標(biāo)簽體,則可以使用如下語法格式:<tagPrefix:tagNametagAttribute=tagValue???/>下面的JSP頁面使用HelloWorldTag標(biāo)簽:<%@pagelanguage="java"pageEncoding="UTF-8"%><!--導(dǎo)入標(biāo)簽庫,指定mytag前綴的標(biāo)簽,由/tags/tldtest.tld的標(biāo)簽庫處理--><%@tagliburi="/tags/test.tld"prefix="mytag"%><html><head><title>自定義標(biāo)簽示范</title></head><bodybgcolor="#ffffcO"><h2>下面顯示的是自定義標(biāo)簽中的內(nèi)容</h2><!--使用標(biāo)簽,其中mytag是標(biāo)簽前綴,根據(jù)taglib的編譯指令,mytag前綴將由于uri為/tags/tldtest.tld的標(biāo)簽庫處理--><mytag:helloworld></mytag:helloworld><BR></body></html>五、帶屬性的標(biāo)簽除了前面的簡單標(biāo)簽外,還有如下兩種常用的標(biāo)簽。.帶屬性的標(biāo)簽。?帶標(biāo)簽體的標(biāo)簽。正如前面介紹的,帶屬性的標(biāo)簽必須為每個屬性提供對應(yīng)的setter和getter方法。屬性的標(biāo)簽的配置方法與簡單標(biāo)簽也略有差別。下面介紹一個帶屬性標(biāo)簽的示例:importjava.io.Writer;importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.ResultSet;importjava.sql.ResultSetMetaData;importjava.sql.SQLException;importjava.sql.Statement;importjavax.servlet.jsp.JspTagException;importjavax.servlet.jsp.tagext.TagSupport;publicclassQueryTagextendsTagSupport(//標(biāo)簽的屬性privateStringdriver;privateStringurl;privateStringuser;privateStringpass;privateStringsql;//執(zhí)行數(shù)據(jù)庫訪問的對象privateConnectionconn=null;privateStatementstmt=null;privateResultSetrs=null;privateResultSetMetaDatarsmd=null;//標(biāo)簽屬性driver的setter方法publicStringgetDriver()(returndriver;}publicvoidsetDriver(Stringdriver)(this.driver=driver;}publicStringgetUrl()(returnurl;}publicvoidsetUrl(Stringurl)(this.url=url;}publicStringgetUser()(returnuser;}publicvoidsetUser(Stringuser)(this.user=user;}publicStringgetSql()(returnsql;}publicvoidsetSql(Stringsql)(this.sql=sql;}publicStringgetPass()(returnpass;}publicvoidsetPass(Stringpass)(this.pass=pass;//標(biāo)簽處理publicintdoEndTag()throwsJspTagException(try(//注冊驅(qū)動Class.forName(driver);//獲取數(shù)據(jù)庫連接conn=DriverManager.getConnection(url,user,pass);//倉4建Statement對象stmt=conn.createStatement();//執(zhí)行查詢rs=stmt.executeQuery(sql);rsmd=rs.getMetaData();//獲取列數(shù)目intcolumnCount=rsmd.getColumnCount();//獲取頁面輸出流Writerout=pageContext.getOut();//在頁面輸出表格out.write("<tableborder='l'bgColor='9999cc'>");//遍歷結(jié)果集while(rs.next())(out.write("<tr>");//逐列輸出查詢到的數(shù)據(jù)for(inti=1;i<columnCount;i++)(out.write("<td>");out.write(""+rs.getString("id"));out.write("</td>");out.write("<td>");out.write(rs.getString("username"));out.write("</td>");}out.write("</tr>");}}catch(Exceptionex)(ex.printStackTrace();thrownewJspTagException("錯誤");}returnEVAL_PAGE;}//銷毀標(biāo)簽前調(diào)用的方法publicvoiddestroy()(//關(guān)閉結(jié)果集if(rs!=null)(try(rs.close();}catch(SQLExceptionsqle)(sqle.printStackTrace();}}//關(guān)閉Statementif(stmt!=null)(try(stmt.close();}catch(SQLExceptionsqle)(sqle.printStackTrace();}}//關(guān)閉數(shù)據(jù)庫連接if(conn!=null)(try(conn.close();}catch(SQLExceptionsqle)(sqle.printStackTrace();}}}}附錄:Tag系列的Interface里定義的靜態(tài)int,通過他們也能一窺tag組鍵的執(zhí)行流程,這幾個靜態(tài)值分別是:SKIP_BODY:跳過了開始和結(jié)束標(biāo)簽之間的代碼,一般是在doStartTag中使用,不處理標(biāo)簽體,直接調(diào)用doEndTagO方法。EVAL_BODY_INCLUDE:處理嵌套的標(biāo)簽,一般是在doStartTag中使用,由負(fù)責(zé)處理標(biāo)簽正文的tag接口提供EVAL_BODY_BUFFERED對包含的內(nèi)容進(jìn)行解析一般是在doStartTag中使用,由負(fù)責(zé)處理標(biāo)簽正文的bodyTag接口提供,目的是通知jsp容器作好讀取正文的工作(創(chuàng)建一個body-content包裝正文和獲取存放操作結(jié)果的out對象,便于以后的操作和輸出).EVAL_BODY_AGAIN處理標(biāo)簽正文,對標(biāo)簽體循環(huán)處理。嵌套標(biāo)簽的iteratorTag接口的使用SKIP_PAGE:忽略標(biāo)簽后面的JSP頁面,一般是在doEndTag中使用EVAL_PAGE:處理標(biāo)簽結(jié)束,直接處理頁面內(nèi)容。繼續(xù)執(zhí)行下面的頁一般是在doEndTag中使用這個標(biāo)簽有點(diǎn)復(fù)雜,它包含5個屬'性:driver,uri,user,pass,sql。標(biāo)簽體將根據(jù)這5個屬性執(zhí)行查詢,并將查詢結(jié)果在頁面上顯示。由于這個標(biāo)簽帶有5個屬性,因此配置文件也需要指定屬性,下面是關(guān)于這個標(biāo)簽的配置文件片段:<tag><!--配置標(biāo)簽名--><name>query</name><!--配置標(biāo)簽的處理類--><tag-class>mytag.QueryTag</tag-class><!--指定標(biāo)簽體為空--><body-content>empty</body-content><!--配置標(biāo)簽屬性:driver--〉〈attribute〉<name>driver</name><required>true</required><rtexprvalue>true</rtexprvalue></attribute><!--配置標(biāo)簽屬性:url--><attribute><name>url</name><required>true</required><rtexprvalue>true</rtexprvalue></attribute><!--配置標(biāo)簽屬性:user--><attribute><name>user</name><required>true</required><rtexprvalue>true</rtexprvalue></attribute><!--配置標(biāo)簽屬性:pass--><attribute><name>pass</name><required>true</required><rtexprvalue>true</rtexprvalue></attribute><!--配置標(biāo)簽屬性:sql--><attribute><name>sql</name><required>true</required><rtexprvalue>true</rtexprvalue></attribute></tag>配置完畢后,就可在頁面中使用標(biāo)簽,先導(dǎo)入標(biāo)簽庫,然后使用標(biāo)簽。使用標(biāo)簽代碼片段如下:<%@tagliburi="/tags/test.tld"prefix="mytag”%><mytag:querydriver="com.mysql.jdbc.Driver"url="jdbc:mysql://localhost:3306/mytest"user="root"pass="root"sql="select火fromuser"/>在JSP頁面中只需要使用簡單的標(biāo)簽,即可完成"復(fù)雜”的功能:執(zhí)行數(shù)據(jù)庫查詢,并將查詢結(jié)果在頁面上以表格形式顯示。這也正是自定義標(biāo)簽庫的目的一一以簡單的標(biāo)簽,隱藏復(fù)雜的邏輯。事實上,自定義標(biāo)簽的功能非常強(qiáng)大,很多項目都提供了相關(guān)的標(biāo)簽庫,比如Struts、WebWork等。注意:JSTL是Sun提供的一套標(biāo)簽庫,這套標(biāo)簽庫的功能非常強(qiáng)大。另外,DisplayTag是Apache組織下的一套開源標(biāo)簽庫,主要用于生成頁面并顯示效果。六、帶標(biāo)簽體的標(biāo)簽帶標(biāo)簽體的標(biāo)簽,就是允許在標(biāo)簽內(nèi)嵌套標(biāo)簽,通??捎糜谕瓿梢恍┻壿嬤\(yùn)算例如判斷和循環(huán)等。帶標(biāo)簽體的標(biāo)簽需要繼承BodyTagSupport,該類包含一個bodyContent屬性,該屬性代表標(biāo)簽體。BodyTagSupport還包含兩個方法。doAfterBodyO:每次處理完標(biāo)簽體后調(diào)用該方法。voiddoInitBodyO:開始調(diào)用標(biāo)簽體時調(diào)用該方法。如果有必要,可以重寫這兩個方法。下面以一個迭代器標(biāo)簽為示例,介紹如何開發(fā)一個帶標(biāo)簽體的標(biāo)簽,該標(biāo)簽體包含兩個屬性:bean和item,bean屬性代表page范圍內(nèi)的一個List;而item代表List中的每個元素。標(biāo)簽的源代碼如下:packagemytag;importjava.io.IOException;importjava.util.List;importjavax.servlet.jsp.JspException;importjavax.servlet.jsp.JspTagException;importjavax.servlet.jsp.tagext.BodyTagSupport;publicclassMyiteratorTagextendsBodyTagSupport(privatestaticfinallongserialVersionUID=1L;//標(biāo)簽需要送代的集合對象名privateStringbean;//集合對象的元素privateStringitem;//集合的當(dāng)前索引privateinti=0;privateintsize;privateList<String>itemList;//bean屬性的setter方法publicStringgetBean()(returnbean;publicvoidsetBean(Stringbean)(this.bean=bean;}publicStringgetItem()(returnitem;}publicvoidsetItem(Stringitem)(this.item=item;}publicintgetI()(returni;}publicvoidsetI(inti)(this.i=i;}publicintgetSize()(returnsize;}publicvoidsetSize(intsize)(this.size=size;}publicList<String>getItemList()(returnitemList;}publicvoidsetItemList(List<String>itemList)(this.itemList=itemList;}publicintdoStartTag()throwsJspTagException(//從page范圍中獲取List對象itemList=(List<String>)pageContext.getAttribute(bean);//獲取List的長度size=itemList.size();//將集合當(dāng)前索引的值放在page范圍的item變量中pageContext.setAttribute(item,itemList.get(i));//返回值為EVAL_BODY_BUFFERED.表明需要計算標(biāo)簽體returnEVAL_BODY_BUFFERED;}//每次標(biāo)簽體處理完后調(diào)用該方法publicintdoAfterBody()throwsJspException(//移動List對象的索引位置i++;//如果索引己經(jīng)超過了集合的長度if(i>=size)(//將索引回零i=0;//不再計算標(biāo)簽體,直接調(diào)用doEndTag方法returnSKIP_BODY;}//將集合的當(dāng)前元素值放入page范圍的item屬性中pageContext.setAttribute(item,itemList.get(i));//循環(huán)計算標(biāo)簽體returnEVAL_BODY_AGAIN;}publicintdoEndTag()throwsJspTagException(try(〃輸出標(biāo)簽體內(nèi)容bodyContent.writeOut(pageContext.getOut());}catch(IOExceptionex)(thrownewJspTagException("錯誤");}returnEVAL_PAGE;}}下面是一個嵌套在該標(biāo)簽內(nèi)的帶屬性的標(biāo)簽,該標(biāo)簽的功能非常簡單,僅僅從page范圍中獲取屬性,然后在頁面上輸出該屬性值。其代碼如下:packagemytag;importjava.io.IOException;importjavax.servlet.jsp.JspTagException;importjavax.servlet.jsp.tagext.TagSupport;publicclassWritorTagextendsTagSupport(privatestaticfinallongserialVersionUID=1L;//item屬性,該標(biāo)簽從page中查找item的屬性,并輸出屬性值privateStringitem;publicStringgetItem()(returnitem;publicvoidsetItem(Stringitem)(this.item=item;}publicintdoStartTag()throwsJspTagException(try(//從page范圍內(nèi)搜索item的屬性,pageContext.getOut().write((String)pageContext.getAttribute(item));}catch(IOExceptionex)(thrownewJspTagException("錯誤");}//返回EVAL_PAGE.繼續(xù)計算頁面輸出。returnEVAL_PAGE;}}將上面兩個標(biāo)簽配置在標(biāo)簽庫中,標(biāo)簽庫的配置片段如下:<!--配置法代器標(biāo)簽--><tag><!--配置標(biāo)簽名--><name>iterator</name><!--配置標(biāo)簽的實現(xiàn)類--><tag-class>mytag.MyiteratorTag</tag-class><!--配置標(biāo)簽的標(biāo)簽體內(nèi)容--><body-content>JSP</body-content><!--配置bean屬性-->〈attribute〉<name>bean</name><required>true</required><rtexprvalue>true</rtexprvalue></attribute><!--配置item屬性--><attribute><name>item</name><required>true</required><rtexprvalue>true</rtexprvalue></attribute></tag><!--配置輸出標(biāo)簽--><tag><!--配置標(biāo)簽名--><name>write</name><!--配置標(biāo)簽的實現(xiàn)類--><tag-class>mytag.WritorTag</tag-class><!--配置標(biāo)簽的標(biāo)簽體內(nèi)容:只能是空標(biāo)簽--><body-content>empty</body-content><!--配置標(biāo)簽屬性item-->〈attribute〉<name>item</name><required>true</required><rtexprvalue>true</rtexprvalue></attribute></tag>在JSP中嵌套使用兩個標(biāo)簽的代碼如下:<%//創(chuàng)建List對象List<String>a=newArrayList<String>();a.add("hello");a.add("world");a.add("java");//將List放入page范圍的屬性apageContext.setAttribute("a",a);%><!--兀素放在表格中--><tableborder="l"bgcolor="dddd99"><!--使用迭代器標(biāo)簽,對List對象a進(jìn)行迭代--><mytag:iteratorbean="a"item="item"><tr><td><!--輸出item屬性的值--><mytag:writeitem="item"/><td></tr></mytag:iterator></table>注意:本示例的迭代器僅對page范圍的List進(jìn)行迭

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論