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("<");
break;
case '>':
result.append(">");
break;
case '&':
result.append("&");
break;
case '"':
result.append(""");
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("&", "&").
replaceAll("<", "<").
replaceAll(">", ">").
replaceAll("\"", """).
replaceAll(" ", " ");
}
public static String filter(String message)
{
... ...
}
}
注意:在使用replaceAll方法替换特殊字符时,必须首先替换“&”字符,否则就会将其他已经替换的特殊字符中的“&”又替换成了“&”。
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("<")}</td>
</tr>
<tr>
<td>${cfun:filter(">")}</td>
<td>${cfun:filter(">")}</td>
</tr>
<tr>
<td>${cfun:filter1("&")}</td>
<td>${cfun:filter1("&")}</td>
</tr>
<tr>
<td>${cfun:filter1("\"")}</td>
<td>${cfun:filter1(""")}</td>
</tr>
<tr>
<td>空格</td>
<td>${cfun:filter1(" ")}</td>
</tr>
</table>
</center>
在浏览器地址栏中输入如下的URL:
http://localhost:8080/demo/chapter7/customfun.jsp
浏览器显示的信息如图7.12所示。
图7.12 替换特殊字符