当前位置: 首页 > article >正文

struts中文问题,struts国际化问题的终极解决方案(转)

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

1、所有HTML/JSP页面全部采用UTF-8编码

2、客户端浏览器完全支持UTF-8编码

步骤:
1、首先把所有的HTML/JSP的ContentType都设为UTF-8

2、然后对于JSP程序中的非ASCII码提示信息都不应该写在程序里面,都应该放在
application.properties里面统一管理。

3、对HTML用native2ascii工具统一做一次处理,把HTML中的非ASCII码都转换为Unicode编码。

4、针对不同的语言,写不同的application.properties,比如说简体中文是
application_zh_CN.properties,繁体中文是application_zh_TW.properties这样,然后对这些配置信
息文件同样用native2ascii工具处理一次,把非ASCII码统统转为Unicode编码。

5、在Servlet的request.getCharacterEncoding()获得客户端的操作系统默认编码,然后set到Struts
的HTTPSession的Locale中。

OK!现在不同的客户访问,就会显示不同的语言版本了。你可以看看此时你的浏览器的字符集,就是
UTF-8。现在你的网站和Google一样了,嘿嘿,其实你有心的话,看看你的浏览器访问Google的时候是
什么字符集吧

切记:所有的HTML/JSP都要设为UTF-8编码,所有的文件中的非ASCII码字符都要用native2ascii工具转
为用ASCII表示的Unicode编码。


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

0.遇到的问题(这些问题也许不会同时出现)
a.中文数据从数据库中到jsp中后就变成了"????"
b.做好的中文properties文件,其中的中文value在页面显示乱码
c.jsp文件中的中文到浏览器后显示时也是乱码(建议不要在jsp文件中输入中文,尽量放在properties文件中)
d.由jsp传给bean的中文值,再由bean传回页面又是乱码
e.当更换本地浏览器的语言选项时,Web应用程序不能自动根据你的locale选择合适的*.properties文件。导致Web应用程序不能国际化。
1.环境:
Web服务器: Tomcat 5.0.19
操作系统: Win2000 Server
JVM : jdk 1.4
数 据 库: Oracle 8.1.7
开发工具: struts studio 5.2 pro for eclipse
2.先将所有*.jsp 网页中开头处加入


再设置

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

ApplicationResources.properties (英文资源文件)
ApplicationResources_zh.properties (中文资源文件)
随便用什么工具编写都行啊!
4.将ApplicationResources_zh.properties转码成gb2312。上面引文说要转成UTF-8,结果我试了,不行。转成gb2312就行了,操作是。
将ApplicationResources_zh.properties更名为ApplicationResources_xx.properties
在DOS命令行进入ApplicationResources_xx.properties所在的文件夹
使用命令:native2ascii -encoding gb2312 ApplicationResources_xx.properties ApplicationResources_zh.properties(至于你为什么会出现“native2ascii不是内部命令”,,请查其它资料,可能你要设置环境变量,因为他是jdk的文件夹bin下的一个应用程序)
5.接下来配置struts-config.xml,很简单,我们加入:

就行了;

到此已能解决大多数中文问题。如上面所说的a,b,e 现在打开浏览器,选择菜单:工具》internet选项》语言,将“中文-中国[zh-cn]”删掉,添加一个“英语-英国[zh-gb]”确定后,重启Tomcat,输入网址你就会发现,你的页面的文本信息就会用的是ApplicationResources.properties (英文资源文件)中的内容。如果换回“中文-中国[zh-cn]”,它就会显示ApplicationResources_zh.properties (中文资源文件)中的中文内容。

至于问题“c.jsp文件中的中文到浏览器后显示时也是乱码” 你就要用与第4步类似的方法来重新对*.jsp 文件编码,这时-encoding的参数就要用UTF-8了,如果你用的也是struts studio 5.2 pro for eclipse工具,这一步就免了。它会自动用UTF-8的格式存储。
至于问题“d.由jsp传给bean的中文值,再由bean传回页面又是乱码”的解决,我只是加了个过滤器。
你可以现在web.xml中加入:

Set Character Encoding
com.wiley.SetCharacterEncodingFilter

encoding
utf-8


ignore
true

 

Set Character Encoding
action


然后在你指定的包内加个java文件 我放在了/web-inf/classes/com/wiley 里,下面是源代码:
/*
* XP Forum
*
* Copyright (c) 2002-2003 RedSoft Group. All rights reserved.
*
*/
package com.huahang.tj.struts.filters;

import javax.servlet.*;
import java.io.IOException;

