Struts的国际化完整解决方案

[color=red]1.这是在网上找到的一种处理方法,测试已经通过![/color]在网上有很多有关Struts的中文解决方案,但是很多都说得很零碎,不够完整。下面是我的一个完整解决方案。
要使网页能够真正实现多语言,有三个地方都需要修改:
1.在页面部分,一定要把页面的编码设成UTF-8,就是在开头加上这一句:<%@ page contentType="text/html; charset=UTF-8" %>。并且把所有的文字信息都放到resource文件中。
以前我在写网页的时候,没有指定页面的编码,总是在获取表单的内容后,要人工的用new String(s.getBytes("ISO8859-1"))转换一下,这样是很繁琐的,而且很容易出错。网页中如果没有指定编码,那么默认的就是用ISO8859-1编码的。
2.相应的资源文件需要用native2ascii转换一下。
对于简体中文的资源文件:native2ascii -encoding gbk ApplicationResources_zh.properties convert\ApplicationResources_zh.properties
对于繁体中文的资源文件:native2ascii -encoding big5 ApplicationResources_zh_tw.properties convert\ApplicationResources_zh_tw.properties

3.需要用一个filter设置一下request的编码,我的代码如下:

1import java.io.*;
2import java.util.*;
3import javax.servlet.*;
4import javax.servlet.http.*;
5
6/**//**
7 * <p>Title: </p>
8 * <p>Description: </p>
9 * <p>Copyright: Copyright (c) 2003</p>
10 * <p>Company: </p>
11 * @author George Hill
12 * @version 1.0
13 */
14
15public class CharsetFilter implements Filter {
16
17 private FilterConfig filterConfig;
18
19 /**//**
20 * Request设置的Charset encoding
21 */
22 private String encoding;
23
24 /**//**
25 * 是否忽略设置Request的Charset encoding
26 */
27 private boolean ignore;
28
29 //Handle the passed-in FilterConfig
30 public void init(FilterConfig filterConfig) {
31 this.filterConfig = filterConfig;
32
33 encoding = filterConfig.getInitParameter("encoding");
34 String value = filterConfig.getInitParameter("ignore");
35 if ("true".equalsIgnoreCase(value) || "yes".equalsIgnoreCase(value)
36 || "on".equalsIgnoreCase(value) || "1".equalsIgnoreCase(value)) {
37 ignore = true;
38 }
39 }
40
41 //Process the request/response pair
42 public void doFilter(ServletRequest request, ServletResponse response,
43 FilterChain chain) throws IOException, ServletException {
44 if (!ignore) {
45 request.setCharacterEncoding(encoding);
46 }
47
48 chain.doFilter(request, response);
49 }
50
51 //Clean up resources
52 public void destroy() {
53 this.filterConfig = null;
54 }
55}
56
web.xml的相关片断如下:
注意:将以下代码放入web.xml文件中的</servlet-mapping>后面即可!
1 <filter>
2 <filter-name>charsetfilter</filter-name>
3 <filter-class>xxx.CharsetFilter</filter-class>
4 <init-param>
5 <param-name>encoding</param-name>
6 <param-value>UTF-8</param-value>
7 </init-param>
8 <init-param>
9 <param-name>ignore</param-name>
10 <param-value>false</param-value>
11 </init-param>
12 </filter>
13 <filter-mapping>
14 <filter-name>charsetfilter</filter-name>
15 <url-pattern>/*</url-pattern>
16 </filter-mapping>
这样,在Action中处理表达的内容时,就不需要再做转换;而且在Action中处理数据给页面显示时,也不需要做转换。在页面中可以同时显示简体和繁体的内容,不需要去设置IE的编码。
另外需要说明的就是如果数据库也支持编码的话,最好也是设成UTF-8编码,这样才能够完整的解决多语言的问题。例如MySQL 4.1以上的版本可以设置编码成utf8,在JDBC的URL中可以指定编码为UTF-8。
[color=red]2.这是在网上找到的第二种说法[/color]
国际化的东西带来的问题还真的好多,各国语言不同,所使用的字符集都不一样,JAVA,mysql,Tomcat,浏览器等等用的字符集也不一样,这几天气得我都说了好几次不用什么Struts,mysql,Tomcat了,全部都是自己写出来好了,用统一的编码统一的字符集,可惜能力不够,说说而已,问题还是得解决。在网上查了好久,自己也实践了好多天,问题终于算是解决了。
强烈建议使用struts时所有编码均采用UTF-8(unicode)编码
因为要考虑到很多国的语言,一开始就把项目立足于国际化,遇到的乱码有
1、资源文件里读出来在页面上的乱码;
2、数据库读出来的乱码
3、数据库写进去的乱码
4、在ActionForm验证不通过Errors返回的乱码,也就是request,IE参数传递的乱码了。
下面是我的解决方法
1、资源文件里读出来在页面上的乱码:这个最容易解决了,把写好的ApplicationResources.properties文件,在DOC底下用 native2ascii -encoding gb2312 ApplicationResources.properties
ApplicationResources_zh_CN.properties 命令来个字符编码转换,将原来的中文转为Unicode编码就搞定了中文简体,繁体也用同样的命令,只是把 bg2312 改为 bgk 就可以了。
2、数据库读写的乱码,刚开始的时候因为受以前的SQL Server+JDBC 影响(在那时写入数据库是可以不用做什么工作的,只是在读出来的时候来个 gbk = new String(iso.getBytes("ISO-8859-1"), "GBK") 转换就行了)我也都在把读写都在转换,搞得好复杂也很麻烦,后来在连接池连接代码jdbc:mysql://localhost:3306/Database?autoReconnect=true&useUnicode=true&characterEncoding=UTF-8那里加上一个&useUnicode=true&characterEncoding=UTF-8,保证了在数据库操作时候使用了统一的编码字符集,又解决了两个乱码问题,一举两得,嘿嘿。
4、request,response的乱码在网上找了好久,也有两个解决的办法,也是来个转换,还有种办法是写一个过滤器,我选择了后者,因为简单:),这方法用到两个文件,一个是 filter ,一个是 web.xml 文件,代码在后面。
5、至于JS的这个问题,还没办法,只好在jsp页面上改为<%@ page contentType=“text/html; charset=UTF-8“%>了,反正这样也没问题。
到此为止,乱码问题总算告一段落了,感觉蛮不错的,郁闷了这么久,终于可以高兴了好大一段子了。

package Filter;
import JAVAx.servlet.http.HttpServletRequest;
import JAVAx.servlet.http.HttpServletResponse;
import org.Apache.struts.action.*;
public class MyFilter extends ActionServlet
{
protected void process(HttpServletRequest request, HttpServletResponse response)
throws JAVA.io.IOException, JAVAx.servlet.ServletException
{ /**@todo Override this
org.Apache.struts.action.ActionServlet
method*/
request.setCharacterEncoding("UTF-8");
super.process(request, response); }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值