卢 鹏
[摘 要] 随着经济全球化的深入,电子商务网站对多语言的支持非常必要。常规的多语言解决方案通常采用静态方式,该方式具有实现简单,访问快速的优点,但是局限性很大,已经越来越不适应今天已然变得极为繁杂庞大的电子商务整体解决方案的需要。动态多语言技术可以有效地解决这些局限性。本文分析了动态多语言技术的原理和特点,详细阐述了如何实现基于Struts和MVC模式的Web程序的动态多语言机制,并且介绍了其在电子商务网站中的具体实现技术。
[关键词] 动态多语言;Struts;MVC模式;电子商务;应用
doi : 10 . 3969 / j . issn . 1673 - 0194 . 2009 . 20 . 036
[中图分类号]F724.6;TP31 [文献标识码]A[文章编号]1673-0194(2009)20-0097-03
1 静态多语言解决方案
随着电子商务企业与全球各地客户的交流和商务往来的频繁和深入,电子商务网站提供多语言的支持已经非常普遍和广泛。在多语言解决方案的初期,由于业务需求,系统架构的相对简单和技术上的约束,企业一般采用的多语言实现技术是静态多语言解决方案。这种方式就是为每种语言分别准备一套页面文件,用户选择了需要的语言后,网站自动跳转到相应的页面,其他链接也是按照同样方式处理。
这种静态的多语言技术有它的可取之处和产生的时代背景。一方面,早期的电子商务网站业务相对单一,应用相对简单,甚至仅仅是采用纯粹的静态页面来构建整个网站。另一方面,使用静态多语言处理技术实现起来很方便,用户访问网站也相对比较快速。但是,它也有很多弊端,尤其是随着电子商务的飞速发展,现在的电子网站已经远远不是简单的信息展示和商品罗列,而是包含了复杂的交互处理和业务逻辑,而且需要随着企业的发展进行快速频繁的变动和调整。在此背景下,静态多语言解决方案已经越来越不适应当今电子商务网站对于多语言支持的需求,其局限性可以归纳为:①浪费了大量系统空间。很多页面信息与语言无关,准备多套页面导致这些信息大量重复,浪费了系统空间。②非常不利于维护和扩展。网站发生变更时,需要做大量的页面修改和维护工作。③对于高度动态的网站很难支持。大量网站的信息和数据来自于数据库的动态支持,很难使用简单的静态页面来提前做好多语言支持工作。
动态的多语言解决方案则能有效解决上述局限性。它的工作原理是:在页面上输出与语言版本有关的地方采用语言变量来表示,再根据用户不同的语言环境给语言变量赋予不同的值,从而能够实现在不同的语言环境下输出不同的语言提示信息。例如:语言变量“@title”,当用户选择的语言是英语时赋值为“Title”, 当用户选择的语言是简体中文时赋值为“标题”,这样就可以适应不同语言时的输出。通过以上的分析我们可以看出:采用动态的多语言支持技术时所有的显示页面只有一份,只有与语言相关的信息分成多个文件保存,系统根据用户的语言环境动态生成页面的提示信息。这种方法节省了系统空间,具有良好的可维护性和可扩展性。
2 基于Struts和MVC模式的动态多语言实现
开源框架Struts是Apache软件组织提供的一个开放源代码项目,它为Java Web应用提供了模型-视图-控制器(Model-View-Controller,MVC)模式,与Java技术最常用的Web服务器Tomcat配合使用。同时它还提供了许多可供扩展和定制的地方,使得应用程序可以方便地扩展框架,以更好地适应用户的实际需求。此外,Struts还提供了完善的国际化功能,使开发人员能方便地实现国际化的Web应用程序。目前,Struts和MVC模式由于其技术先进性,性能稳定,免费和灵活,已经成为基于Java语言的电子商务网站构建的主流技术。本文将以Struts和MVC模式为基础,详细阐述动态多语言解决方案的具体实现。
2.1 服务器端的设置(Server)
目前,最常使用的数据传送方式有两种:第一种是GET,它将表单内容附加URL之后,中间用问号连接,然后传送至指定的程序作处理;第二种传送方式为POST,这个方法是将表单内容作为一个数据体而不是URL的一部分传送给服务器的,所以URL中看不到表单内容。Tomcat Web Server对这两种参数处理的方法都采用了缺省的ISO-8859-1编码,当在服务器端用Request的getParameter( )方法获得非英文的数据时返回的是乱码,因此应将ISO-8859-1改为UTF-8以支持多种语言。如果在JSP文件中未指定
在Tomcat 5中,两种参数传递方法的编码方式修改是不一样的:
(1)POST方法的设置。把Webappsservlets-examplesWeb-INFclassesfiltersSetCharacterEncodingFilter. class文件拷到Webapp目录/filters下,再在Web.xml里加入对过滤器的调用即可。SetCharacterEncodingFilter类接受一个encoding参数,用来指定编码方式。加入这个过滤器之后,用户所有的HTTP请求都先经过编码方式过滤后再进行处理,保证了编码的一致性。
(2)GET方法的设置。打开Tomcat的server.xml文件,找到Connector区块,加入如下一行:URLEncoding= “UTF-8”,来解决用GET方式提交请求时出现乱码的情况。
至此Tomcat服务器端的编码设置工作完成。
2.2 视图层的设计(View)
要实现Web程序的国际化,在网页中不能出现和特定语言相关的信息,网页中的提示信息必须都放在相应的资源文件中。在Struts-config.xml中配置message-resources,指定资源文件。例如:ApplicationResources.properties (英文资源文件)中存放系统使用英文环境时使用的提示信息,而ApplicationResources_zh.properties(简体中文资源文件)中存放的是系统使用简体中文环境时使用的提示信息。在前端视图层中使用Struts提供的bean:message标签来从资源文件中获得提示信息。Struts会根据用户终端的Locale信息调用相应的资源文件,而达到支持多种语言的目的。
2.3 控制层的实现(Controller)
Java虚拟机在启动的时候会查询操作系统,为运行环境设置默认的Locale。Web Server在其本地环境中通常会使用以上的Locale;而对于特定的终端用户,Web Server会从HTTP请求中获取Locale信息。由于Web服务器并不和客户端浏览器保持长期连接,因此每个发送到Web容器的HTTP请求中都包含了Locale信息。Struts配置文件的
编写一个LocaleAction.java类,LocaleAction类接受两个参数language和country,分别表示转换语言后的语言和国家。在需要添加改变语言的网页中添加发出执行LocaleAction.java的动作,并传入language和country的值,以实现支持动态改变显示语言的功能。
2.4 模型层的设计(Model)
(1)常规数据库的设计。因为要支持多语言信息,所以数据库表的组织对于系统的维护也是影响相当大的。由于系统中有大量和语言环境无关的信息,如果在数据库级别上支持多语言就会造成大量信息冗余,浪费系统空间,并且多数据库的访问也会增加系统的复杂性。在字段级别上支持多语言会使数据库表的结构严重依赖系统的语言设置,当需要修改或增加语言时,会造成数据库中表字段的改变,可扩展性不好。所以在常规数据库设计中,一般采用“表级别”的多语言支持。在表级别上支持多语言,把所有与语言无关的信息都保存在一张表中,只有和语言相关的信息才保存到相应的表中。这样做不但节省了空间,并且在增加语言时只需要再建立一份相应语言表的信息即可,可维护性和可扩展性都非常好。
(2)数据库的编码设置。由于数据库要存储多语言的数据,前台的网页和程序选用的编码方式是UTF-8,因此后台数据库的编码方式也应该是UTF-8。在建立数据库时要声明数据库以及数据库中表所采用的编码方式为UTF-8,这样就避免了出现前后编码不一致的现象。
3 应用实例
某旅游电子商务网站需要实现对简体中文、繁体中文、英语、日语共4种语言的支持。它采用了Apache Tomcat 5.5作为Web服务器,以Jakarta—Struts1.2.7来实现MVC框架。使用基于Struts和MVC模式的多语言解决方案。
(1) 视图层。对Struts提供4种语言的资源文件,以供实现多语言。分别为:
ApplicationResources-en.properties(英语),
ApplicationResources-zh.properties(简体中文)
ApplicationResources-tw.properties(繁体中文)
ApplicationResources-jp.properties(日语)。
系统的视图层应用的是JSP技术,在显示语言信息的时候用bean:message标签引用相应资源文件。例如要显示标题则使用
(2)控制层。使用SetCharacterEncodingFilter和LocaleFilter这两个过滤器来完成编码方式的转换和Action信息的保存,使用LocaleAction类来实现语言环境的改变。
(3)模型层。由于该系统采用的数据库是Mysql,所以定义数据库和表时应采用如下方式:
CREATE DATABASE table_name DEFAULT CHARACIER SET UTF8;
CREATE TABLE ′table_name′(……)ENGINE=InnoDB DEFAULT CHARSET=UTF8;并且还要使用set names UTF-8来声明在使用mysql时接受客户端连接、查询和返回结果的字符集均为UTF-8。
(4)增加新的语言支持。在视图层中添加新的资源文件;在控制层对LocaleAction类进行扩展;在模型层,增加新的表结构来存储新语言的数据记录。这样可以很方便和清晰地增加对新语言的支持。
(5)修改与语言有关的信息内容。只需要修改视图层的资源文件和模型层的相关表数据即可,大大降低了网站的维护工作量,提高了系统的可维护性。
4 结 语
Web应用程序的多语言化支持是电子商务技术发展的必然结果,动态多语言技术相比传统的静态方案有着许多的优点。在未来的发展中,动态多语言技术将会得到更广泛的应用。但是在动态多语言技术中,语言信息是动态生成的,所以会占用系统资源,导致系统执行的速度减慢。这个缺点可以结合其他网站构建技术和性能优化技术予以解决。在实际应用过程中,应综合考虑多种因素,制订出切实、有效、可行的多语言支持解决方案。
主要参考文献
[1] 孙卫琴. 精通Struts:基于MVC的JavaWeb设计与开发[M]. 北京:电子工业出版社,2004.