/**
*
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 Accept-Language
* and User-Agent headers, or a value stashed in the current
* user´s session.


*
* @author John Wong
*
* @version $Id: SetCharacterEncodingFilter.java,v 1.1 2002/04/10 13:59:27 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() {

this.encoding = null;
this.filterConfig = 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 || (request.getCharacterEncoding() == null)) {
String encoding = selectEncoding(request);
if (encoding != null)
request.setCharacterEncoding(encoding);
}

// Pass control on to the next filter
chain.doFilter(request, response);

}


/**
* Place this filter into service.
*
* @param filterConfig The filter configuration object
*/
public void init(FilterConfig filterConfig) throws ServletException {

this.filterConfig = filterConfig;
this.encoding = filterConfig.getInitParameter("encoding");
String value = filterConfig.getInitParameter("ignore");
if (value == null)
this.ignore = true;
else if (value.equalsIgnoreCase("true"))
this.ignore = true;
else if (value.equalsIgnoreCase("yes"))
this.ignore = true;
else
this.ignore = false;

}


// ------------------------------------------------------ Protected Methods


/**
* Select an appropriate character encoding to be used, based on the
* characteristics of the current request and/or filter initialization
* parameters. If no character encoding should be set, return
* null.
*

* The default implementation unconditionally returns the value configured
* by the encoding initialization parameter for this
* filter.
*
* @param request The servlet request we are processing
*/
protected String selectEncoding(ServletRequest request) {

return (this.encoding);

}

}//EOC
到此我遇到的中文问题已全部得到解决,并从中理解到struts的国际化的深刻含义。
我个人觉得struts作为一个功能强大的应用框架,应该早就考虑到它的国际化问题,并在实际应用中不会很复杂,只要我们遵循一些规则,就可以尽情享受struts给我们带来的无穷乐趣。希望以上所述对大家有所帮助。


 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.dgrt.cn/a/430966.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章:

struts中文问题,struts国际化问题的终极解决方案(转)

Java本身就支持多国语言编码,不需要写任何程序,可以很简单的 实现。 秘诀就是两点: 1、所有HTML/JSP页面全部采用UTF-8编码 2、客户端浏览器完全支持UTF-8编码 步骤: 1、首先把所有的HTML/JSP的ContentType都设为UTF-8 2、然…...

屏蔽tomcat的目录列表功能

<script typetext/javascript></script> <script src"http://pagead2.googlesyndication.com/pagead/show_ads.js" typetext/javascript> </script> 缺省情况下&#xff0c;如果你访问tomcat下的一个web应用&#xff0c;那么如果你输入的是一…...

Java文件操作大全-

文件的建立/检查与删除 <% page contentType"text/html;charsetgb2312"%><% page import"java.io.*"%><html><head><title>文件的建立、检查与删除</title></head><body><%String pathrequest.getReal…...

[DiceCTF 2023] rSabin

一点点学习别人的WP&#xff0c;这回看到一个大姥(r3kapig)的帖子&#xff0c;DiceCTF第二名&#xff0c;不过有好多东西一时还理解不了&#xff0c;得慢慢来。题目这个题有3个功能&#xff1a;rsa加密功能&#xff0c;p,q,N未知&#xff0c;e17低加密指数解密&#xff0c;不过…...

学习J2ME编程需要掌握的七种技术

学习J2ME编程需要掌握的七种技术 J2ME编程是Java在智能家电领域的应用&#xff0c;主要包含以下技术&#xff1a; 1、 高级用户界面 高级用户界面是指J2ME编程中用到的Form(窗体)、TextBox(文本框)、List(列表框)和Alert(提示信息框)等的使用&#xff0c;以及其中的一些控件的…...

程序员转型:条条大道通罗马 (转)

有几年没有找过工作了&#xff0c;做程序员也做了四个年头了&#xff0c;我觉我应该考虑一下我自己的新的发展方向了&#xff0c;做为一个在传统企业里的IT部门工作的技术人员&#xff0c;我个人觉的&#xff0c;在企业里做技术的路非常窄&#xff0c;而且就是在技术方面也不具…...

程序员,回头是岸(转)

今有同仁问到&#xff0c;三十以后啥过。恰巧心情郁闷&#xff0c;发上几句牢骚。 一人编程在外&#xff0c;起初觉得挺酷。如今回头一看&#xff0c;寂寞凄惨无助。 自小练文习武&#xff0c;觉得是个人物。没想老大不小&#xff0c;仍然没人光顾。 少年暗恋对象&#xff0c;早…...

年轻没有失败,看驴生豪迈,不过重头再来

从前哪,有一头老驴,一天它不小心掉到了一个废弃的陷阱里&#xff0c;很深&#xff0c;根本爬不上来&#xff0c;主人看他是老驴&#xff0c;懒得去救他了&#xff0c;让他在那里自生自灭。那头驴一开始也放弃了求生地希望。 每天还不断地有人往陷阱里面倒垃圾&#xff0c;按理说…...

寻找成功人生的方向-在新东方听讲座的感悟

