自定义标签库是一种很优秀的表现层组件技术。通过使用标签库,可以在简单的标签中封装复杂的功能,取代页面中“丑陋”的JSP脚本,提高代码的易读性,使维护和调试更加方便。
自定义标签类应当继承一个父类:javax.servlet.jsp.tagext.SimpleTagSupport,自定义标签类中如果包含属性,则需要为每个属性提供setter和getter方法。每个标签类需要重写doTag()方法。
如下列标签输出HelloWorld.
package taglib;
public class firstTag extends SimpleTagSupport
{
public void doTag() throws Exception
{
this.getJspContext().getOut().write("Hello,world!");
}
}
每个标签库定义文件包含一个标签库,一个tld文件可以包含多个标签。标签库定义文件的根元素是taglib,可以包含多个tag子元素,每个tag元素对应一个标签。
tld文件应放在web-inf文件夹或web-inf文件夹的任意子路径下,服务器会自动加载该文件。
下面是一个tld文件示范,定义了上述helloworld标签体:
<taglib xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
version="2.0">
<tlib-version>1.0tlib-version>
<short-name>mytaglibshort-name>
<uri>http://tomcat.apache.org/jsp2-example-tagliburi>
<tag>
<name>helloworldname>
<tag-class>taglib.firstTagtag-class>
<body-content>emptybody-content>
tag>
taglib>
taglib有三个子元素:
(1)tlib-version:指定该标签库实现版本。
(2)short-name:标签库默认短名,无太大作用。
(3)uri:指定标签库URI,即该标签库唯一标识,JSP页面中使用标签库就是根据该URI定义的。
tag中的子元素有:
(1)name:该标签名称,JSP页面中需要根据该名称来使用此标签,为必须属性。
(2)tag-class:该标签的实现类,决定该标签由哪个类来进行处理。
(3)body-content:指定该标签体内容,子元素可以有以下几个:
1、tagdependent:指定标签处理类自己负责处理标签体。
2、empty:指定该标签体只能作为空标签来使用。
3、scriptless:指定该标签体可以是静态HTML元素、表达式语言,但不允许出现JSP脚本。
4、JSP:指定该标签体可以使用JSP脚本。
(4)dynamic-attributes:指定该标签体是否支持动态属性。
导入标签库语法如下:
<%@ taglib uri="TagLibUri" prefix="tagPrefix"%>
其中,uri属性指定标签库的URI,prefix指定标签库前缀,可以自定义一个名称。
使用标签语法为:
"tagValue"... />
或者
"tagValue"... >
以上内容节选自《轻量级JavaEE:企业应用实战(第四版)》
package taglib;
import java.io.IOException;
import java.io.Writer;
import java.util.ArrayList;
import java.util.Collection;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.tagext.SimpleTagSupport;
public class IteratorTag extends SimpleTagSupport
{
private String collection; //标签属性:集合名称
private String item; //标签属性:为集合元素指定的名称
//省略collection、item的setter、getter方法
public void doTag() throws JspException, IOException
{
Collection itemList = (Collection)getJspContext().getAttribute(collection);
for(Object s : itemList)
{
getJspContext().setAttribute(item, s);
getJspBody().invoke(null);
}
}
}
以Blog类作为示范:
public class Blog
{
private Integer id;
private String title,author,time,content;
public Blog(Integer id,String title,String content,String time,String author)
{
this.setId(id);
this.setTitle(title);
this.setContent(content);
this.setTime(time);
this.setAuthor(author);
}
//省略所有getter、setter方法
}
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<%@ taglib uri="http://tomcat.apache.org/jsp2-example-taglib" prefix="mytag"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>博客列表title>
head>
<body>
<% pageContext.setAttribute("blogLists", session.getAttribute("blogList")); %>
<table border="1">
<tr>
<th>IDth>
<th>标题th>
<th>作者th>
<th>发布时间th>
tr>
<mytag:iterator collection="blogLists" item="blog">
<tr>
<td>${pageScope.blog.id}td>
<td>${pageScope.blog.title }td>
<td>${pageScope.blog.author }td>
<td>${pageScope.blog.time }td>
tr>
mytag:iterator>
table>
body>
html>