1. 程式人生 > >Struts2的國際化和訪問資原始檔的幾種方式

Struts2的國際化和訪問資原始檔的幾種方式

資原始檔的命名:basename_language_country.properties

JAVA國際化
如果系統同時存在資原始檔、類檔案,系統將以類檔案為主,而不會呼叫資原始檔。
對於簡體中文的Locale,ResourceBundle搜尋資源的順序是:
(1)baseName_zh_CN.class
(2)baseName_zh_CN.properties
(3)baseName_zh.class
(4)baseName_zh.properties
(5)baseName.class
(6)baseName.properties

Struts2的國際化入門
Struts2國際化是建立在Java國際化的基礎上的,一樣是通過提供不同國家/語言環境的訊息資源,然後通過ResourceBundle
載入指定Locale對應的資原始檔,再取得該資原始檔中指定key對應的訊息--整個過程與JAVA程式的國家化完全相同,只是
Struts2框架對JAVA程式國際化進行了進一步封裝,從而簡化了應用程式的國際化。


Struts2需要國際化的部分
型別轉換:
資料校驗:
驗證框架xml配置檔案的國際化:RegisterAction-validation.xml檔案<message key="username.xml.invalid"/>
JSP頁面的國際化:<s:text name="addUser"/>
Action的國際化:利用ActionSupport類提供的getText()方法.


Struts2中載入全域性資原始檔
struts.xml
<constant name="struts.custom.i18n.resources" value="baseName"/>

struts.properties
struts.custom.i18n.resources=baseName


訪問國際化訊息
Struts2訪問國際化訊息主要有如下三種方式:
(1)JSP頁面:<s:text name="key"/>
(2)Action類中:使用ActionSupport類的getText方法。
(3)表單元素的Label裡:為表單元素指定一個key屬性


輸出帶佔位符的國際化訊息
Struts2中提供瞭如下兩種方式來填充訊息字串中的佔位符
(1)JSP頁面,在<s:text.../>標籤中使用多個<s:param.../>標籤來填充訊息中的佔位符。
(2)Action中,在呼叫getText方法時使用getText(String aTextName,List args)或getText(String key, String[] args)方法來填充佔位符。
除此之外,Struts2還提供了對佔位符的一種替代方式,這種方式允許在國際化訊息資原始檔中使用表示式,對於這種方式,則可避免在使用國際化訊息時還需要為佔位符傳入引數值。
如下在訊息資源中使用表示式
succTip=${username}, 歡迎, 您已經登入!
在上面的訊息資源中,通過使用表示式,可以從ValueStack中取出該username屬性值,自動填充到該訊息資源中。


載入資原始檔的方式
(1)載入全域性資原始檔: <constant name="struts.custom.i18n.resources" value="baseName"/>
(2)包範圍資原始檔 :為Struts2指定包範圍資原始檔的方法是,在包的根路徑下建立多個檔名為package_language_country.properties的檔案,一旦建立了
    這個系列的國際化資原始檔,應用中處於該包下的所有Action都可以訪問該資原始檔。需要注意的是上面的包範圍資原始檔的baseName就是package,
不是Action所在的包名。
(3)Action範圍資原始檔:在Action類檔案所在的路徑建立多個檔名為ActionName_language_country.properties的檔案。
(4)臨時指定資原始檔:<s:i18n.../>標籤的name屬性指定臨時的國際化資原始檔


載入資原始檔的順序
Action中載入資原始檔,假設我們在某個ChildAction中呼叫了getText("user.title"),Struts 2.0的將會執行以下的操作:
(1)優先載入系統中儲存在ChildAction的類檔案相同位置,且baseName為ChildAction的系列資原始檔。
(2)如果在(1)中找不到指定key對應的訊息,且ChildAction有父類ParentAction,則載入系統中儲存在ParentAction的類檔案相同位置,且
   baseName為ParentAction的系列資原始檔。
(3)如果在(2)中找不到指定key對應的訊息,且ChildAction有實現介面IChildAction,則載入系統中儲存在IChildAction的類檔案相同位置,且
   baseName為IChildAction的系列資原始檔。
(4)如果在(3)中找不到指定key對應的訊息,且ChildAction有實現介面ModelDriven(即使用模型驅動模式),則對於getModel()方法返回的model物件,
   重新執行第(1)步操作。
(5)如果在(4)中找不到指定key對應的訊息,則查詢當前包下baseName為package的系列資原始檔。
(6)如果在(5)中找不到指定key對應的訊息,則沿著當前包上溯,直到最頂層包來查詢baseName為package的系列資原始檔。
(7)如果在(6)中找不到指定key對應的訊息,則查詢struts.custom.i18n.resources常量指定baseName的系列資原始檔。
(8)如果經過上面的步驟一直找不到key對應的訊息,將直接輸出該key的字串值。

