JSP自定义标签分为TAG和BODYTAG两种类型,即简单标签和正文标签。
一· 简单标签和正文标签的区别
正文标签用来处理处理标签开始和结束之间的内容。简单标签则不能够处理正文部分。但是简单标签仍然包含正文部分,只是不能操作正文部分而已。
二·自定义标签处理类的实现
自定义标签的handle类必须实现BODYTAG标签接口,简单标签可以实现TAG接口。或者将TagSupport类和BodyTagSupport作为基类。
JSP在解析标签时遇到开始标签时调用标签处理类的doStartTag方法,遇到结束标签时调用标签处理类的doEndTag方法。
还有其他一些方法用来在处理自定义标签
简单 doStartTag, doEndTag, release
属性 doStartTag, doEndTag, set/getAttribute1...N, release
正文、判断且无交互 doStartTag, doEndTag, release
正文、迭代判断 doStartTag, doAfterBody, doEndTag, release
正文、交互 doStartTag, doEndTag, release, doInitBody, doAfterBody, release
三自定义标签描述文件(tld)文件的写法
在项目的WEB-INF目录下提供标签的描述(tld)文件
描述文件描述包括以下属性
tlib-version 标签库的版本
jsp-version 这个标签库要求的JSP规范版本
short-name JSP页面编写工具可以用来创建助记名的可选名字
uri 唯一标识该标签库的的URI
display-name 将由工具显示的可选名
small-icon 将由工具使用的可选小图标
large-icon 可被工具使用的可选大图标
description 可选的标签特定信息
listener 标签库制定的监听器
tag 用来绑定标签处理类进行绑定
tag元素
库中的每一个标签都由给出其名字和其标签handler的类、在由标签创建的脚本变量上的信息以及标签属性上的信息描述。脚本变量信息可以在TLD中直接给出,也可以通过tag extra info类给出(见定义脚本变量的标签)。每一个属性声明包含指明属性是否是必需的、其值是否可以由请求时表达式确定以及属性类型的内容(见属性元素)。
元素 说明
name 唯一标签名
tag-class 标签handler类路径及名称
tei-class javax.servlet.jsp.tagext.TagExtraInfo的可选子类。见提供有关脚本变量的信息。
small-icon 可以由工具使用的小图标
large-icon 可以由工具使用的大图标
description 可选的标签特定的信息
variable 可选的脚本变量信息。见提供有关脚本变量的信息。
四· 在页面制定引用的自定义标签
<%@ taglib uri="/WEB-INF/mytag.tld" prefix="mytag" %>
五使用自定义标签的例子
1·TLD文件
<?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">
<taglib>
<tlib-version>1.0</tlib-version>
<jsp-version>1.2</jsp-version>
<short-name>mytag</short-name>
<tag>
<name>mytag</name>
<tag-class>tag.MyTag</tag-class>
<attribute>
<name>id</name>
<type>java.lang.String</type>
</attribute>
</tag>
</taglib>
2· 标签处理类MyTag
package tag;
import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.TagSupport;
public class MyTag extends TagSupport{
private String id = "0";
public int doEndTag() throws JspException {
return EVAL_PAGE;
}
public int doStartTag() throws JspException {
int i = 0;
if(i == 1){
return SKIP_BODY;
}
JspWriter out=pageContext.getOut();
try{
out.println(id); //页面中显示的内容
} catch (IOException e) {
throw new JspException(e);
}
return EVAL_BODY_INCLUDE;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
}
3·页面
<%@ page language="java" contentType="text/html; charset=gb2312"
pageEncoding="gb2312"%>
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
<%@ taglib uri="/WEB-INF/mytag.tld" prefix="mytag" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Untitled Document</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head>
<body>
<f:view>
<h:form>
<div align="center">
<table width="306" height="176" border="1">
<tr align="center">
<td colspan="2"> 用户登录</td>
</tr>
<tr>
<td width="64">用户名:</td>
<td width="226"><h:inputText id="username" value="#{userbean.username}" required="true"></h:inputText><h:message for="username" ></h:message></td>
</tr>
<tr>
<td>密码:</td>
<td><h:inputSecret id="password" value="#{userbean.password}"></h:inputSecret></td>
</tr>
<tr>
<td>验证码:</td>
<td>
<h:inputText id="validateencode" value="#{userbean.validateencoding}"/>
<h:graphicImage value="http://192.168.2.52:8080/TestValidateCoding/servlet/ValidateEncoding" width='55' height='20'></h:graphicImage>
</td>
</tr>
<tr align="center">
<td colspan="2"><h:commandButton type="submit" value="登陆" action = "#{userbean.login}"></h:commandButton>
<h:outputLink value="/JSFTest/jsp/regist/regist.faces">
<h:outputText value="注册"></h:outputText>
</h:outputLink>
</td>
</tr>
</table>
</div>
<h:messages globalOnly="true" ></h:messages>
<mytag:mytag id = "10">
HELLOWORLD!
</mytag:mytag>
</h:form>
</f:view>
</body>
</html>