struts1.3的國際化?

Tags: 檔案, 版本,

在學struts2之前先把struts1大概的學習一下,雖然說兩者相差很大,但是大致的思想都是差不多的,也對於之後學習struts2會有幫助。這裡主要分享一下struts1.3的國際化實現,1.3也差不多是struts1中的最新或者是最後的版本了,也跟之前的版本小有區別。我做之前也在網上搜了很多,大都是千篇一律,但是其實都漏了很多,根本實現不了,而且都沒怎麼講原理,或者是struts內部到底是怎麼實現的,我待會都會說一下,有不妥的望高手指正。
上面圖片的英文還沒弄。

struts1.3的國際化

struts1.3的國際化

工具/原料

需要的類庫及工具

*struts1.3的jar包,直接去apache的官網上去下,最好是下的完整包,包含原始碼(

*然後工具我用的是eclipse的J2EE版

*伺服器用的是apache-tomcat 6

步驟/方法

首先可以再eclipse裡新建一個Dynamic web project,怎麼建不說了。然後把這個專案對應到你的tomcat伺服器上,對好以後最好先測試一下,能不能用。

然後要把struts用到的核心jar檔案放到新建專案的web目錄下的lib目錄裡,由於struts你開啟裡面的包的話是有很多很多的,但是我們現在只需要基礎核心的jar包,因為只是做一個簡單的例子,所以我們就直接把struts給的簡單例子裡用到的lib複製到當前專案的lib裡。解壓你的struts1.3.10壓縮包,然後然後開啟裡面的apps目錄,選擇struts-blank-1.3.10例子進行解壓,把裡面的的web-inf下的lib裡德jar包全部拷到當前專案下的lib下。拷貝好以後把eclipse下的專案重新整理一下就可以了。此時專案在eclipse中的大致結構

struts1.3的國際化

struts1.3的國際化

先看一下我的頁面的國際化實現的程式碼,首先是原始碼
裡面的 就是實現的不同語言文字的標籤,一般都是用 標籤來實現,key就是你所儲存的國際化檔案裡的key
如上圖可以找到register.languagezh用英文是CHINESE,對於英文檔案倒好辦,但對於中文檔案就不能直接在等號後面寫中文,需要通過java\bin(你的jdk目錄)目錄下的native2ascii.exe程式來轉化,在cmd中輸入native2ascii RegisterResourcesTemp.properties gb2312 RegisterResources_zh_CN.properties temp檔案就是直接包含中文的檔案,gb2312是temp檔案編碼形式,這個根據你儲存時確定的,後面的就是新生成的中文版的資原始檔
當然你的頁面必須得utf-8編碼的,不然就不能顯示了。至於這些檔案怎麼讓struts找到,那當然要在配置檔案裡配置,這個待會說。然後再看一下實際瀏覽器裡的原始碼

struts1.3的國際化

struts1.3的國際化

struts1.3的國際化

struts1.3的國際化

現在看一下配置檔案,先是web.xml,

struts1.3demo1

/home/register.jsp


ServletAction
org.apache.struts.action.ActionServlet

config
/WEB-INF/struts-config.xml

2


ServletAction
*.do

、、、、、ActionServlet就是所有的請求都會經過這裡,然後在給別的action類進行處理,上面也包含了初始化時的config引數,他的value就是struts配置檔案所在的位置,這裡跟web.xml在同一目錄,下面的servlet-mapping就是所有的.do操作都會對映到actionservlet來處理,然後是struts-config.xml配置檔案
"-//Apache Software Foundation//DTD Struts Configuration 1.2//EN"
"http://struts.apache.org/dtds/struts-config_1_3.dtd">









scope="request">


form-bean裡我們用的是DynaActionForm,下面包含幾個引數,language就是語言引數,我們在上面的瀏覽器程式碼裡可以看到傳遞了一個language引數,country是國家引數,我們沒傳,下面的page就是處理好後要傳回的頁面,這裡還是註冊介面,只不過語言改掉了。action的處理類是用的struts自帶的簡易的LocaleAction類來處理的,下面的message-resources標籤就是告訴struts去哪裡找到國際化資原始檔,parameter引數就是他的位置,這裡的寫法跟類的寫法一樣,speak是一個包,裡面還有很多的類,resources是speak下的目錄,裡面包含了了國際化資原始檔,這裡就直接寫了RegisterResources,而沒有加什麼_CN這些的,這裡就是資原始檔的寫法,name_language_country.properties,就是檔名加上語言加上國家,後面可以省略部分

簡要的說一下原理,為什麼用 標籤可以,這裡當編譯器編譯這個jsp檔案時,遇到這些標籤他就會把這標籤轉成成相應的類,建立相應的物件,再根據裡面的屬性去做相應的處理,你可以到struts的原始碼src目錄裡的struts-1.3.10\src\taglib\src\main\resources\META-INF\tld裡面就是4個標籤檔案,在main下的java目錄裡就是相應的一系列處理這個標籤檔案的java類,我看了下里面的處理,他是如何去找到資原始檔,如何找到相應的key,裡面各種類的呼叫實在是太多了,我就不寫了,有興趣的可以自己去看看,總之他是通過Locale物件來確定當前的語言環境,再去尋找相應的語言檔案,然後再輸出來。

我們再看看上面的LocaleAction是怎麼實現的,然後我們可以根據這個簡單的實現在這上面進行一些改進以實現自己的目的,它的類宣告public final class LocaleAction extends BaseAction {}一個final類繼承BaseAction類,所有的action都會繼承baseaction。然後private Log log =
LogFactory.getFactory().getInstance(this.getClass().getName());這段當然是用來日誌記錄的,不管它。接下來就是最重要的execute方法,簡要的解釋一下:public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
// Extract attributes we will need
HttpSession session = request.getSession();//先去得到session
Locale locale = getLocale(request);//這個應該是父類的方法,通過request得到locale
String language = null;//這裡就是配置檔案裡的三個引數了
String country = null;
String page = null;
try {//分別去獲得三個引數的值,form就是那個DynaActionForm物件
language =
(String) PropertyUtils.getSimpleProperty(form, "language");
country = (String) PropertyUtils.getSimpleProperty(form, "country");
page = (String) PropertyUtils.getSimpleProperty(form, "page");
} catch (Exception e) {
log.error(e.getMessage(), e);
}
boolean isLanguage = ((language != null) && (language.length() > 0));
boolean isCountry = ((country != null) && (country.length() > 0));
if ((isLanguage) && (isCountry)) {//如果都不會空的話,就建立新的locale物件
locale = new java.util.Locale(language, country);
} else if (isLanguage) {
locale = new java.util.Locale(language, "");//沒有國家的話直接就是語言locale
}
session.setAttribute(Globals.LOCALE_KEY, locale);吧新的locale放到session裡,這樣放回過去,就可以根據新的locale來實現國際化了
if (null == page) {
return mapping.findForward("success");
} else {
return new ActionForward(page);//返回到page,就是還是之前的註冊頁面
}
}

差不多一個簡易的struts國際化就這樣搞定,至於自己要實現跟多的功能就靠自己去摸索了,我想struts2的國際化也差不多吧,連線了大致的原理,用起來就快了。希望對大家有幫助。

注意事項

相關問題答案