Posted on 2008-12-15 14:46
wesley1987 阅读(631)
评论(1) 编辑 收藏 所属分类:
struts学习项目
一. 使用 方法调用处理中文:
public static String changeStr(String str){
if(str==null)return null;
String temp=null;
try {
temp = new String(str.getBytes("ISO-8859-1"));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return temp;
}
我们将这个方法作为静态写入了BaseAction中,使所有的方法都能调用。
String offername = changeStr(request.getParameter("offername"));
这种方法的好处是: 无论是POST/GET的页面表单,还是重写的URL他都一并处理了。写起来也简单
可问题是:对于所有页面参数几乎都要调用一下这个方法,对于大的工程就很不合适了。
特别是参数很多的Form中,所有的参数都要用它处理一次。虽然我把这个处理写入了验证中自动调用。
但是还是感觉比较麻烦。
二. 使用 过滤器 Filter
1 新建一个java文件:SetCharacterEncodingFilter
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class CharacterEncodingFilter implements Filter {
private FilterConfig config;
private String encoding;
public void destroy() {
// 销毁配置
this.config = null;
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
// 如果编码已经配置, 则使用该编码.
if(this.encoding != null) {
request.setCharacterEncoding(this.encoding);
}
// 将资源链到下一Filter, 如果这是最后一个Filter, 则将资源链到目的位置.
chain.doFilter(request, response);
}
public void init(FilterConfig config) throws ServletException {
// 方便销毁配置
this.config = config;
// 读取web.xml中CharacterEncodingFilter内的初始编码参数
this.encoding = this.config.getInitParameter("encoding");
}
2 在web.xml中 根节点下加入
<!-- 设置request编码方式 -->
<filter>
<filter-name>Set Character Encoding</filter-name>
<filter-class>com.neusoft.struts.platform.SetCharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>GB2312</param-value>
</init-param>
<init-param>
<param-name>ignore</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>Set Character Encoding</filter-name>
<url-pattern>*</url-pattern>
</filter-mapping>
使用过滤器 可谓是一劳永逸,所有页面表单是POST的请求,即所有struts中的Form基本都OK了。
但注意:它也仅对POST请求有效。对于GET请求和重写URL的请求,它也会去处理,但由于他们和POST的编码区别,
过滤器会把他们过滤成??
解决方法:
找到Tomcat安装目录内conf文件夹下的server.xml文件,
给其中的连接器元素Connector添加属性:
URIEncoding, 属性值为:
UTF-8.
1 <Connector port="8080" protocol="HTTP/1.1"
2 connectionTimeout="20000"
3 redirectPort="8443"
4 URIEncoding="UTF-8" />
关于乱码详细问题即解决,见 乱码问题详解