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編碼Encode和Decode編碼的幾種方式
關於base64編碼Encode和Decode編碼的幾種方式 Base64是一種能將任意Binary資料用64種字元組合成字串的方法,而這個Binary資料和字串資料彼此之間是可以互相轉換的,十分方便。在實際應用上,Base64除了能將Binary資料視覺化之外,也常用
關於base64編碼Encode和Decode編碼的幾種方式
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
struts2和servlet共存的幾種方法
專案要求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、WebBrowser和HttpWebRequest/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