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; } }