随笔 - 1  文章 - 2  trackbacks - 0
<2024年3月>
252627282912
3456789
10111213141516
17181920212223
24252627282930
31123456

常用链接

留言簿(3)

我参与的团队

随笔分类

随笔档案

文章档案

搜索

  •  

最新评论

建立第一个自定义标签

这个例子是在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 = "&lt";
    if (ls_next.equals(">")) ls_next = "&gt";
    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 = "&lt";
    if (ls_next.equals(">")) ls_next = "&gt";
就成功得输出了。
posted on 2007-04-30 11:23 leitter 阅读(902) 评论(0)  编辑  收藏

只有注册用户登录后才能发表评论。


网站导航: