java

位置:IT落伍者 >> java >> 浏览文章

struts中文问题和国际化问题的终极解决方案


发布日期:2018年03月06日
 
struts中文问题和国际化问题的终极解决方案

Java本身就支持多国语言编码不需要写任何程序可以很简单的 实现 秘诀就是两点

所有HTML/JSP页面全部采用UTF编码

客户端浏览器完全支持UTF编码

步骤

首先把所有的HTML/JSP的ContentType都设为UTF

然后对于JSP程序中的非ASCII码提示信息都不应该写在程序里面都应该放在

applicationproperties里面统一管理

对HTML用nativeascii工具统一做一次处理把HTML中的非ASCII码都转换为Unicode编码

针对不同的语言写不同的applicationproperties比如说简体中文是

application_zh_CNproperties繁体中文是application_zh_TWproperties这样然后对这些配置信

息文件同样用nativeascii工具处理一次把非ASCII码统统转为Unicode编码

在Servlet的requestgetCharacterEncoding()获得客户端的操作系统默认编码然后set到Struts

的HTTPSession的Locale中

OK!现在不同的客户访问就会显示不同的语言版本了你可以看看此时你的浏览器的字符集就是

UTF现在你的网站和Google一样了嘿嘿其实你有心的话看看你的浏览器访问Google的时候是

什么字符集吧

切记所有的HTML/JSP都要设为UTF编码所有的文件中的非ASCII码字符都要用nativeascii工具转

为用ASCII表示的Unicode编码

上面所述是我从网上下的一篇于中文问题的解决方案确切的说应该是关于Struts的国际化问题下面我结合我的实践谈谈具体如何实现Struts的国际化问题我对理论不是非常精通我只能完全凭自己的理解和实践来讲述所以下面讲的内容可能不是非常正确还请大家原谅但有一点可以肯定我通过自己的努力解决了Struts的中文问题并实现Struts的国际化其实一切并不复杂下面是具体步骤

遇到的问题(这些问题也许不会同时出现)

a中文数据从数据库中到jsp中后就变成了????

b做好的中文properties文件其中的中文value在页面显示乱码

cjsp文件中的中文到浏览器后显示时也是乱码(建议不要在jsp文件中输入中文尽量放在properties文件中)

d由jsp传给bean的中文值再由bean传回页面又是乱码

e当更换本地浏览器的语言选项时Web应用程序不能自动根据你的locale选择合适的*properties文件导致Web应用程序不能国际化

环境

Web服务器 Tomcat

操作系统 Win Server

JVM jdk

数 据 库 Oracle

开发工具 struts studio pro for eclipse

先将所有*jsp 网页中开头处加入

再设置

然后编辑好两个*properties文件放在classes文件夹下你指定的地方这里是放在/webinf/classes/com/wiley 下它们分别是

ApplicationResourcesproperties (英文资源文件)

ApplicationResources_zhproperties (中文资源文件)

随便用什么工具编写都行啊!

将ApplicationResources_zhproperties转码成gb上面引文说要转成UTF结果我试了不行转成gb就行了操作是

将ApplicationResources_zhproperties更名为ApplicationResources_xxproperties

在DOS命令行进入ApplicationResources_xxproperties所在的文件夹

使用命令nativeascii encoding gb ApplicationResources_xxproperties ApplicationResources_zhproperties(至于你为什么会出现nativeascii不是内部命令请查其它资料可能你要设置环境变量因为他是jdk的文件夹bin下的一个应用程序)

接下来配置strutsconfigxml很简单我们加入 就行了

到此已能解决大多数中文问题如上面所说的abe 现在打开浏览器选择菜单工具》internet选项》语言中文-中国[zhcn]删掉添加一个英语-英国[zhgb]确定后重启Tomcat输入网址你就会发现你的页面的文本信息就会用的是ApplicationResourcesproperties (英文资源文件)中的内容如果换回中文-中国[zhcn]它就会显示ApplicationResources_zhproperties (中文资源文件)中的中文内容

至于问题cjsp文件中的中文到浏览器后显示时也是乱码 你就要用与第步类似的方法来重新对*jsp 文件编码这时encoding的参数就要用UTF如果你用的也是struts studio pro for eclipse工具这一步就免了它会自动用UTF的格式存储

至于问题d由jsp传给bean的中文值再由bean传回页面又是乱码的解决我只是加了个过滤器

你可以现在webxml中加入

Set Character Encoding

comwileySetCharacterEncodingFilter

encoding

utf

ignore

true

Set Character Encoding

action

然后在你指定的包内加个java文件 我放在了/webinf/classes/com/wiley 里下面是源代码

/*

* XP Forum

*

* Copyright (c) RedSoft Group All rights reserved

*

*/

package comhuahangtjstrutsfilters;

import javaxservlet*;

import javaioIOException;

/**

*

Filter that sets the character encoding to be used in parsing the

* incoming request either unconditionally or only if the client did not

* specify a character encoding Configuration of this filter is based on

* the following initialization parameters:

*

*

encoding The character encoding to be configured

* for this request either conditionally or unconditionally based on

* the ignore initialization parameter This parameter

* is required so there is no default

*

ignore If set to true any character encoding

* specified by the client is ignored and the value returned by the

* selectEncoding() method is set If set to false

* selectEncoding() is called only if the

* client has not already specified an encoding By default this

* parameter is set to true

*

*

*

Although this filter can be used unchanged it is also easy to

* subclass it and make the selectEncoding() method more

* intelligent about what encoding to choose based on characteristics of

* the incoming request (such as the values of the AcceptLanguage

* and UserAgent headers or a value stashed in the current

* user´s session

*

* @author John Wong

*

* @version $Id: SetCharacterEncodingFilterjavav // :: johnwong Exp $

*/

public class SetCharacterEncodingFilter implements Filter {

// Instance Variables

/**

* The default character encoding to set for requests that pass through

* this filter

*/

protected String encoding = null;

/**

* The filter configuration object we are associated with If this value

* is null this filter instance is not currently configured

*/

protected FilterConfig filterConfig = null;

/**

* Should a character encoding specified by the client be ignored?

*/

protected boolean ignore = true;

// Public Methods

/**

* Take this filter out of service

*/

public void destroy() {

thisencoding = null;

thisfilterConfig = null;

}

/**

* Select and set (if specified) the character encoding to be used to

* interpret request parameters for this request

*

* @param request The servlet request we are processing

* @param result The servlet response we are creating

* @param chain The filter chain we are processing

*

* @exception IOException if an input/output error occurs

* @exception ServletException if a servlet error occurs

*/

public void doFilter(ServletRequest request ServletResponse response

FilterChain chain)

throws IOException ServletException {

// Conditionally select and set the character encoding to be used

if (ignore || (requestgetCharacterEncoding() == null)) {

String encoding = selectEncoding(request);

if (encoding != null)

requestsetCharacterEncoding(encoding);

}

// Pass control on to the next               

上一篇:集成 Struts、Tiles 和 JavaServer Faces

下一篇:全面解析Java中的String数据类型