Struts1.x系列教程(13):国际化

本文为原创,如需转载,请注明作者和出处,谢谢!

上一篇:Struts1.x系列教程(12):Validator验证框架的内置标准验证

Struts2教程10:国际化


对于一个面向全球的Web应用程序,按着不同国家的要求显示相关信息(称为国际化)显得尤为重要。国际化的工作非常复杂和繁琐。因为要翻译很多Web界面,信息格式等。然而,Struts为我们提供了完成国际化工作的更容易的方式。在本文将介绍如何使用Struts来简化国际化的工作。

一、处理客户端界面的编码问题

由于Web浏览器可以使用不同的编码格式来解析客户端代码,这主要取决于用户的默认设置或偏好。由于存在这种情况,因此,在服务端向客户端发送数据时,就必须使用和客户端一致的编码格式。
通常的做法是使用Internet上比较常用的UTF-8编码,这主要是因为UTF-8编码格式所描述的字符包括了世界上所有以知国家和地区的语言编码。这样服务端就不用根据客户端的编码格式不断地调整服务端响应信息的编码格式了。对于JSP页面来说,可以使用page指定来设置响应信息的编码格式,如下面代码所示:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --> <% @pagecontentType = " text/html;charset=UTF-8 " %>

当然,如果我们在Web程序中使用了Struts框架,还可以在struts-config.xml文件中使用如下的代码来设置编码格式:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --> < controller contentType ="text/html;charset=UTF-8" />

如果使用上面的设置,所有通过.do或<forward>元素访问的页面都会继承这一编码设置。但是如果单独访问JSP页面,就会绕过Struts的这个设置。
对于静态页面(如HTML)来说,需要使用<meta>元素来设置编码格式,如下面代码所示:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --> < head >
< meta http-equiv ="content-type" content ="text/html;charset=UTF-8" >
</ head >

除了使用通用的UTF-8编码格式外,也可以从HTTP请求头字段Accept- Charset中获得客户端的编码格式。然后根据这个编码格式来设置响应信息的编码格式。然而,虽然根据HTML4.0规范,Web浏览器可以设置 Accept-Charset字段,但是有很多浏览器可以会忽略这一字段,因此,只使用这个字段来确定Web浏览器所使用的编码格式是不可靠的。所以最好 的国际化编码格式解决方案仍然是UTF-8。

二、本地化属性文件

本地化最重要的部分就是根据用户所处的语言环境来显示响应语言的界面,如用户在英文操作系统下,就会显示英文界面,如果在中文操作系统下,就会显示中文界面。最理想的情况是这种显示效果的切换是完全透明的。

在Struts中提供了这种技术,使我们可以更容易地实现透明地界面切换。在Struts Bean标签库中有一个<bean:message>标签,它可以根据客户端浏览器所处的语言环境自动选择相应的属性文件来读取界面显示信息。为了演示如何使用<bean:message>以及不同的属性文件来实现国际化的程序。让我们先来看一个例子。

在本例中,选用了三个国家的语言环境(中文、英文和法文)来演示国际化的实现。由于读者可能不便于输入法文,因此,法文信息仍然用中文代替,只是后面多了个“(法文)”作为标识。我们需要如下四步来完成这个例子:

【第1步】建立一个默认的属性文件

在<samples工程目录>\src\struts目录中建立一个application.properties文件,内容如下:
<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --> title = 这是一个国际化的web程序(默认值)
name
= 姓名(默认值)
submit
= 提交(默认值)

application.properties文件是默认的属性文件,如果客户端浏览器所处的语言环境在服务端未找到相应的属性文件,<bean:message>标签就会从application.properties文件中读取字符串信息。
在Eclipse中编辑非ISO 8859-1编码格式的字符时,应使用在《属性(资源)文件乱码问题的解决之道》介绍的两个Eclipse插件,或使用native2ascii.exe命令进行转换。否则在显示属性文件中的信息时会出现乱码。

【第2步】在struts-config.xml文件中配置属性文件

在Struts中所有的属性文件都必须在struts-config.xml文件中配置。否则<bean:message>标签就会由于无法找到相应的属性文件而抛出异常。
为了配置application.properties,需要在struts-config.xml文件中的<struts-config>标签中加入如下的代码:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --> < message-resources parameter ="struts.application" key ="global" />

由于在struts-config.xml文件中已经有一个ErrorDescription.properties作为默认的属性文件,因此,application.properties文件要使用一个key加以标识。在使用<bean:message>标签时必须要使用bundle属性指定这个key才能找到application.properties文件。

【第3步】加入不同语言的属性文件

在这一步我们来加入中文、英文、法文的属性文件。这三个属性文件的文件名如下:

  • 中文:application_zh.properties
  • 英文:application_en.properties
  • 法文:application_fr.properties

将这三个文件放到<samples工程目录>\src\struts目录中。它们的内容如下:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --> application_zh.properties
title
= 这是一个国际化的web程序
name
= 姓名
submit
= 提交