對於在JSP中訪問國際化訊息,則簡單的多,他們又可以分為兩種形式:
(1)對於使用<s:i18n.../>標籤作為父標籤的<s:text.../>標籤、表單標籤的形式:
   a、將從<s:i18n.../>標籤指定的國際化資原始檔中載入指定key對應的訊息。
   b、如果在a中找不到指定key對應的訊息,則查詢struts.custom.i18n.resources常量指定baseName的系列資原始檔。
   c、如果經過上面步驟一直找不到該key對應的訊息,將直接輸出該key的字串值。
(2)如果<s:text.../>標籤、表單標籤沒有使用<s:i18n.../>標籤作為父標籤:
    直接載入struts.custom.i18n.resources常量指定baseName的系列資原始檔。如果找不到該key對應的訊息,將直接輸出該key的字串值。


允許使用者自行選擇程式語言
Struts2國際化的執行機制
    在Struts2中,可以通過ActionContext.getContext().setLocale(Locale arg)設定使用者的預設語言。
為了簡化設定使用者預設語言環境,Struts2提供了一個名為i18n的攔截器(Interceptor),並且將其註冊在預設的攔截器中(defaultStack)。
    i18n攔截器在執行Action方法前,自動查詢請求中一個名為request_locale的引數。如果該引數存在,攔截器就將其作為引數,轉換成Locale物件,
並將其設為使用者預設的Locale(代表國家/語言環境)。
除此之外,i18n攔截器還會將上面生成的Locale物件儲存在使用者Session的名為WW_TRANS_I18N_LOCALE的屬性中。一旦使用者Session中存在一個名為
WW_TRANS_I18N_LOCALE的屬性,則該屬性指定的Locale將會作為瀏覽者的預設Locale。

<%@ page language="java" contentType="text/html; charset=GBK"%>
<%@taglib prefix="s" uri="/struts-tags"%>
<script. type="text/javascript">
function langSelecter_onChanged()
{
document.getElementById("langForm").submit();
}
</script>

<%-- 設定SESSION_LOCALE為使用者session中的WW_TRANS_I18N_LOCALE屬性值 --%>
<s:set name="SESSION_LOCALE" value="#session['WW_TRANS_I18N_LOCALE']"/>

<%-- 使用lee.Locales建立locales例項 --%>
<s:bean id="locales" name="lee.Locales">
<%-- 為locales例項傳入current引數值,如果SESSION_LOCALE為空,則返回ValueStack中locale屬性值(即使用者瀏覽器設定的Locale) --%>
<s:param name="current" value="#SESSION_LOCALE == null ? locale : #SESSION_LOCALE"/>
</s:bean>

<%-- 讓使用者選擇語言的表單 --%>
<form. action="<s:url/>" id="langForm"
    style="background-color:#bbbbbb; padding-top: 4px; padding-bottom: 4px;">
    <s:text name="languag"/>
<s:select label="Language" list="#locales.locales" listKey="value" listValue="key"
        value="#SESSION_LOCALE == null ? locale : #SESSION_LOCALE"
        name="request_locale" id="langSelecter"
        nchange="langSelecter_onChanged()" theme="simple"/>
</form>

在其他頁面中包含該頁面:
<s:include value="selectlanguage.jsp"/>

在struts.xml檔案中增加Action萬用字元的配置:
<?xml version="1.0" encoding="GBK"?>
<!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
        "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name="struts.custom.i18n.resources" value="messageResource"/>
<constant name="struts.i18n.encoding" value="GBK"/>

    <package name="lee" extends="struts-default">
<!-- 使用萬用字元定義Action的name -->
<action name="*">
   <!-- 將請求轉發給/WEB-INF/jsp/路徑下同名的JSP頁面 -->
   <result>/WEB-INF/jsp/{1}.jsp</result>
</action>
    </package>
</struts>

相關推薦

Struts2國際化訪問原始檔方式

資原始檔的命名:basename_language_country.properties JAVA國際化如果系統同時存在資原始檔、類檔案,系統將以類檔案為主,而不會呼叫資原始檔。對於簡體中文的Locale,ResourceBundle搜尋資源的順序是:(1)baseName_

執行緒同步鎖非同步鎖的方式

同步鎖:當在一個java虛擬機器多個執行緒操作一個變數的時候就會出現執行緒安全問題,這個時候就會用到同步鎖。 同步鎖的解決方式: 先看下一個執行緒異常的售票 public class ThreadSafe { public static void main(String[] arg

如何在 Springboot 獲取 http request http response 的方式

使用Springboot,我們很多時候直接使用@PathVariable、@RequestParam、@Param來獲取引數,但是偶爾還是要用到request和response,怎麼獲取呢? 也很方便

【JavaScript】JS獲取子節點、父節點兄弟節點的方式,附CSS組合選擇器

【一】、JS獲取子節點的方式     1,通過獲取dom方式直接獲取子節點        1) document.getElementById("ID");        2) document.getElementsByTagName("tagName")        

