JSP自定义标签

1.基本定义
<%@ taglib uri="" prefix="" %>
URI:唯一的指定标记库的绝对URI或相对URI,用于定位这个标记库的位置
tagPrefix:指定所用标记库的标识符,用以区分不同用户所使用的不同标记库
jsp,jspx,java,servlet,sun,sunw 是保留标记库识别符

2.TagLibrary的工作原理
 1),parsing
  检查jsp语法,修复某些缩写
 2),Validation
  验证程序员是否正确使用了标签
 3),Translation
  jsp程序被翻译为一个Java类,一般继承HttpJspPage接口,覆盖_jspService() 方法
 4),Execution
  编译并执行

3.编写Tag
一,编写tld文件
二,编写Java类,继承TagSupport,添加各属性并增加setter和getter
三,修改web.xml 添加

  <jsp-config>   
      <taglib>   
        <taglib-uri>eric/zhou</taglib-uri>
        <taglib-location>/WEB-INF/test.tld</taglib-location> 
      </taglib>   
  </jsp-config>

 

四,页面调用

4.tag嵌套
步骤
1.tld文件中bodycontent设置为jsp
2.在夫标签中dostart方法中更改返回值为TagSupport.EVAL_BODY_INCLUDE
3.在子标签中获得父标签对象并为父标签赋值
4.结束

两层标签嵌套时的执行顺序p代表父,c代表子
p:startTag
c:startTag
c:endTag
p:doAfterBody
p:doEndTag

在子标签中获取父标签实例的方法

HttpServletRequest request = (HttpServletRequest)this.pageContext.getRequest();
		Tag t = findAncestorWithClass(this, FormaterTag.class);    
		FormaterTag parent = (FormaterTag) t;  

 代码:

1.TLD文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN" "http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd">
<taglib>
<tlibversion>1.0</tlibversion>
<jspversion>1.1</jspversion>
<shortname>logic</shortname>
<uri>eric/zhou</uri>

<tag>
	<name>DateFormater</name>
	<tagclass>tag.FormaterTag</tagclass>
	<bodycontent>empty</bodycontent>
	
	<attribute>
	<name>date</name>
	<required>true</required>
	<rtexprvalue>true</rtexprvalue>
	</attribute>
	
	<attribute>
	<name>format</name>
	<required>true</required>
	<rtexprvalue>true</rtexprvalue>
	</attribute>
</tag>
</taglib>

 2.类

package tag;

import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.TagSupport;

public class FormaterTag extends TagSupport {
	private Date date;
	private String format;
	
	@Override
	public int doEndTag() throws JspException {
		SimpleDateFormat sdf = new SimpleDateFormat(format);
		try {
			pageContext.getOut().print(sdf.format(date));
		} catch (IOException e) {
			e.printStackTrace();
		}
		return super.doEndTag();
	}

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

	public Date getDate() {
		return date;
	}

	public void setDate(Date date) {
		this.date = date;
	}

	public String getFormat() {
		return format;
	}

	public void setFormat(String format) {
		this.format = format;
	}
	
}

 

你可能感兴趣的:(jsp自定义标签)