application_en.properties
title
= Thisisaninternationalizationwebprogram.
name
= name
submit
= submit

application_fr.properties
title
= 这是一个国际化的web程序(法语)
name
= 姓名(法语)
submit
= 提交(法语)

这三个属性文件是不需要在struts-config.xml中配置的。Struts会自动根据客户端浏览器所处的语言环境来寻找这三个文件。

【第4步】编写JSP页面

在这个JSP页面中使用了<bean:message>来根据客户端浏览器所处的语言环境来读取相应的属性文件中的内容。在web根目录中建立一个global.jsp文件,代码如下:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --> <% @pagepageEncoding = " UTF-8 " %>
<% @tagliburi = " http://struts.apache.org/tags-bean " prefix = " bean " %>
< html >
< head >
< title > 国际化 </ title >
</ head >
< body >
< bean:message key ="title" bundle ="global" />< p />
< form action ="" >
< bean:message key ="name" bundle ="global" />
< input type ="text" name ="name" />< p />
< input type ="submit" value =<bean:message key ="submit" bundle ="global" /> />
</ form >
</ body >
</ html >

由于安装不同语言的操作系统很不方便,在这里我们采用另一种方法来模拟不同的语言环境测试这个程序。首先在IE中使用【工具】>【Internet 选项】> 【常规】>【语言】来打开“语言首选项”对话框,使用“添加”按钮添加“中文 [zh]”、“英文 [en]”和“法语(法国) [fr]”,再添加一种其他语言,如“梵文 [sa]”。添加后的界面如下图所示。

然后分别将这四种语言上移到列表顶端。然后点击“确定”按钮保存设置。在启动Tomcat后,在IE中输入如下的URL:

http://localhost:8080/samples/global.jsp

根据语言设置的不同,在IE中会显示不同语言的界面,如中文和英文的页面分别如下面两个图所示。




如果在刷新时页面语言未更新,可能是因为IE的Cache的原因,读者可以启一个新的IE窗口,再进行测试。
读者在使用属性文件进行国际化时应注意如下三点:
1. 由于语言还可以继续细分,如中文可以分为简体和繁体,英文也可以分为不同国家或地区的英文,如爱尔兰、澳大利亚等。因此,对于更细化的语言,可以在属性文件后面再加一个代表国家或地区的后缀,如application_zh_TW.properties代表中国台湾所使用的繁体中文,application_en_AU.properties代表澳大利亚英文。Struts在寻找属性文件时,会首先查找带有国家或地区后缀的属性文件,如果这类文件不存在,会继续查找只有语言后缀的属性文件,如果还不存在,最后会读取默认属性文件,也就是application.properties的内容。假设我们在“语言首选项”中选择了“中文(台湾) [zh-tw]”,那么读取文件的顺序(从最左边开始,如果文件不存在,依次读取右边的文件)如下:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --> application_zh_TW.properties>application_zh.properties>application.properties

如果选择的语言是“中文 [zh]”,那么就直接从application_zh.properties开始读取。
2.在建立属性文件时要注意,后缀的连接符为下划线( _ ),而不能用减号( - )。
3. 代表语言的后缀(如zh、fr、en等)必须小写,而代表国家或地区的后缀(如CN、TW、AU等)必须大写。如写成application_ZH_tw.properties是不正确的。
在Struts HTML标签库中的标签中以key为后缀的属性值就是属性文件中的key,如下面的代码所示:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --> < html:submit value ="提交" titleKey ="title" bundle ="global" />

上面的代码将<html:submit>标签的title属性值设为属性文 件的title键的值。但是在<html:submit>标签中的value属性无法使用属性文件中的键值,解决的方法是使用< html:submit>标签的另一种写法,代码如下:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --> < html:submit >
< bean:message key =“title” bundle =“global” />
</ html:submit >

三、实现多种语言界面的Web程序
在上面所讲的国际化只是根据客户端浏览器所处的语言环境来自动设置界面语言。而我们在Internet上会看到很多Web程序在主界面上都提供了对不同语言的选择。在本节我们就来讲一下如何通过编程的方式来干预服务端对属性文件的选择。
实现上,Java使用java.util.Locate类来描述语言,一个Locate类的对象实例就代表一种语言。并且从客户端获得的语言信息使用“org.apache.struts.action.LOCALE”保存在了session中,因此,我们只要在调用<bean:message>或其他使用属性文件的语句之前修改session中保存的Locale对象,就可以达到我们的目的。现在我们来对global.jsp页面进行修改(新建一个文件newGlobal.jsp)。global.jsp中所有的代码都不用动,只需要在第一个<bean:message>标签的前面加上如下的代码:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->
<%
if ( " en " .equals(request.getParameter( " language " )))
session.setAttribute(
" org.apache.struts.action.LOCALE " , new java.util.Locale( " en " ));
else if ( " zh " .equals(request.getParameter( " language " )))
session.setAttribute(
" org.apache.struts.action.LOCALE " , new java.util.Locale( " zh " ));
else if ( " fr " .equals(request.getParameter( " language " )))
session.setAttribute(
" org.apache.struts.action.LOCALE " , new java.util.Locale( " fr " ));
%>
< bean:messagekey = " title " bundle = " global " />