SpringMVC(SSM)獲取網頁資料傳出資料的方式

1.從JSP頁面裡傳資料到SpringMVC中的Controller處理 a.直接讀取表單的資料。在控制器裡的方法裡,按照這種格式寫。 @RequestMapping(value="/login.action")       public void login(HttpSe

Oracle優化-Oracle訪問資料的方式

 ORACLE如何訪問資料1.全表掃描(FullTableScansFTS)為實現全表掃描, Oracle讀取表中所有行,並檢查每一行是否滿足語句的WHERE限制條件一個多塊讀操作可以使一次I/O

swift詳解之二十二-----------UINavigationController的基本用法頁面傳值方式

UINavigationController的基本用法和頁面傳值幾種方式 本文介紹UINavigationController基本用法,因為涉及多頁面順便介紹頁面傳值 1、手寫程式碼建立UINavigationController 手寫方式建立很簡

JAVA關於base64編碼EncodeDecode編碼的方式

關於base64編碼Encode和Decode編碼的幾種方式 Base64是一種能將任意Binary資料用64種字元組合成字串的方法,而這個Binary資料和字串資料彼此之間是可以互相轉換的,十分方便。在實際應用上,Base64除了能將Binary資料視覺化之外,也常用

關於base64編碼EncodeDecode編碼的方式

Base64是一種能將任意Binary資料用64種字元組合成字串的方法,而這個Binary資料和字串資料彼此之間是可以互相轉換的,十分方便。在實際應用上,Base64除了能將Binary資料視覺化之外,也常用來表示字串加密過後的內容。如果要使用Java 程式語言來實作Base

Struts2訪問Servlet API的方式

直接 param text cti ring alt getc nbsp context struts2提供了三種方式訪問servlet API:大致分為兩類 1. ActionContext: public static ActionContext getConte

struts2servlet共存的方法

專案要求struts2和servlet能夠共存,就是struts的請求發給struts處理,servlet的請求發給servlet處理。目前web.xml檔案應該是類似於如下的配置:  <filter> <filter-name>strut

Struts2訪問Servlet API的方式

一:通過ActionContext類 Struts2提供了ActionContext類,struts2可以通過該類來實現與Servlet API的訪問。 ActionContext類提供瞭如下幾種方法

訪問Struts2中的自定義方法的方式

前期準備 首先建立一個待測試的Action,然後在裡面寫一個自定義的方法,如下: package com.struts.trio; import com.opensymphony.xwork2.A

剛開始學習的人非常有用:struts2中將jsp數據傳到action的方式

登錄頁面 sign config print log println amp war htm 先給上struts.xml代碼: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBL

C#網頁采集數據的方式(WebClient、WebBrowserHttpWebRequest/HttpWebResponse)

var complete sys bre nth ews 寫入 保存 new 獲取網頁數據有很多種方式。在這裏主要講述通過WebClient、WebBrowser和HttpWebRequest/HttpWebResponse三種方式獲取網頁內容。 這裏獲取的是包括網頁

讓外界可以訪問電腦上的網站的方式——花生殼,域名,IIS

動態 oca 哈哈哈 手機 log 為什麽 技術 條件 穿透 前話: 每次“養大“一個網站,都有種驕傲地想秀給朋友們看的沖動。 之前可能是困於電腦,實在不方便。 現在,不用克制了! 該秀就秀,能裝逼就裝逼。 養大孩子就該拉出來秀秀,見見世面。 正題:這次實習,我又雙叒叕

js實現跨域訪問方式

bsp 設置 參數 script quest detail XML url 訪問 不同域:協議,域名,端口任何一個不同; 1,jsonp跨域 在js中,我們直接使用XMLHttpRequest請求不同的域上的數據時,是不可以的。但是,在頁面上引用不同域上的js腳本文件確實可

MAC下安裝多版本JDK切換方式

lin 切換jdk版本 ber 方便 ida 不支持 itl 相關 pro 環境: MAC PRO,OS X 10.11.6,64位 歷史: 過去 Mac 上的 Java 都是由 Apple 自己提供,只支持到 Java 6,並且OS X 10.7 開始系統並不自帶(而

ASP.NET MVC下自定義錯誤頁展示錯誤頁的方式

提供服務 one url attribute 運行 16px execute 釋放 namespace 在網站運行中,錯誤是不可避免的,錯誤頁的產生也是不可缺少的。 這幾天看了博友的很多文章,自己想總結下我從中學到的和實際中配置的。 首先,需要知道產生錯誤頁的來源,一種

Spring bean初始化與銷毀的方式區別

pack ack 構造 rop struct service() throws esc println 1. <bean> 元素的 init-method/destroy-method屬性指定初始化之後 /銷毀之前調用的操作方法 2. 指定方法上加上@PostC