【自定义标签开发】01-标签简介和开发第一个标签
自定義標(biāo)簽主要用于移除Jsp頁面中的java代碼。
要使用自定義標(biāo)簽移除jsp頁面中的java代碼,只需要完成以下兩個步驟:
1.編寫一個實(shí)現(xiàn)Tag接口的java類,把頁面java代碼移到這個java類中(標(biāo)簽處理器類)。
2.編寫標(biāo)簽庫描述(tld)文件,在tld文件中把標(biāo)簽處理器類描述成一個標(biāo)簽。
我們接下來寫一個小例子來對自定義標(biāo)簽的開發(fā)做一個入門了解
快速入門:使用標(biāo)簽輸出客戶機(jī)IP
我們在MyEclipse中創(chuàng)建一個名為JspTest的Web project,然后改寫它的index.jsp,來實(shí)現(xiàn)輸出客戶機(jī)IP。
如果我們不使用標(biāo)簽的話,我們免不了使用腳本代碼來實(shí)現(xiàn)我們的功能:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html><head><title>My JSP 'index.jsp' starting page</title></head><body>您的ip為:<%String ip = request.getRemoteAddr();out.print(ip);%></body> </html>
將JspTest工程部署到tomcat運(yùn)行之后效果:
但是這里直接寫了java代碼,不符合我們的mvc規(guī)范,所以我們要移除java代碼,用簡單的標(biāo)簽來替代它。
我們上面說了開發(fā)自定義標(biāo)簽庫的步驟,我們按照那個步驟來開發(fā)一個顯示用戶ip的標(biāo)簽。
jsp技術(shù)中有一個tag接口,下面有如下的方法:
doEndTag()執(zhí)行開始標(biāo)簽執(zhí)行的方法(如<c:foreach>)
doStartTag()執(zhí)行結(jié)束標(biāo)簽執(zhí)行的方法(如</c:foreach>)
getParent()得到標(biāo)簽的父標(biāo)簽(包裹本標(biāo)簽的上一級標(biāo)簽)
release()釋放資源的方法,標(biāo)簽結(jié)束時執(zhí)行,會釋放標(biāo)簽運(yùn)行的時候所占用的資源。
setPageContext(PageContext pc)把頁面的PageContext傳遞過來(最重要的方法,它會把頁面的所有數(shù)據(jù)傳遞過來,包括Servlet的八大隱式對象,這樣我們就可以做我們想處理的任何事)
以上就是整個tag接口的說明文檔。
我們開發(fā)標(biāo)簽的主要邏輯就要寫在doStartTag()和doEndTag()方法。
但是如果我們實(shí)現(xiàn)了tag接口,就不單單要實(shí)現(xiàn)doStartTag()和doEndTag()方法,其它的方法也要去實(shí)現(xiàn),那么這個時候我們不想改變原有方法的內(nèi)容,這個時候sun公司給我們提供了tag默認(rèn)的實(shí)現(xiàn)類供我們使用,有以下方法:
BodtTagSupport/TagAdapter/TagSupport
我們下面常用的就是TagSupport
我們接下來做開發(fā), 來移除我們剛剛寫的獲取用戶ip的代碼。
我們創(chuàng)建一個類,去集成實(shí)現(xiàn)了Tag接口的TagSupport類:
package org.zyg.web.tag;import javax.servlet.jsp.tagext.TagSupport;public class ViewIPTag extends TagSupport {}
然后我們實(shí)現(xiàn)其中的doStartTag()方法,然后將顯示用戶ip的邏輯寫進(jìn)去:
package org.zyg.web.tag;import java.io.IOException;import javax.servlet.http.HttpServletRequest; import javax.servlet.jsp.JspException; import javax.servlet.jsp.JspWriter; import javax.servlet.jsp.tagext.TagSupport;public class ViewIPTag extends TagSupport {@Overridepublic int doStartTag() throws JspException {//Tag接口的setPageContext方法已經(jīng)將PageContext從頁面拿過來//我們在這里獲取PageContextHttpServletRequest request=(HttpServletRequest)this.pageContext.getRequest();//獲取JspWriter對象JspWriter out=this.pageContext.getOut();String ip = request.getRemoteAddr();try {out.print(ip);} catch (IOException e) {throw new RuntimeException(e);}return super.doStartTag();}}
現(xiàn)在我們就已經(jīng)成功的頁面的java代碼成功的移到一個標(biāo)簽處理類中了,jsp類中就不需要出現(xiàn)這段java代碼了。
接下來就是我們要為這個標(biāo)簽處理類定義一個標(biāo)簽名了。
我們要創(chuàng)建一個tld文件,我們在WEB-INF/lib下新建一個zyg.tld文件。
內(nèi)容我們不知道怎么寫?可以查看tomcat給我們的規(guī)范,在tomcat的apache-tomcat-6.0.24\webapps\examples\WEB-INF\jsp2文件夾下,有一個jsp2-example-taglib.tld文件,我們將它的頭和尾抄過來:
<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 http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"version="2.0"></taglib>
接下來我們將我們的標(biāo)簽處理類包裝成一個標(biāo)簽:
<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 http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"version="2.0"><description>A tag library exercising SimpleTag handlers.</description><tlib-version>1.0</tlib-version><short-name>zyg</short-name><uri>http://blog.csdn.net/acmman</uri><tag><name>viewIP</name><!-- 標(biāo)簽名 --><tag-class>org.zyg.web.tag.ViewIPTag</tag-class><body-content>empty</body-content><!-- 有無標(biāo)簽體(單標(biāo)簽還是成對標(biāo)簽) --></tag></taglib>
接下來我們在頁面使用這個標(biāo)簽,在使用標(biāo)簽前,首先在jsp頁面中導(dǎo)入標(biāo)簽:
<%@taglib uri="http://blog.csdn.net/acmman" prefix="zyg" %>
然后我們寫一個“<zyg”,按一下Alt+/就可以看到自動提示,這個時候我們的標(biāo)簽成功引入了:
代碼:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <%@taglib uri="http://blog.csdn.net/acmman" prefix="zyg" %><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html><head><title>My JSP 'index.jsp' starting page</title></head><body>您的ip為:<zyg:viewIP/></body> </html>
我們重新發(fā)布一下web工程,在瀏覽器中訪問:
我們雖然看到和以前一樣的效果,但是內(nèi)部的技術(shù)全都換了。至此我們闡述了一個簡單的自定義標(biāo)簽的開發(fā)過程。
轉(zhuǎn)載請注明出處:http://blog.csdn.net/acmman/article/details/51065439
總結(jié)
以上是生活随笔為你收集整理的【自定义标签开发】01-标签简介和开发第一个标签的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 解析super-smack的smack文
- 下一篇: java泛型不是计算运行时的数据类型