自定义tag:
The year property of a java.util.Date (represented by the getYear( ) method) contains the current year minus 1900, so here I add 1900 to get the real year
body-content. This attribute defines how the custom action element's body should be handled, and that it must have one of these values: empty, scriptless (the default), or tagdependent
body-content元素 :
没有正文的标签必须用body-content元素声明它们的正文内容是空的(tld文件中):
<body-content>empty</body-content>
从JSP规范2.0以来,定制标记库动作可以采用两种方法实现:一种是作为Java类,另一种是作为包含有JSP元素的常规文本文件。
创建和使用标记文件
标记文件(tag file)是包含有JSP元素的文本文件,这些JSP元素实现了定制动作的功能。必须使用.tag文件扩展名,以使Web容器能识别此类文件。创建一个标记文件与创建JSP页面并无不同。标记文件一旦创建和安装,类似于用Java实现的定制动作,也能用同样的方式使用。
例题:
copyright.jsp
<%@ page contentType="text/html" %>
<%@ taglib prefix="my" tagdir="/WEB-INF/tags/mytags" %>
<html>
<body bgcolor="white">
Any old page content ...
<p>
<my:copyright/>
</body>
</html>
prefix名字可以随便定义。JSp默认,行为名为文件名(copyright) .如果用打包成jar的方式,那么tagdir要改成uri,并且写个tld文件定义说明。这会在之后的笔记中记录。
如果取值为empty,那么试图使用定制动作元素的体将会导致一个语法错误。scriptless值表示体中可以包含任何JSP元素,脚本元素除外。tagdependent值表示动作元素体则处理为纯模板文本。
copyright.tag
©为版权标志
<%@ tag body-content="empty" %>
<jsp:useBean id="now" scope="application" class="java.util.Date" />
Copyright © ${now.year} My Company
简单标签的handler必须实现Tag接口的doStartTag和doEndTag方法。在遇到开始标签时调用doStartTag方法。因为简单标签没有正文,所以这个方法返回SKIP_BODY。在遇到结束标签时调用doEndTag方法。如果要对页面的其他部分进行判断,则doEndTag方法需要返回EVAL_PAGE,否则,它就返回SKIP_PAGE。
public SimpleTag extends TagSupport {
public int doStartTag() throws JspException {
try { pageContext.getOut().print("Hello.");
} catch (Exception ex) {
throw new JspTagException("SimpleTag: " +
ex.getMessage()); }
return SKIP_BODY; }
public int doEndTag() {
return EVAL_PAGE;
}
}可以定义两种类型的标签:
javax.servlet.jsp.tagext.Tag
javax.servlet.jsp.tagext.BodyTag
对 正文 进行操作 —— 即对在开始和结束标签之间的内容进行操作的 —— 标签必须实现 BodyTag 接口。
TLD必须以指定XML的版本和文档类型定义(DTD)的XML文档序言(prolog)开始。
taglib的子元素:
<?xml version="1.0" encoding="ISO-8859-1" ?> <!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN" "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">