7.6.5 过滤HTML格式中的特殊字符

优质
小牛编辑
134浏览
2023-12-01

在这一节将实现一个更复杂的EL自定义函数的例子。

例子 : 过滤HTML格式中的特殊字符

1. 实例说明

该示例的功能是替换HTML格式中的特殊字符,这些特殊字符如表7.6所示。

表7.6 特殊字符和替换字符串对照表

特殊字符

替换字符串

<

>

&

&

"

"

空格

 

2. 使用Tomcat自带的例子来实现EL自定义函数

在Tomcat自带的例子中已经提供了一个HTMLFilter类来实现这个功能(由该类中的filter方法实现)。我们可以利用该类中的代码来编写EL自定义函数,代码如下:

package chapter7;
public class CustomFun
{
    //  替换HTML格式的特殊字符
    public static String filter(String message)
{
        if (message == null)
            return (null);
        char content[] = new char[message.length()];
        message.getChars(0, message.length(), content, 0);
        StringBuffer result = new StringBuffer(content.length + 50);
        for (int i = 0; i < content.length; i++)
{

            switch (content[i])
      {
           case '<':
                result.append("&lt;");
                break;

            case '>':
                result.append("&gt;");
                break;

            case '&':
                result.append("&amp;");
                break;

            case '"':
                result.append("&quot;");
                break;

            default:
                result.append(content[i]);
            }
        }
        return (result.toString());
    }
}

从上面的代码可以看出,HTMLFilter类的filter方法只替换了表7.6中的前四个字符,而未替换空格字符。而且是通过扫描被替换的字符串来完成这个功能的。

3. 使用String.replaceAll方法过滤特殊字符

下面使用String.replaceAll方法来完成同样的功能,并替换空格字符:

package chapter7;
public class CustomFun
{
    public static String filter1(String message)
    {
        if(message == null)
            return null;
        return message.replaceAll("&", "&amp;").
replaceAll("<", "&lt;").
replaceAll(">", "&gt;").
replaceAll("\"", "&quot;").
replaceAll(" ", "&nbsp;");
    }
    public static String filter(String message)
{
        ... ...
    }
}

注意:在使用replaceAll方法替换特殊字符时,必须首先替换“&”字符,否则就会将其他已经替换的特殊字符中的“&”又替换成了“&amp;”。

4. 配置EL自定义函数

下面是在customfun.tld文件中配置filter和filter1方法的代码:

  <function>
        <name>filter</name>
        <function-class>chapter7.CustomFun</function-class>
        <function-signature> java.lang.String filter(java.lang.String)
        </function-signature>
    </function>

    <function>
        <name>filter1</name>
        <function-class>chapter7.CustomFun</function-class>
        <function-signature> java.lang.String filter1(java.lang.String)
        </function-signature>
    </function>

5. 使用EL自定义函数

使用filter和filter1函数替换特殊字符的代码如下:

<%@ page language="java" contentType="text/html; charset=UTF-8"%>

<%@ taglib prefix="cfun" uri="http://www.sun.com/cfun1.0"%>

<style style="text/css">

td{text-align:center}

</style>  

特殊字符替换表

<center>
<table border="1" width="260"  >
        <thead>
            <td width="40%" >特殊符号</td>
      <td>替换字符串</td>
      </thead>
        <tr>
            <td >${cfun:filter("<")}</td>
      <td>${cfun:filter("&lt;")}</td>
       </tr>
        <tr>
            <td>${cfun:filter(">")}</td>
      <td>${cfun:filter("&gt;")}</td>
        </tr>
        <tr>
            <td>${cfun:filter1("&")}</td>
      <td>${cfun:filter1("&amp;")}</td>
        </tr>   
        <tr>
            <td>${cfun:filter1("\"")}</td>
      <td>${cfun:filter1("&quot;")}</td>
        </tr>
        <tr>
            <td>空格</td>
      <td>${cfun:filter1("&nbsp;")}</td>
      </tr>
</table>
</center>

在浏览器地址栏中输入如下的URL:

http://localhost:8080/demo/chapter7/customfun.jsp

浏览器显示的信息如图7.12所示。

12

图7.12 替换特殊字符