因為希望把SpringSide搞成國際化項目
i
n就成了必做的事情
照抄appfuse
折騰了很久後才發現appfuse式的sample總是只顧著演示自己的一畝三分地而忽略了很多其他東西
從基礎開始
沒有Spring時
Java的i
n是這樣的
jsp環境
首先寫一個messages
zh_CN
properties文件
放在class
path也就是/WEB
INF/classes裡 welcome=歡迎 然後用native
ascii
exe把它轉為 welcome=\u
b
\u
fce
在web
xml中定義messages文件 <context
param>
<param
name>javax
servlet
jsp
jstl
fmt
localizationContext</param
name>
<param
value>messages</param
value>
</context
param>
最後在jsp裡使用
<%@ taglib uri=
prefix=
fmt
%>
<fmt:message key=
welcome
/>
如果有多個Resource Bundle文件
就要在jsp裡用<ftm:bundle>定義了
pure Java環境
ResourceBundle rb = ResourceBundle
getBundle(
messages
);
String welcome = rb
getString(
welcome
);
Spring的增強及appfuse的做法
Spring增加了MessageSource的概念
一是ApplicationContext將充當一個單例的角色
不再需要每次使用i
時都初始化一次ResourceBundle
二是可以代表多個Resource Bundle
在ApplicationContext的定義文件中
增加如下節點
<bean id=
messageSource
class=
orgntext
support
ResourceBundleMessageSource
>
<property name=
basename
value=
messages
/>
</bean>
則在pure java環境中
context
getMessage(
welcome
null
Locale
CHINA)
而在jsp環境中
Controller調用JSTL viewResolver再調用Jsp時
<fmt:message>將繼續發揮它的功效
因此
appfuse等sample都是在appfuse
servlet
xml 中定義一個<messageSource>
Better Practice
要不要定義javax
servlet
jsp
jstl
fmt
localizationContext
Appfuse等sample
都是假定大家完全使用Controller作訪問入口
jsp甚至藏在了/web
inf/中
而很不幸
大家的項目可能還是有很多直接訪問jsp的地方
而直接訪問jsp時
<messageSource>節點是沒有作用的
但如果定義了javax
localizationContext
又會讓MessageSource失效
messageSource定義在ApplicationContext
xml還是appfuse
servlet
xml
ApplicationContext*
xml由ContextLoaderListener載入
而appfuse
servlet
xml靠dispatchServlet載入
並擁有一個指向ApplcationContex*
xml指針
所以
appfuse
servlet
xml能看到定義在ApplcationContext裡的東西
而反之做不到
明顯
把<messageSource>定義在ApplicationContext
xml 能獲得更好的可見性
但是appfuse沒有在pure Java代碼中使用i
n
也就沒有考慮這個問題
堅決不用雞肋級<spring:message> tag
連appfuse也不用它
可見多麼雞肋
因為fmt在找不到資源時
最多顯示???welcome???
而<spring:message>則會拋出異常
誰會喜歡這種定時炸彈阿
有趣的theme 解決
做成圖片的文字
的國際化
theme也就是把message的原理發揮了一下
讓不同語言的美術字圖片的路徑也可以定義在theme_zh_CN
properties和theme_en_US
properties中
終於有一個不那麼雞肋的spring tag了
簡單歸納
jstl中仍然使用標准的<ftm:message>及其定義?
java中使用spring的<messageSource>實現單例
用<spring:theme>解決那些做成圖片的文字的國際化問題
Spring 還有session
cookie locale resolver
到時可以看一下
From:http://tw.wingwit.com/Article/program/Java/ky/201311/28843.html