JSP自定义标签
Posted 小菜鸟yjm
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JSP自定义标签相关的知识,希望对你有一定的参考价值。
自定义JSP标签
自定义标签通过封装反复执行的代码使之在多个应用程序中重复使用,提高开发效率。
1)TagSupport类
TagSupport类实现了Tag接口,为我们提供了 四个重要的方法
方法名称 | 描述 |
int doStartTag() | 遇到自定义标签开始时调用该方法,返回值如下。 SKIP_BODY:表示不处理标签体,直接调用doEndTag()方法 EVAL_BODY_INCLUDE:正常执行标签体,但是不对标签体做任何处理。 |
int doAfterBody() | 重复执行标签体内容的方法,返回值如下 SKIP_BODY:表示表示不处理标签体,直接调用doEndTag()方法 EVAL_BODY_AGAIN:重复执行标签体的内容 |
int doEndTag() | 遇到自定义标签结束 时调用该方法,返回值如下. SKIP_PAGE:忽略标签后面的JSP内容,中止JSP页面的执行 EVAL_PAGE:处理标签后,继续处理JSP后面的内容 |
void release() | 释放获得的所有资源 |
2)BodyTagSupport类
BodyTagSupport继承了TagSupport类并实现了BodyTag接口,可以处理标签体内容。BodyTagSupport重新定义了doStartTag()方法以返回EVAL_BODY_BUFFERED.通过返回EVAL_BODY_BUFFERED,doStartTag()请求创建一个新的缓冲区(BodyContent)。
BodyTagSupport新增的方法
void setBodyContent(BodyContent b) static BodyContent getBodyContent()
void doInitBody()
3)标签库描述文(TLD)
1标签库元素<taglib>
<taglib>
<tlib-version>mytaglib 1.0</tlib-version> //标签库的版本号
<jsp-version>1.1</jsp-version> jsp的版本号
<short-name>myTag</short-name> 标签库的默认前缀
<uri>/myTag</uri> 标签库的唯一访问标识符
</taglib>
2标签元素<tag>
<attribute>
<name>msg</name> <!-- 属性名称 -->
<required>true</required> <!-- 属性是否是必须的,默认false -->
<rtexprvalue>true</rtexprvalue><!-- 属性是否支持JSP表达式 -->
<variable>
<name-from-attribute>var</name-from-attribute> <!-- 变量名 -->
<variable-class>java.lang.String</variable-class><!-- 变量类型 -->
<scope>AT_BEGIN</scope><!--变量的作用范围:NESTED 开始和结束标签之间 AT_BEGIN 开始到页面结束
AT_END结束标签到页面结束-->
</variable>
</attribute>
下面通过一个实例来演示自定义JSP标签的使用方法
信息显示标签的处理类
注意每定义一个变量都要定义好set和get方法,使jsp标签可以调用
package tag;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspTagException;
import javax.servlet.jsp.tagext.TagSupport;
public class Echo extends TagSupport
String msg = "";
public String getMsg()
return msg;
public void setMsg(String msg)
this.msg = msg;
//标签开始时调用的处理方法
public int doStartTag() throws JspException
try
//将信息内容输出到JSP页面
pageContext.getOut().print(msg);
catch(Exception e)
throw new JspTagException(e.getMessage());
return SKIP_BODY;
public int doEndTag()
//继续执行后续的JSP页面内容
return EVAL_PAGE;
格式化日期标签FormatDate
package tag;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspTagException;
import javax.servlet.jsp.tagext.TagSupport;
public class FormatDate extends TagSupport
Date date = null;
String type = "null";
public Date getDate()
return date;
public void setDate(Date date)
this.date = date;
public String getType()
return type;
public void setType(String type)
this.type = type;
public int doStartTag() throws JspException
try
SimpleDateFormat fmt = null;
if(type.equals("date"))
fmt = new SimpleDateFormat("yyyy年MM月dd日");
if(type.equals("time"))
fmt = new SimpleDateFormat("hh 时 mm 分 ss 秒");
if(type.equals("all"))
fmt = new SimpleDateFormat("yyyy年MM月dd日 hh时mm分ss秒");
pageContext.getOut().print(fmt.format(date));
catch(Exception e)
throw new JspTagException(e.getMessage());
return SKIP_BODY;
public int doEndTag()
//继续执行后续的JSP页面内容
return EVAL_PAGE;
转换为大写标签的处理类ToUpperCase
package tag;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.BodyContent;
import javax.servlet.jsp.tagext.BodyTagSupport;
public class ToUpperCase extends BodyTagSupport
String var = null;
public String getVar()
return var;
public void setVar(String var)
this.var = var;
public int doStartTag() throws JspException
//表示需要处理标签体
return EVAL_BODY_BUFFERED;
public int doAfterBody() throws JspException
//取得标签体对象
BodyContent body = this.getBodyContent();
//获得标签体的字符串内容
String content = body.getString();
//清除标签体中的内容
body.clearBody();
//转换成大写
content = content.toUpperCase();
pageContext.setAttribute(var, content);
//结束对标签体的处理
return SKIP_BODY;
tld配置文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE taglib PUBLIC "-//Sun Microsystems,
Inc.//DTD JSP Tag Library 1.2//EN" "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
<taglib>
<tlib-version>1.0</tlib-version>
<jsp-version>1.1</jsp-version>
<short-name>myTag</short-name>
<uri>/WEB_INF/mytaglib.tld</uri>
<tag>
<name>firstTag</name>
<tag-class>tag.MyTag</tag-class>
<body-content>empty</body-content>
</tag>
<tag>
<name>message</name>
<tag-class>tag.MyTag2</tag-class>
<body-content>empty</body-content>
<attribute>
<name>key</name>
<required>true</required>
</attribute>
</tag>
<tag>
<name>echo</name>
<tag-class>tag.Echo</tag-class> <!-- 标签的处理类 -->
<body-content>empty</body-content> <!--三个可选值 empty:没有标签体
JSP:表示标签体可以加入jsp程序代码 tagdependent 表示标签体的内容由标签自己处理-->
<attribute>
<name>msg</name> <!-- 属性名称 -->
<required>true</required> <!-- 属性是否是必须的,默认false -->
<rtexprvalue>true</rtexprvalue><!-- 属性是否支持JSP表达式 -->
</attribute>
</tag>
<tag>
<name>formatdate</name>
<tag-class>tag.FormatDate</tag-class>
<body-content>empty</body-content>
<attribute>
<name>date</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>type</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
<tag>
<name>touppercase</name>
<tag-class>tag.ToUpperCase</tag-class>
<body-content>tagdependent</body-content>
<variable>
<name-from-attribute>var</name-from-attribute> <!-- 变量名 -->
<variable-class>java.lang.String</variable-class><!-- 变量类型 -->
<scope>AT_BEGIN</scope><!--变量的作用范围:NESTED 开始和结束标签之间 AT_BEGIN 开始到页面结束
AT_END结束标签到页面结束-->
</variable>
<attribute>
<name>var</name>
<required>true</required>
</attribute>
</tag>
</taglib>
测试页面
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="mytag" uri="/myTag"%>
<html>
<head>
<title>自定义JSP标签应用实例</title>
</head>
<body>
<h2>自定义JSP标签应用实例</h2>
现在的时间是:<mytag:echo msg="<%= (new Date().toString()) %>"/><br>
当前日期是:<mytag:formatdate date="<%= new Date()%>" type="date"/><br>
当前时间是:<mytag:formatdate date="<%= new Date() %>" type="time"/><br>
当前日期和时间是:<mytag:formatdate date="<%=new Date() %>" type="all"/><br>
<mytag:touppercase var="result">abcderfg</mytag:touppercase>
转化结果:<%=result %>
</body>
</html>
以上是关于JSP自定义标签的主要内容,如果未能解决你的问题,请参考以下文章