·配置 Tomcat5.5 站点

n 创建 Web 应用程序 tagtest

·自定义标签研究

n 创建public class HtmlUtils extends BodyTagSupport，自定义正文标签(Body Tag)。HtmlUtils.java完整代码如下：

package test;

import java.io.BufferedReader;

import java.io.IOException;

import java.util.StringTokenizer;

import javax.servlet.jsp.JspException;

import javax.servlet.jsp.JspTagException;

import javax.servlet.jsp.JspWriter;

import javax.servlet.jsp.tagext.BodyContent;

import javax.servlet.jsp.tagext.BodyTagSupport;

public class HtmlUtils extends BodyTagSupport {

public int doAfterBody() throws JspException {

try {

boolean altRow = false;

String record = "";

/* Get Body Content and Enclosing JSP Writer */

BodyContent body = getBodyContent();

JspWriter out = body.getEnclosingWriter();

out.println("<center>");

out.println("<table>");

/* Get body content as a reader and process each line individually */

BufferedReader contentReader = new BufferedReader(body.getReader());

while ((record = contentReader.readLine()) != null) {

/* Alternate row colors */

out.println("<tr bgcolor='"

+ ((altRow = !altRow) ? "#FFFFFF" : "#c0c0c0") + "'>");

/* Break the record into an array */

StringTokenizer st = new StringTokenizer(record, ",");

while (st.hasMoreTokens()) {

out.println("<td>");

out.println(st.nextToken());

out.println("</td>");

}

out.println("</tr>");

}

out.println("</table>");

out.println("</center>");

} catch (IOException e) {

throw new JspTagException(e.toString());

}

return SKIP_BODY;

}

}

重写public int doAfterBody()：

1. 定义 boolean altRow = false，我们用这个变量来控制表格奇偶行有不同的背景色。

2. 定义String record = ""，代表要格式化文本的每一行。

3. 获取标签中的正文，即BodyContent body = getBodyContent()

4. 获得输出流，即JspWriter out = body.getEnclosingWriter();

5. 输出HTML的表格头，即out.println("<table>");

6. 从正文获得缓冲输入流，即BufferedReader contentReader = new BufferedReader(body.getReader())

7. 从缓冲输入流BufferedReader contentReader中读取并处理每一行直到结束，即while ((record = contentReader.readLine()) != null)：

· 输出HTML表格行标签，且奇偶行有不同的背景色，即out.println("<tr bgcolor='" + ((altRow = !altRow) ? "#FFFFFF" : "#c0c0c0") + "'>");

· 把用逗号分割的字符串分解为标记，即StringTokenizer st = new StringTokenizer(record, ",")

· 输出分解后的每一个标记，即while (st.hasMoreTokens()){out.println("<td>"+st.nextToken()+"</td>")}

· 输出HTML表格行结束标签，即out.println("</tr>");

8. 输出HTML表格结束标签，即out.println("</table>");

n 创建TLD文件：WEB-INF/tlds/utils.tld，在文件中描述和声明我们自定义的标签类。utils.tld完整代码如下：

<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.0</tlib-version>

<short-name>utils</short-name>

<uri>utils</uri>

<description>

Tag library to support the examples

</description>

<tag>

<name>tableFormat</name>

<tag-class>test.HtmlUtils</tag-class>

<body-content>tagdependent</body-content>

</tag>

</taglib>

n 在 web.xml 文件中声明自定义的标签，完整代码如下：

<jsp-config>

<taglib>

<taglib-uri>/utils</taglib-uri>

<taglib-location>/WEB-INF/tlds/utils.tld</taglib-location>

</taglib>

</jsp-config>

n 创建 BodyTagTest.jsp，我们用这个 Jsp 文件来测试自定义的标签。BodyTagTest.jsp 完整代码如下：

<%@ page language="java" contentType="text/html; charset=gbk"

pageEncoding="gbk"%>

<%@ taglib uri="/utils" prefix="util"%>

<html>

<head>

<title>Body Tag Example</title>

</head>

<body>

<h1>Body Tag Example</h1>

<br>

<br>

<util:tableFormat>

100,Lorrain Davies,$500.00

200,Christina Inman,$450.34

300,Lori Peterson,$475.23

400,Sandy Andre,$423.00

500,Lani Tobias,$445.34

</util:tableFormat>

</body>

</html>

其中：

· <%@ taglib uri="/utils" prefix="util"%>，声明我们引用的标签库/utils。

· <util:tableFormat>…</util:tableFormat>，使用自定义标签格式化文本。

·部署运行

n 部署文件

· 编译HtmlUtils.java，把 class 文件放到 WEB-INF\classes\test 目录下。

· 把BodyTagTest.jsp放到应用程序目录下。

· TLD 文件utils.tld 放到 WEB-INF\tlds 目录下。

n 启动 Tomcat

n 在 IE 浏览器的地址栏中输入 http://localhost:8080/jsp_test/BodyTagTest.jsp