您的位置:首页 > Web前端 > JavaScript

jsp自定义标签 TagSupport

2014-07-23 17:57 211 查看
定义最简单的标签

自定义标签采用Default Adapter模式(缺省适配模式)

Java代码

Java代码


//最简单的标签

public class LangHuaTag extends TagSupport {

private long startTime;

private long endTime;



public int doStartTag() throws JspException {

startTime = System.currentTimeMillis();

//表示定制标记里面有所包括的JSP页面

return TagSupport.EVAL_BODY_INCLUDE;

}

public int doEndTag() throws JspException {

endTime = System.currentTimeMillis();

long elapsed = endTime - startTime;

try {

JspWriter out = pageContext.getOut();

out.println("runtime is "+ elapsed);

} catch (IOException e) {

e.printStackTrace();

}

//表示JSP页面继续运行

return TagSupport.EVAL_PAGE;

}



}

//代属性的标签

public class DateTag extends TagSupport {

private String pattern = "yyyy-MM-dd hh:mm:ss";

private Date date;

//必须要有Set方法,因为是属性可以设值

public void setPattern(String pattern) {

this.pattern = pattern;

}



public void setDate(Date date) {

this.date = date;

}



public int doEndTag() throws JspException {

SimpleDateFormat sdf = new SimpleDateFormat(pattern);

//如果没有就是当前时间

if(date==null){

date = new Date();

}

JspWriter out = pageContext.getOut();

try {

out.print(sdf.format(date));

} catch (IOException e) {

e.printStackTrace();

}

return TagSupport.EVAL_PAGE;

}

}



/**

* 循环输出

* @author Administrator

*

*/

public class LoopTag extends TagSupport {

private int times =0;

//Set方法设值

public void setTimes(int times) {

this.times = times;

}



public int doStartTag() throws JspException {

//表示定制标记里面有所包括的JSP页面

return TagSupport.EVAL_BODY_INCLUDE;

}



public int doAfterBody() throws JspException {

if(times>0){

times--;

//表示双从标签开始输入

return TagSupport.EVAL_BODY_AGAIN;

}

//表示结束,忽略标签内部的内容

return TagSupport.SKIP_BODY;

}



}

配置文件

Xml代码

Xml代码


<?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 http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"

version="2.0">

<tlib-version>1.0</tlib-version>

<short-name>util</short-name>

<uri>http://langhua.com/taglib/util</uri>

<tag>

<name>timer</name>

<tag-class>com.langhua.tagsupport.LangHuaTag</tag-class>

<body-content>JSP</body-content>

<!-- JSP,empty表示能能包函内容的,scriptless,tagdependent -->

</tag>



<tag>

<name>date</name>

<tag-class>com.langhua.tagsupport.DateTag</tag-class>

<body-content>empty</body-content>

<!-- JSP,empty表示不能包函内容的,scriptless,tagdependent -->

<attribute>

<!-- 标签名 -->

<name>time</name>

<!-- 是否为可选属性 -->

<required>false</required>

<!-- 是否接受JSP表达示计算结果 -->

<rtexprvalue>true</rtexprvalue>

</attribute>

<attribute>

<name>pattern</name>

<required>true</required>

<rtexprvalue>false</rtexprvalue>

</attribute>

</tag>



<tag>

<name>loop</name>

<tag-class>com.langhua.tagsupport.LoopTag</tag-class>

<body-content>JSP</body-content>

<!-- JSP,empty表示不能包函内容的,scriptless,tagdependent -->

<attribute>

<!-- 标签名 -->

<name>times</name>

<!-- 是否为可选属性 -->

<required>true</required>

<!-- 是否接受JSP表达示计算结果 -->

<rtexprvalue>true</rtexprvalue>

</attribute>

</tag>

</taglib>



JSP页面

Html代码

Html代码


<%@ taglib prefix="util" uri="http://langhua.com/taglib/util"%>



<util:timer></util:timer>

<util:loop times="3">

<util:date pattern="yyyy-MM-dd" /><br/>

</util:loop>



<%@ taglib prefix="util" uri="http://langhua.com/taglib/util"%>



<util:timer></util:timer>

<util:loop times="3">

<util:date pattern="yyyy-MM-dd" /><br/>

</util:loop>



TagSupport的流程图

SKIP_BODY 表示不用处理标签体,直接调用doEndTag()方法。

  

  SKIP_PAGE 忽略标签后面的JSP内容。

  

  EVAL_PAGE 处理标签后,继续处理JSP后面的内容。

  

  EVAL_BODY_BUFFERED 表示需要处理标签体。

  

  EVAL_BODY_INCLUDE 表示需要处理标签体,但绕过setBodyContent()和doInitBody()方法

  

  EVAL_BODY_AGAIN 对标签体循环处理。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: