您好,登錄后才能下訂單哦!
JSP中怎么自定義標(biāo)簽,很多新手對(duì)此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來(lái)學(xué)習(xí)下,希望你能有所收獲。
(一) 沒有正文的JSP自定義標(biāo)簽實(shí)現(xiàn)
(1):定義JSP自定義標(biāo)簽處理類
import java.io.IOException; import java.util.Date; import javax.servlet.http.HttpServletRequest; import javax.servlet.jsp.JspException; import javax.servlet.jsp.JspWriter; import javax.servlet.jsp.tagext.Tag; import javax.servlet.jsp.tagext.TagSupport; //無(wú)正文標(biāo)簽類繼承的是TagSupport類 實(shí)現(xiàn)的接口是Tag。 如果有正文的標(biāo)簽類繼承的是BodyTagSupport類 實(shí)現(xiàn)的接口是BodyTag public class DateTagNoBody extends TagSupport { @Override public int doStartTag() throws JspException { HttpServletRequest request; // 是TagSupport類中定義的一個(gè)屬性,它是javax.servlet.jsp.PageContext的對(duì)象 request = (HttpServletRequest) pageContext.getRequest(); java.text.SimpleDateFormat formater = new java.text.SimpleDateFormat("yyyy-MM-dd"); String date = formater.format(new Date()); JspWriter out = pageContext.getOut(); try { out.print(date); } catch (IOException e) { e.printStackTrace(); } // doStartTag() 方法返回 SKIP_BODY 。當(dāng)然其原因是我們的簡(jiǎn)單日期標(biāo)記沒有正文。 return Tag.SKIP_BODY; } }
(2) 定義tld文件
<?xml version="1.0" encoding="UTF-8"?> <taglib> <tlibversion>1.0</tlibversion> <jspversion>1.1</jspversion> <tag> <name>displayDate</name> <tagclass>cn.com.chenlly.tag.DateTagNoBody</tagclass> <bodycontent>empty</bodycontent> </tag> </taglib>
(3) JSP頁(yè)面動(dòng)態(tài)引用
<%@ page language="java" pageEncoding="UTF-8"%> <%@ taglib uri="/WEB-INF/datetag.tld" prefix="c"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> </head> <body> <c:displayDate/> </body> </html>
注意:動(dòng)態(tài)引用和靜態(tài)引用的區(qū)別。
為了進(jìn)行靜態(tài)引用,首先必須將下面的項(xiàng)加入到web.xml 文件中:
<?xml version="1.0" encoding="ISO-8859-1" ?> <Web-app> <taglib> <taglib-uri>myTags</taglib-uri> <taglib-location>/WEB-INF/lib/DateTagLib.tld</taglib-location> </taglib> </Web-app>
然后,將JSP 聲明加入到所有需要使用自定義標(biāo)記庫(kù)的頁(yè)面中:
<%@ taglib uri="myTags" prefix="c" %>
指定的uri 屬性與在web.xml 文件中指定的taglib-uri 值相匹配。
在進(jìn)行標(biāo)記庫(kù)的靜態(tài)引用時(shí),JSP 聲明必須查詢 web.xml 文件以執(zhí)行庫(kù)查詢。這意味著如果移動(dòng)或者重命名了庫(kù),或者希望在 web.xml 文件中加入更多的庫(kù),就必須停止服務(wù)器、更新 web.xml 文件、然后重新啟動(dòng)服務(wù)器。動(dòng)態(tài)方法讓JSP頁(yè)直接指向 TLD 位置,因而是在解釋JSP頁(yè)面時(shí)進(jìn)行處理。
(二) 沒有正文的但帶有屬性的JSP自定義標(biāo)簽標(biāo)簽實(shí)現(xiàn)
(1):定義JSP自定義標(biāo)簽處理類
import java.io.IOException; import java.util.Date; import javax.servlet.http.HttpServletRequest; import javax.servlet.jsp.JspException; import javax.servlet.jsp.JspWriter; import javax.servlet.jsp.tagext.Tag; import javax.servlet.jsp.tagext.TagSupport; //無(wú)正文標(biāo)簽類繼承的是TagSupport類 實(shí)現(xiàn)的接口是Tag。 如果有正文的標(biāo)簽類繼承的是BodyTagSupport類 實(shí)現(xiàn)的接口是BodyTag public class DateTagNoBody extends TagSupport { private String pattern; @Override public int doStartTag() throws JspException { HttpServletRequest request; // 是TagSupport類中定義的一個(gè)屬性,它是javax.servlet.jsp.PageContext的對(duì)象 request = (HttpServletRequest) pageContext.getRequest(); java.text.SimpleDateFormat formater = new java.text.SimpleDateFormat(pattern); String date = formater.format(new Date()); JspWriter out = pageContext.getOut(); try { out.print(date); } catch (IOException e) { e.printStackTrace(); } // doStartTag() 方法返回 SKIP_BODY 。當(dāng)然其原因是我們的簡(jiǎn)單日期標(biāo)記沒有正文。 return Tag.SKIP_BODY; } //必須實(shí)現(xiàn)setXX()方法 public void setPattern(String pattern){ this.pattern = pattern; } }
(2) 定義tld文件
<?xml version="1.0" encoding="UTF-8"?> <taglib> <tlibversion>1.0</tlibversion> <jspversion>1.1</jspversion> <tag> <name>displayDate</name> <tagclass>cn.com.chenlly.tag.DateTagNoBody</tagclass> <bodycontent>empty</bodycontent> <!-- 定義屬性 --> <attribute> <name>pattern</name> <!-- 屬性名字 --> <type>String</type> <!-- 屬性類型 --> <requried>false</requried> <!-- 是否必須 --> <rtexprvale>false</rtexprvale> <!-- 表示是否可以使用JSP表達(dá)式 --> </attribute> </tag> </taglib>
(3)JSP頁(yè)面動(dòng)態(tài)引用
<%@ page language="java" pageEncoding="UTF-8"%> <%@ taglib uri="/WEB-INF/datetag.tld" prefix="c"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> </head> <body> <c:displayDate pattern='yyyy-MM-dd'/> </br> <c:displayDate pattern='MM/dd HH:mm:ss'/> </body> </html>
(三) 有正文的且?guī)в袑傩缘腏SP自定義標(biāo)簽實(shí)現(xiàn)
(1):定義JSP自定義標(biāo)簽處理類
import java.io.IOException; import java.util.Date; import javax.servlet.http.HttpServletRequest; import javax.servlet.jsp.JspException; import javax.servlet.jsp.JspWriter; import javax.servlet.jsp.tagext.BodyContent; import javax.servlet.jsp.tagext.BodyTagSupport; public class BodyTag extends BodyTagSupport { private int count; private HttpServletRequest reqeust; private JspWriter out; public void init() { reqeust = (HttpServletRequest) pageContext.getRequest(); out = pageContext.getOut(); } @Override public int doStartTag() throws JspException { init(); return this.EVAL_BODY_INCLUDE; } //設(shè)置當(dāng)前標(biāo)簽體 @Override public void setBodyContent(BodyContent bodyContent) { this.bodyContent = bodyContent; System.out.println("setBodyContent..."); } //需要初始化bodyContent @Override public void doInitBody() throws JspException { System.out.println("init....."); } @Override public int doAfterBody() throws JspException { if (count >= 1) { try { out.println(count); out.println("<Br>"); } catch (IOException e) { e.printStackTrace(); } count --; return this.EVAL_BODY_AGAIN; } else { return this.SKIP_BODY; } } @Override public int doEndTag() throws JspException { java.text.SimpleDateFormat formater = new java.text.SimpleDateFormat( "yyyy-MM-dd"); String date = formater.format(new Date()); try { out.print(date); } catch (IOException e) { e.printStackTrace(); } return this.EVAL_PAGE; } // 必須實(shí)現(xiàn)setXX()方法 public void setCount(int count) { this.count = count; } }
(2) 定義tld文件
<?xml version="1.0" encoding="UTF-8"?> <taglib> <tlibversion>1.0</tlibversion> <jspversion>1.1</jspversion> <tag> <name>iterator</name> <tagclass>cn.com.chenlly.tag.BodyTag</tagclass> <bodycontent>jsp</bodycontent> <!-- 定義屬性 --> <attribute> <name>count</name> <!-- 屬性名字 --> <type>int</type> <!-- 屬性類型 --> <requried>false</requried> <!-- 是否必須 --> <rtexprvale>false</rtexprvale> <!-- 表示是否可以使用JSP表達(dá)式 --> </attribute> </tag> </taglib>
(3) jsp 頁(yè)面動(dòng)態(tài)引用
<%@ page language="java" pageEncoding="UTF-8"%> <%@ taglib uri="/WEB-INF/bodytag.tld" prefix="c"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> </head> <body> <c:iterator count="10">HelloWorld!</c:iterator> <% out.println("Bye Bye"); %> </body> </html>
效果圖:
執(zhí)行順序
doStartTag()->setBodyContent()->doInitBody()->doAfterTag()->doEndTag()
如果doStartTag()返回的是EVAL_BODY_INCLUDE執(zhí)行doAfterTag()方法,
如果它返回SKIP_BODY就執(zhí)行doEndTag()方法。
setBodyContent()方法用于設(shè)置標(biāo)簽體內(nèi)容,如果在計(jì)算BodyContent時(shí)需要進(jìn)行一些初始化工作,
則在doInitBody()方法中完成。標(biāo)簽體內(nèi)容執(zhí)行完后,會(huì)調(diào)用doAfterBody()方法
在doAfterTag()方法中返回EVAL_BODY_AGAIN來(lái)重復(fù)執(zhí)行doAfterTag()方法
返回SKIP_BODY值則執(zhí)行doEndTag()方法。
在doEndTag()方法中返回EVAL_PAGE值,則執(zhí)行此標(biāo)簽的后的其它代碼,
返回SKIP_PAGE則不執(zhí)行此頁(yè)面的其它代碼。
看完上述內(nèi)容是否對(duì)您有幫助呢?如果還想對(duì)相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請(qǐng)關(guān)注億速云行業(yè)資訊頻道,感謝您對(duì)億速云的支持。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。