整理了一下以前的練習,把jsp tag的練習記錄一下:
建立mytag.tld:放置在web-inf下面:
<?xml version="1.0" encoding="UTF-8"?> <taglib> <tlibversion>1.0</tlibversion> <jspversion>1.1</jspversion> <tag> <name>displayDate</name> <tagclass>com.zyujie.util.DateTagNoBody</tagclass> <bodycontent>empty</bodycontent> <!-- 標籤體之間的內容要為空白 --> </tag> <tag> <name>displayDateTwo</name> <tagclass>com.zyujie.util.DateTagAttribute</tagclass> <bodycontent>empty</bodycontent><!-- 標籤體之間的內容要為空白 --> <!-- 定義屬性 --> <attribute> <name>pattern</name> <!-- 屬性名稱字 --> <type>String</type> <!-- 屬性類型 --> <requried>false</requried> <!-- 是否必須 --> <rtexprvale>false</rtexprvale> <!-- 表示是否可以使用JSP運算式 --> </attribute> </tag> <tag> <name>iterator</name> <tagclass>com.zyujie.util.BodyTag</tagclass> <bodycontent>jsp</bodycontent> <!-- 定義屬性 --> <attribute> <name>count</name> <!-- 屬性名稱字 --> <type>int</type> <!-- 屬性類型 --> <requried>false</requried> <!-- 是否必須 --> <rtexprvale>false</rtexprvale> <!-- 表示是否可以使用JSP運算式 --> </attribute> </tag> </taglib>
在web.xml中引入這個tag設定檔:
<!-- 2.5的配置方法 --><jsp-config><taglib><taglib-uri>/WEB-INF/mytag.tld</taglib-uri><taglib-location>/WEB-INF/mytag.tld</taglib-location></taglib></jsp-config>
jsp引用:這裡做了三個例子:
<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%><%@ taglib uri="/WEB-INF/mytag.tld" prefix="cc"%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html> <head> <title>jsp taglib</title><meta http-equiv="pragma" content="no-cache"><meta http-equiv="cache-control" content="no-cache"><meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"><meta http-equiv="description" content="This is my page"> </head> <body> <!-- 沒有參數,沒有body內容的 --> <cc:displayDate /> <!-- 有參數,但沒有body內容的 --> <cc:displayDateTwo pattern='MM/dd HH:mm:ss' /> <!-- 有參數,有body內容的 --> <cc:iterator count="10">Hello world jsp taglib !!!</cc:iterator> </body></html>
對應該的三個類:
1、沒有參數,沒有body內容的:
package com.zyujie.util;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;public class DateTagNoBody extends TagSupport {@Overridepublic int doStartTag() throws JspException {HttpServletRequest request;// 是TagSupport類中定義的一個屬性,它是javax.servlet.jsp.PageContext的對象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 。當然其原因是我們的簡單日期標記沒有本文。return Tag.SKIP_BODY;}}
2、有參數,但沒有body內容的:
package com.zyujie.util;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;public class DateTagAttribute extends TagSupport {private String pattern;@Overridepublic int doStartTag() throws JspException {HttpServletRequest request;// 是TagSupport類中定義的一個屬性,它是javax.servlet.jsp.PageContext的對象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 。當然其原因是我們的簡單日期標記沒有本文。return Tag.SKIP_BODY;}// 必須實現setXX()方法public void setPattern(String pattern) {this.pattern = pattern;}}
3、有參數,有body內容的:
package com.zyujie.util;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 {//執行順序////doStartTag()->setBodyContent()->doInitBody()->doAfterTag()->doEndTag()////如果doStartTag()返回的是EVAL_BODY_INCLUDE執行doAfterTag()方法,////如果它返回SKIP_BODY就執行doEndTag()方法。////setBodyContent()方法用於設定標籤體內容,如果在計算BodyContent時需要進行一些初始化工作,////則在doInitBody()方法中完成。標籤體內容執行完後,會調用doAfterBody()方法////在doAfterTag()方法中返回EVAL_BODY_AGAIN來重複執行doAfterTag()方法////返回SKIP_BODY值則執行doEndTag()方法。////在doEndTag()方法中返回EVAL_PAGE值,則執行此標籤的後的其它代碼,////返回SKIP_PAGE則不執行此頁面的其它代碼。private int count;private HttpServletRequest reqeust;private JspWriter out;public void init() {reqeust = (HttpServletRequest) pageContext.getRequest();out = pageContext.getOut();}@Overridepublic int doStartTag() throws JspException {init();return this.EVAL_BODY_INCLUDE;}// 設定當前標籤體@Overridepublic void setBodyContent(BodyContent bodyContent) {this.bodyContent = bodyContent;System.out.println("setBodyContent...");}// 需要初始化bodyContent@Overridepublic void doInitBody() throws JspException {System.out.println("init.....");}@Overridepublic 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;}}@Overridepublic 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;}// 必須實現setXX()方法public void setCount(int count) {this.count = count;}}