建立第一个自定义标签
这个例子是在Eclipse3.1+MyEclipse4.1+Tomcat5.0的环境下运行通过的。
本来,这个例子在网上可以搜到的,但是,在实验中却通不过,什么也输不出。我不知道作者有没有实验,还是其它原因。这里只列出正确的代码,具体的说明可以在网上搜到。
完成功能:
扩展JSP,令它拥有自己的HTML编码功能。这个功能将所有的<和>字符用 HTML代码来代替。它可以很容易地扩展为做其它的编码处理。为了简化,这个例子只解释了建立自定义标签的基本要素。
在MyEclipse中建立一个Web工程。
创建JavaBean
代码中的任何可重用部分都应该放到一个JavaBean中。在这个例子中,为HTML编码的逻辑是常用的,因此放到JavaBean中,请参看清单A
清单B:HTML编码JavaBean
/* HTML_Format.java */
public class HTML_Format extends Object implements java.io.Serializable {
/** 创建新的HTML_Format */
public HTML_Format() {}
/** 将一个字符串中所有的所有 < 和 > 字符用响应的HTML编码代替 */
public String HTML_Encode(String as_data)
{
int li_len = as_data.length();
/*string buffer的长度要比原来的字符串长*/
StringBuffer lsb_encode = new StringBuffer(li_len + (li_len/10));
/* 循环替换全部的< 和 > 字符 */
for( int li_count = 0 ; li_count < li_len ; li_count++)
{
String ls_next = String.valueOf(as_data.charAt(li_count));
if (ls_next.equals("<")) ls_next = "<";
if (ls_next.equals(">")) ls_next = ">";
lsb_encode.append( ls_next );
}
return( lsb_encode.toString() );
}
}
创建标签处理器
标签处理器的代码请参看清单B:
清单C:HTML编码标签处理器 HTML_FormatTag.java
import java.io.IOException;
import javax.servlet.jsp.*;
import javax.servlet.jsp.tagext.*;
public class HTML_FormatTag extends BodyTagSupport
{
/* 1) 在标签末将会调用这个函数 */
public int doEndTag() throws JspTagException
{
try
{ /* 2)得到标签中的文本 */
BodyContent l_tagbody = getBodyContent();
String ls_output = "";
/* 3)如果标签体有文本,就处理它 */
if(l_tagbody != null)
{ HTML_Format l_format = new HTML_Format();
/* 3a) 将标签体的内容转换为一个字符串 */
String ls_html_text = l_tagbody.getString();
ls_output = l_format.HTML_Encode(ls_html_text);
}
/* 4)将结果写回到数据流中 */
System.out.println(ls_output);
pageContext.getOut().write(ls_output.trim());
}
catch (IOException e)
{ throw new JspTagException("Tag Error:" + e.toString());
}
/* 让JSP继续处理以下页面的内容 */
return EVAL_PAGE;
}
}
创建标签描述符
我们需要描述自定义标签以让系统知道如何处理。该描述文件的后缀为.tld,TLD文件通常就以标签处理器命名,并存放在“/WEB-INF/”目录之下。请在eclipse的工程中在“/WEB-INF/”目录上点右键,New-->File,即可,
注意后缀名为.tld。请参看清单C。
清单C:HTML编码标签描述器HTML_FormatTag.tld
<?xml version="1.0" encoding="ISO-8859-1" ?>
<taglib>
<tlibversion>1.0</tlibversion>
<jspversion>1.2</jspversion>
<shortname>HTML_FormatTag</shortname>
<uri></uri>
<info>HTML Encoding Tag</info>
<tag>
<name>HTMLEncode</name>
<tag-class>tagtest.HTML_FormatTag</tag-class>
<body-content>tagdependent</body-content>
</tag>
</taglib>
更新Web XML文件
现在可以告诉JSP容器如何使用标签库了。为此要修改web.xml文件,具体说来是要在其中加入一个taglib的项目来注册该标签库,并为标签分配一个URI。示例代码请参看清单D。
清单D:修改web.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4"
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-app_2_4.xsd">
<jsp-config>
<taglib>
<taglib-uri>HTMLEncode</taglib-uri>
<taglib-location>/WEB-INF/HTML_FormatTag.tld</taglib-location>
</taglib>
</jsp-config>
</web-app>
注意要加上jsp-config标签,否则在MyEclipse中报错误的。
使用新的标签
自定义的标签设置好后,就可以用在你的JSP页面上了。要做到这一点,只需要在页面上使用
taglib指示命令声明所要采用的标签即可。标签通过其唯一的
URI被索引,然后被分配给一个名字空间前缀(prefix)。这一前缀并没有什么特别的意义,只要它不与其它的名字空间冲突便可,可以任意。请参看以下
的清单E。
清单E:在一个JSP页面上使用HTML编码标签testtag.jsp
<%@ page language="java" pageEncoding="UTF-8"%>
<%@ taglib uri="HTMLEncode" prefix="Examples" %>
<html>
<head>
<title>My JSF 'testtag.jsp' starting page</title>
</head>
<body>
This is a test.
<pre>
<Examples:HTMLEncode>
test:<Hello,this World>
</Examples:HTMLEncode>
</pre>
this is a test.
</body>
输出:
This is a test.
test:<Hello,this World>
This is a test.
最开始,我按照网上的教程,可是,这一句:pageContext.getOut().write(ls_output.trim());就是不输出到JSP页面上。
后来,我查看了JSP的源代码,才发现其实已经输出到JSP页面,但是被JSP页面把
<Hello,this World>作为了HTML标签(但是,它不是HTML标签),就在浏览器上展现不出来了。
于是,我在HTML_Format.java类中改动了以下两句话:
if (ls_next.equals("<")) ls_next = "<";
if (ls_next.equals(">")) ls_next = ">";
就成功得输出了。
posted on 2007-04-30 11:23
leitter 阅读(917)
评论(0) 编辑 收藏