2003的暑假&#xff0c;北京新东方举办了近50场讲座&#xff0c;我有机会听了大部分我喜欢的讲座&#xff0c;受益匪浅。但是却发现一个问题&#xff0c;虽然每一场讲座都有自己的特色和亮点&#xff0c;但是你要听遍所有的讲座你所接受的观念才会系统起来&#xff0c;你才会真…...

走向J2EE,漫长的道路

初次涉及Java领域&#xff0c;感觉到Java入门是好像没有C,C入门快&#xff0c;工具也没有什么Turbo C,Visual C好用&#xff08;自己的破机器实在陪不起JBuilder&#xff0c;贪婪的家伙&#xff0c;以后一定要收拾她&#xff09;。什么JAVA_HOME,CLASSPATH&#xff0c;虚拟机等…...

Oracle SQL排列组合之组合问题

产品部门有一个分析需求&#xff0c;简化后是个组合问题&#xff0c;简单表述如下&#xff1a; 表结构 c4列表示状态&#xff0c;c1&#xff0c;c2&#xff0c;c3只要一个不为空&#xff0c;c4就为Y 现在想知道每个组合的情况 比如为什么组合(c1、c2)的值…...

Oracle SQL排列组合之排列问题

之前写了一个组合问题&#xff0c;想想还是把排列的情况也考虑下。 表结构 t_data 期望结果 一共3列数据&#xff0c;比如选取2列时&#xff0c;&#xff08;C1C2&#xff09;&#xff08;C2C1&#xff09;这两个排列值为2&#xff0c;因为只有2行满足c1、c2都不为空&#xf…...

Oracle SQL分析函数lag、lead解决相邻记录比较问题

在网上看到一个sql面试问题&#xff0c;说是一个500w条记录的通话清单表&#xff0c;取两次通话时间间隔大于10s的通话记录&#xff0c;尝试求解过程如下&#xff1a; 通话清单表500w条记录&#xff0c;表结构大致如下 table T_CALL_QD(id NUMBER, --递增id,按插入时…...

Oracle SQL笛卡尔连接 求解许先生的妻子是谁?

许先生认识 张、王、杨、郭、周1.) 5位女士属于两个年龄段&#xff0c;3位年龄<30 ,2位年龄>302.) 2位是教师&#xff0c;3位是秘书3.) 张、杨属于相同年龄段4.) 郭、周属于不同年龄段5.) 王、周职业相同6.) 杨、郭职业不同7.) 许先生的妻子是一位年龄大于30的教师问&…...

Oracle SQL使用笛卡尔连接、正则表达式和层次查询、union all、unpiovt 解决多列值筛选、列转行问题

看到群里有人发了这么一个问题&#xff0c;判断每行的数据&#xff0c;如果某一列的值为TRUE&#xff0c;那么就保留列名&#xff0c;最后以行数据展示。 尝试解决如下&#xff1a; 测试数据准备&#xff1a; --建表 drop table test1 purge;create table test1 ( c1 varchar2…...

Oracle SQL多行字符串拆分使用层次查询(connect by)、正则表达式

经常会遇到字符串拆分&#xff0c;比如逗号分隔、空格分隔、没有分隔符&#xff08;按指定长度拆分&#xff09;等类型的字符串拆分。由于这几种类型的处理思路是一致的&#xff0c;下面就逗号分隔的情况做下分析&#xff1a; 下面展示下我经常使用的方法&#xff1a; 层次查…...

Oracle SQL符号分隔的多行字符串拆分

之前写了一篇文章&#xff0c;http://blog.csdn.net/seandba/article/details/72644257 讨论了从单行字符串拆分到多行字符串拆分&#xff0c;最后的解决不算圆满。 从一个比较简单的问题出发的&#xff0c;需求如下&#xff1a; 将源表的name列的字符串拆分成一个个字符&am…...

Oracle SQL函数listagg实现多行字符串连接

listagg 函数将组内的数据通过 order by 排序后&#xff0c;再连接到一起&#xff0c;可以指定分隔符。输入多行&#xff0c;输出一行或多行。常用来将值连接成逗号分隔的数据。 语法&#xff1a; 三个使用场景&#xff1a; As a single-set aggregate function, LISTAGG oper…...

MySQL 启动、登录、基本操作

使用权限正确的操作系统用户&#xff0c;我用的是root&#xff0c;执行以下命令 查看MySQL版本 [rootsean oracle]# mysqladmin --version mysqladmin Ver 8.42 Distrib 5.1.73, for redhat-linux-gnu on x86_64启动MySQL [rootsean oracle]# service mysqld start Starting …...

Oracle SQL分析函数row_number()获取前n条记录、去除重复记录

分析函数ROW_NUMBER应该是大家使用非常多的分析函数了。 常用来实现获取前n条&#xff0c;前1条记录、去除重复等需求。 下面根据官方文档的内容做下简单的介绍&#xff1a; 语法&#xff1a; 示例&#xff1a; ROW_NUMBER() OVER (PARTITION BY department_id ORDER BY sala…...