用URLEncoder输出<bean:write />的值
我在JSP页面中,当处理<a href></a>时,经常不用<html:link/>的方式处理,而是用下面这样的方式处理:
<a href="foo.do?param1=<bean:write name="n1" property="p1"/>¶m2=<bean:write name="n2" property="p2"/>">Test</a>
这样在处理多个参数时,就不需要先放到一个Collection中。按照<html:link/>的多个参数的处理方法去做,有时确实是很繁琐。不过这样带来一个新的问题,在处理中文参数值时,这样就行不通了。用request.getParameter("param1")获取的中文,在中文的个数为奇数个时,就会显示不正确。例如“三个字”在getParameter中获取的值是“三个?”。
这个问题是由于<bean:write />没有用URLEncoder的encode方法处理值,因为<bean:write />主要是用来在页面上显示bean的信息,并不是用在链接中当作参数的值。这个问题可以通过给<bean:write />增加新的属性来解决。
从Struts的网站上下载Struts 1.2.4的源代码: http://apache.freelamp.com/struts/source/jakarta-struts-1.2.4-src.zip
解压到本地目录,然后修改文件jakarta-struts-1.2.4-src\src\share\org\apache\struts\taglib\bean\WriteTag.java。新增一个属性charset,表示需要用什么编码进行编码。代码片断如下:
/**/
/**
* Added by George Hill, the string value charset to encoding.
* 05/19/2005
*/
protected String charset = null ;
public String getCharset() {
return (this.charset);
}
public void setCharset(String charset) {
this.charset = charset;
}
* Added by George Hill, the string value charset to encoding.
* 05/19/2005
*/
protected String charset = null ;
public String getCharset() {
return (this.charset);
}
public void setCharset(String charset) {
this.charset = charset;
}
修改方法formatValue,把这段
if (value instanceof java.lang.String) {
return (String) value;
} else {
}
替换为:
if (value instanceof java.lang.String) {
if (charset != null && charset.length() != 0)
return TagUtils.getInstance().encodeURL((String) value, charset);
else
return (String) value;
} else {
}
保存修改后的文件。然后需要修改文件jakarta-struts-1.2.4-src\doc\userGuide\struts-bean.xml。这个文件在ant编译时会变成strtus-bean.tld文件。在tag write后面增加一个attribute,如下所示:
< tag >
< name > write </ name >
< attribute >
< name > charset </ name >
< required > false </ required >
< rtexprvalue > true </ rtexprvalue >
< info >
< p > Added by George Hill, use this charset to encoding the value. </ p >
</ info >
</ attribute >
</ tag >
然后修改一下ant的编译配置文件build.xml,有几个部分需要修改:
1.属性catalina.home需要修改成你安装的tomcat的目录;
2.compile.classpath需要修改,把jar文件的路径指向正确;
3.prepare.library taget部分的copy,把相关的jar文件的路径指向正确。
运行ant,编译后的jar文件保存在jakarta-struts-1.2.4-src\target\library目录中,把原来的struts.jar和struts-bean.tld文件替换掉,就可以用自定义的<bean:write /> tag了。如果不写charset属性,那么和原来的<bean:write />处理是一样的。
这样,类似于下面的链接地址:
<a href="foo.do?param1=<bean:write name="n1" property="p1"/>¶m2=<bean:write name="n2" property="p2"/>">Test</a>
就可以修改成:
<a href="foo.do?param1=<bean:write name="n1" property="p1" charset="UTF-8"/>¶m2=<bean:write name="n2" property="p2" charset="UTF-8"/>">Test</a>
在request.getParameter("param1")中将会获得正确的中文值。
对于struts 1.1,程序又稍微有些不同。我将在下一篇随笔中介绍。