一般地,如果servlet想要生成含有类如 < 或者 > 等字符的HTML,只需简单地使用标准的HTML字符字体—— &lt; 或者 &gt;。

类似地,如果servlet要在HTML属性值中使用 " 或 & 符号,只需要使用 &quot; 或 &amp;。

如果不做这些替换,最终生成的HTML代码将会不正确,因为 < 或者 > 常常被解释为HTML标记中标签的一部分,属性值中的双引号可能会被解释为属性值的结尾,而 & 符号根本不允许出现在属性值中。

如果用一般的方法在表单中提交 <b>Test 的话,最终的显示结果是 Test(粗体) ,即加粗后的文字。

解决办法是,自己编写一个ServletUtilities类,利用其中的filter方法,将一个字符串中的这些特殊符号转换成标准的HTML字符字体。 <b>Test 也可以正常地显示成 <b>Test。

实现起来比较简单,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
class ServletUtilities {
public static String filter(String input) {
if (!hasSpecialChars(input)) {
return (input);
}
StringBuffer filtered = new StringBuffer(input.length());
char c;
for (int i = 0; i < input.length(); i++) {
c = input.charAt(i);
switch (c) {
case '<':
filtered.append("&lt");
break;
case '>':
filtered.append("&gt");
break;
case '"':
filtered.append("&quot");
break;
case '&':
filtered.append("&amp");
break;
default:
filtered.append(c);
}
}
return (filtered.toString());
}

private static boolean hasSpecialChars(String input) {
boolean flag = false;
if ((input != null) && (input.length() > 0)) {
char c;
for (int i = 0; i < input.length(); i++) {
c = input.charAt(i);
switch (c) {
case '<':
flag = true;
break;
case '>':
flag = true;
break;
case '"':
flag = true;
break;
case '&':
flag = true;
break;
}
}
}
return (flag);
}
}