[摘 要] 隨著經濟全球化的深入,電子商務網站對多語言的支持非常必要。常規的多語言解決方案通常采用靜態方式,該方式具有實現簡單,訪問快速的優點,但是局限性很大,已經越來越不適應今天已然變得極為繁雜龐大的電子商務整體解決方案的需要。動態多語言技術可以有效地解決這些局限性。本文分析了動態多語言技術的原理和特點,詳細闡述了如何實現基于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方法的設置。把\\Webapps\\servlets-examples\\Web-INF\\classes\\filters\\SetCharacterEncodingFilter. 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.