在Web根目录中建立一个mainGlobal.jsp文件,如下面的代码所示:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --> <% @pagepageEncoding = " UTF-8 " %>
< html >
< head >
< title > 多语言支持 </ title >
</ head >
< body >
< a href ="newGlobal.jsp?language=en" target ="_blank" > 英文 </ a >< p />
< a href ="newGlobal.jsp?language=zh" target ="_blank" > 中文 </ a >< p />
< a href ="newGlobal.jsp?language=fr" target ="_blank" > 法文 </ a >
</ body >
</ html >

启动Tomcat后,在IE中输入如下的URL:
http://localhost:8080/samples/mainGlobal.jsp
点击mainGlobal.jsp页面上的三个链接,就会分别显示三种语言的页面。
在Struts Action类中的也可以使用Action类提供的setLocale方法来设置语言。如在execute方法中设置语言的代码如下:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --> setLocale(request, new java.util.Locale( " zh " , " TW " ));

使用setLocale方法设置语言时应注意两点:
1. java.util.Locale的构造方法的第一个参数表示语言,第二个参数表示国家或地区,这两个参数值和属性文件的后缀不同,它不区分大小写,因此,也可以写成如下的形式:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --> setLocale(request, new java.util.Locale( " ZH " , " tw " ));

2.所有经过<forward>元素或.do的程序都会继承setLocale方法设置后的语言,但<action>元素的forward和input属性所指的页面除外。

下一篇:Struts1.x系列教程(14):动态Form



国内最棒的Google Android技术社区(eoeandroid),欢迎访问!

《银河系列原创教程》发布

《Java Web开发速学宝典》出版,欢迎定购

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 这是一个Java异常,表示找不到名为"org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter"的类。这通常是由于缺少相关的依赖库或配置文件引起的。需要检查项目的依赖关系和配置文件,确保所有必需的类和库都正确地配置和加载。 ### 回答2: java.lang.ClassNotFoundException: org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter 是一个Java异常,表示找不到指定的类 "org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter"。 这个异常通常在使用Struts2框架时出现,它是一个过滤器(Filter),用于初始化并执行Struts2的相关操作,例如请求的准备和执行。当程序在运行时无法找到这个类时,就会抛出这个异常。 造成这个异常的原因可能有以下几种: 1. 缺少Struts2库:如果项目中缺少Struts2的相关库文件,就会导致这个异常的发生。解决方法是确保项目中包含了正确的Struts2库文件。 2. 类名错误:检查代码中是否正确引用了"org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter"这个类。可能是大小写或者拼写错误导致无法找到这个类。 3. 库版本不兼容:如果项目使用的Struts2库版本与代码中引用的版本不匹配,也会导致无法找到类的异常。确保使用的库文件与代码兼容。 解决这个异常的方法包括: 1. 检查项目中是否正确引入了Struts2库文件,确保库文件完整且匹配。 2. 检查代码中对StrutsPrepareAndExecuteFilter类的引用是否正确,包括大小写和拼写。 3. 如果使用的是不同版本的Struts2库,可以尝试更新代码或使用相应的库文件版本。 总之,java.lang.ClassNotFoundException: org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter是一个表示找不到指定类的异常,解决方法是确保项目引入了正确的Struts2库文件并正确引用该类。 ### 回答3: java.lang.ClassNotFoundException: org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter是一个java异常,表示找不到org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter类。 这个异常通常发生在使用Struts2框架时,StrutsPrepareAndExecuteFilter类在类路径上找不到。这意味着项目缺少相应的依赖库或配置文件。 解决这个异常的方法可以是: 1. 检查项目的依赖库,确保项目中包含了Struts2框架所需的所有jar文件。 2. 检查项目的web.xml配置文件,确保正确配置了StrutsPrepareAndExecuteFilter过滤器。 3. 如果项目使用的是Maven或Gradle等构建工具,可以尝试重新生成和导入依赖。 如果以上解决方法都没有效果,可能还需要考虑以下几点: 1. 项目中是否存在其他版本的Struts2库,可能会导致冲突和类加载失败。 2. 确认项目中的类命名、包名和路径是否正确,是否与异常信息中所报错的类名一致。 3. 检查开发环境是否配置正确,尝试重新启动开发环境或IDE。 总之,java.lang.ClassNotFoundException: org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter异常是由于缺少相关类文件或配置导致的,需要仔细检查项目配置、依赖库和类路径,以确保正确加载所需的类文件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值