日期:2014-05-16  浏览次数:20305 次

JSTL学习(二)自定义标签库

JSTL自带的标签功能非常强大,但是仅仅有这些标签并不能完全满足实际开发中的需要,必要的时候我们可以自己动手写自己的标签,甚至于构建自己的标签库。

开发自定义标签,首先需要开发标签所对应的类,其次要编写标签的描述文件tld,并把这个文件放在WEB-INFO目录下(其实可以放在别的目录下,只不过需要在Web.xml中配置而已,为了方便使用我们一般默认放在WEB-INF目录下)。最后在JSP页面上标记tld文件的位置,根据tld文件中的描述进而找到处理标签的类。

一幅图胜过千言万语

下面的这个例子就是使用自定义的标签实现在页面上输出当前时间。具体实现代码如下

标签处理类:

package taglibs;

import java.text.SimpleDateFormat;
import java.util.Date;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.tagext.Tag;

public class DateTag implements Tag {
	
	private PageContext pageContext;
	private Tag tag;
	
	@Override
	public int doEndTag() throws JspException {
		try{
			Date date=new Date();
			SimpleDateFormat dateFormater=new SimpleDateFormat("yyyy年MM月dd日");
			pageContext.getOut().print(dateFormater.format(date));
		}catch(Exception e){
			e.printStackTrace();
		}
		return Tag.EVAL_PAGE;
	}

	@Override
	public int doStartTag() throws JspException {
		return Tag.SKIP_BODY;
	}

	@Override
	public Tag getParent() {
		return null;
	}

	@Override
	public void release() {

	}

	@Override
	public void setPageContext(PageContext pageContext) {
		this.pageContext=pageContext;
	}

	@Override
	public void setParent(Tag parent) {
		this.tag=parent;
	}
}

代码解析:

上面的这个DateTag类实现了Tag接口,如果需要处理正文内容,即要处理开始标签和结束标签之间的内容的时候,需要实现BodyTag接口。在这个例子中我们仅仅是输出当前的时间没有处理正文内容,所以选择实现Tag接口。

因为这里要实现的标签不对正文内容做处理,所以只需要实现doEndTag方法即可,在这个方法中的取得当前系统时间,并用指定的格式输出。

标签库描述文件:

<?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" >