<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-314  評論-209  文章-0  trackbacks-0
    因?yàn)橄M裇pringSide搞成國際化項(xiàng)目,i18n就成了必做的事情。
    照抄appfuse,折騰了很久后才發(fā)現(xiàn)appfuse式的sample總是只顧著演示自己的一畝三分地而忽略了很多其他東西。

       1.從基礎(chǔ)開始,沒有Spring時(shí),Java的i18n是這樣的:
       1.1 jsp環(huán)境
        首先寫一個(gè)messages.zh_CN.properties文件,放在class-path也就是/WEB-INF/classes里     welcome=歡迎    然后用native2ascii.exe把它轉(zhuǎn)為 welcome=\u6b22\u8fce
        在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="http://java.sun.com/jstl/fmt" prefix="fmt" %>
    <fmt:message key="welcome"/>
    如果有多個(gè)Resource Bundle文件, 就要在jsp里用<ftm:bundle>定義了.

    1.2 pure Java環(huán)境
        ResourceBundle rb = ResourceBundle.getBundle("messages");
        String welcome = rb.getString("welcome");

    2.Spring的增強(qiáng)及appfuse的做法
       Spring增加了MessageSource的概念,一是ApplicationContext將充當(dāng)一個(gè)單例的角色,不再需要每次使用i18時(shí)都初始化一次ResourceBundle,二是可以代表多個(gè)Resource Bundle.

       在ApplicationContext的定義文件中,增加如下節(jié)點(diǎn): 
       <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
            <property name="basename" value="messages"/>
        </bean>
       則在pure java環(huán)境中。  context.getMessage("welcome", null, Locale.CHINA)

      而在jsp環(huán)境中,Controller調(diào)用JSTL viewResolver再調(diào)用Jsp時(shí),<fmt:message>將繼續(xù)發(fā)揮它的功效。

      因此,appfuse等sample都是在appfuse-servlet.xml 中定義一個(gè)<messageSource>。

    3.Better Practice
    3.1 要不要定義javax.servlet.jsp.jstl.fmt.localizationContext[定義]
          Appfuse等sample,都是假定大家完全使用Controller作訪問入口,jsp甚至藏在了/web-inf/中。而很不幸,大家的項(xiàng)目可能還是有很多直接訪問jsp的地方,而直接訪問jsp時(shí),<messageSource>節(jié)點(diǎn)是沒有作用的。
         但如果定義了javax...localizationContext, 又會讓MessageSource失效......


    3.2 messageSource定義在ApplicationContext.xml還是appfuse-servlet.xml
         ApplicationContext*.xml由ContextLoaderListener載入而appfuse-servlet.xml靠dispatchServlet載入并擁有一個(gè)指向ApplcationContex*.xml指針。所以,appfuse-servlet.xml能看到定義在ApplcationContext里的東西,而反之做不到。
         明顯, 把<messageSource>定義在ApplicationContext.xml 能獲得更好的可見性。
         但是appfuse沒有在pure Java代碼中使用i18n,也就沒有考慮這個(gè)問題。

    3.3 堅(jiān)決不用雞肋級<spring:message> tag
          連appfuse也不用它,可見多么雞肋。因?yàn)閒mt在找不到資源時(shí),最多顯示???welcome???,而<spring:message>則會拋出異常,誰會喜歡這種定時(shí)炸彈阿。

    3.4 有趣的theme 解決"做成圖片的文字"的國際化
           theme也就是把message的原理發(fā)揮了一下,讓不同語言的美術(shù)字圖片的路徑也可以定義在theme_zh_CN.properties和theme_en_US.properties中。終于有一個(gè)不那么雞肋的spring tag了。

    4.簡單歸納

    1. jstl中仍然使用標(biāo)準(zhǔn)的<ftm:message>及其定義?

    2.java中使用spring的<messageSource>實(shí)現(xiàn)單例

    3.用<spring:theme>解決那些做成圖片的文字的國際化問題

    4.Spring 還有session,cookie locale resolver, 到時(shí)可以看一下.

    posted on 2008-11-22 16:40 xzc 閱讀(1473) 評論(3)  編輯  收藏 所屬分類: Java

    評論:
    # re: Spring i18n的better practice(相對于appfuse) 2008-11-22 16:46 | xzc
    <%@page contentType="text/html; charset=UTF-8"%>
    <%@page import="java.util.*"%>
    <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
    <%@taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
    <%@taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql"%>
    <%@taglib uri="http://java.sun.com/jsp/jstl/xml" prefix="x"%>
    <html>
    <head>
    <title>language choose</title>
    </head>
    <body bgcolor="#ffffff">

    copyright @ lizongbo @ donews.net


    <c:if test="${param['locale'] != null}">
    <fmt:setLocale value="${param['locale']}" scope="session"/>
    <fmt:setTimeZone value="${param['locale']}" scope="session"/>
    </c:if>
    <c:if test="${param['locale'] == null}">
    <fmt:setLocale value="${header['locale']}" scope="session"/>
    <fmt:setTimeZone value="${header['locale']}" scope="session"/>
    </c:if>
    <%
    Locale crtl = Locale.getDefault();
    Object cobj = session.getAttribute("javax.servlet.jsp.jstl.fmt.locale.session");
    if (cobj != null && cobj instanceof Locale) {
    crtl = (Locale) cobj;
    }
    Locale[] la = java.text.NumberFormat.getAvailableLocales();
    %>
    <form method="POST" action="">
    language choose:
    <br />
    <select name="locale">
    <%for (int i = 0; i < la.length; i++) {%>
    <option value="<%=la[i]%>" <%if (la[i].equals(crtl)) {
    out.print("selected=\"selected\"");
    }%>><%= la[i].getDisplayName(crtl)%></option>
    <%
    }
    %>
    </select>
    <br />
    <input type="submit" value="change"/>
    </form>
    </body>
    </html>


      回復(fù)  更多評論
      
    # re: Spring i18n的better practice(相對于appfuse) 2008-11-22 16:47 | xzc
    使用JSTL解決國際化問題非常簡單,首先在WEB-INF/classes放上資源文件,例如messages.properties、messages_zh_CN.properties等文件。

    使用JSTL fmt庫:
    <%@ taglib prefix="fmt" uri="http://java.sun.com/jstl/fmt" %>
    <fmt:setLocale value="${header['accept-language']}"/>
    <fmt:setBundle basename="messages"/>

    setLocale設(shè)置地區(qū),一般從HTTP Header里面取就比較方便一點(diǎn)。
    setBundle設(shè)置資源文件的名稱。

    通過如下方式就可以應(yīng)用了。
    <fmt:message key="SampleMessage"/>

    還可以加參數(shù)。
    <fmt:message key="LoginMessage">
    <fmt:param value="${loginName}"/>
    </fmt:message>  回復(fù)  更多評論
      
    # re: Spring i18n的better practice(相對于appfuse) 2008-11-22 16:59 | xzc
    9.5 I18N formatting 標(biāo)簽庫
    看到 I18N 就應(yīng)該想到知識“國際化”, I18N formatting 標(biāo)簽庫就是用于在 JSP 頁面中做國際化的動作。在該標(biāo)簽庫中的標(biāo)簽一共有 12 個(gè),被分為了兩類,分別是:

    q 國際化核心標(biāo)簽: <fmt:setLocale> 、 <fmt:bundle> 、 <fmt:setBundle> 、 <fmt:message> 、 <fmt:param> 、 <fmt:requestEncoding> 。

    q 格式化標(biāo)簽: <fmt:timeZone> 、 <fmt:setTimeZone> 、 <fmt:formatNumber> 、 <fmt:parseNumber> 、 <fmt:formatDate> 、 <fmt:parseDate> 。

    下面只選擇其中常見的一些標(biāo)簽和屬性進(jìn)行介紹。

    9.5.1 用于設(shè)置本地化環(huán)境的 <fmt:setLocale> 標(biāo)簽
    <fmt:setLocale> 標(biāo)簽用于設(shè)置 Locale 環(huán)境。它的屬性和描述如表 9.17 所示:

    表 9.17   <fmt:setLocale> 標(biāo)簽屬性和說明

    屬性
    描述

    value
    Locale 環(huán)境的指定,可以是 java.util.Locale 或 String 類型的實(shí)例

    scope
    Locale 環(huán)境變量的作用范圍(可選)


    下面看一個(gè)示例:

    <fmt:setLocale value="zh_TW"/>

    表示設(shè)置本地環(huán)境為繁體中文。

    9.5.2 用于資源文件綁定的 <fmt:bundle> 、 <fmt:setBundle> 標(biāo)簽
    這兩組標(biāo)簽用于資源配置文件的綁定,唯一不同的是 <fmt:bundle> 標(biāo)簽將資源配置文件綁定于它標(biāo)簽體中的顯示, <fmt:setBundle> 標(biāo)簽則允許將資源配置文件保存為一個(gè)變量,在之后的工作可以根據(jù)該變量來進(jìn)行。

    根據(jù) Locale 環(huán)境的不同將查找不同后綴的資源配置文件,這點(diǎn)在國際化的任何技術(shù)上都是一致的,通常來說,這兩種標(biāo)簽單獨(dú)使用是沒有意義的,它們都會與 I18N formatting 標(biāo)簽庫中的其他標(biāo)簽配合使用。它們的屬性和描述如表 9.18 所示:

    表 9.18   <fmt:bundle> 、 <fmt:setBundle> 標(biāo)簽屬性和說明

    屬性
    描述

    basename
    資源配置文件的指定,只需要指定文件名而無須擴(kuò)展名,二組標(biāo)簽共有的屬性

    var
    <fmt:setBundle> 獨(dú)有的屬性,用于保存資源配置文件為一個(gè)變量

    scope
    變量的作用范圍


    下面看一個(gè)示例

    <fmt:setLocale value="zh_CN"/>

    <fmt:setBundle basename="applicationMessage" var="applicationBundle"/>

    該示例將會查找一個(gè)名為 applicationMessage_zh_CN.properties 的資源配置文件,來作為顯示的 Resource 綁定。

    9.5.3 用于顯示資源配置文件信息的 <fmt:message> 標(biāo)簽
    用于信息顯示的標(biāo)簽,將顯示資源配置文件中定義的信息。它的屬性和描述如表 9.19 所示:

    表 9.19   <fmt:message> 標(biāo)簽屬性和說明

    屬性
    描述

    key
    資源配置文件的“鍵”指定

    bundle
    若使用 <fmt:setBundle> 保存了資源配置文件,該屬性就可以從保存的資源配置文件中進(jìn)行查找

    var
    將顯示信息保存為一個(gè)變量

    scope
    變量的作用范圍


    下面看一個(gè)示例:

    <fmt:setBundle basename="applicationMessage" var="applicationBundle"/>

    <fmt:bundle basename="applicationAllMessage">

    <fmt:message key="userName" />

    <p>

    <fmt:message key="passWord" bundle="${applicationBundle}" />

    </fmt:bundle>

    該示例使用了兩種資源配置文件的綁定的做法,“ applicationMessage ”資源配置文件利用 <fmt:setBundle> 標(biāo)簽被賦于了變量“ applicationBundle ”,而作為 <fmt:bundle> 標(biāo)簽定義的“ applicationAllMessage ”資源配置文件作用于其標(biāo)簽體內(nèi)的顯示。

    q 第一個(gè) <fmt:message> 標(biāo)簽將使用“ applicationAllMessage ”資源配置文件中“鍵”為“ userName ”的信息顯示。

    q 第二個(gè) <fmt:message> 標(biāo)簽雖然被定義在 <fmt:bundle> 標(biāo)簽體內(nèi),但是它使用了 bundle 屬性,因此將指定之前由 <fmt:setBundle> 標(biāo)簽保存的“ applicationMessage ”資源配置文件,該“鍵”為“ passWord ”的信息顯示。

    9.5.4 用于參數(shù)傳遞的 <fmt:param> 標(biāo)簽
    <fmt:param> 標(biāo)簽應(yīng)該位于 <fmt:message> 標(biāo)簽內(nèi),將為該消息標(biāo)簽提供參數(shù)值。它只有一個(gè)屬性 value 。

    <fmt:param> 標(biāo)簽有兩種使用版本,一種是直接將參數(shù)值寫在 value 屬性中,另一種是將參數(shù)值寫在標(biāo)簽體內(nèi)。

    9.5.6 用于為請求設(shè)置字符編碼的 <fmt:requestEncoding> 標(biāo)簽
    <fmt:requestEncoding> 標(biāo)簽用于為請求設(shè)置字符編碼。它只有一個(gè)屬性 value ,在該屬性中可以定義字符編碼。

    9.5.7 用于設(shè)定時(shí)區(qū)的 <fmt:timeZone> 、 <fmt:setTimeZone> 標(biāo)簽
    這兩組標(biāo)簽都用于設(shè)定一個(gè)時(shí)區(qū)。唯一不同的是 <fmt:timeZone> 標(biāo)簽將使得在其標(biāo)簽體內(nèi)的工作可以使用該時(shí)區(qū)設(shè)置, <fmt:setBundle> 標(biāo)簽則允許將時(shí)區(qū)設(shè)置保存為一個(gè)變量,在之后的工作可以根據(jù)該變量來進(jìn)行。它們的屬性和描述如表 9.20 所示:

    表 9.20   <fmt:timeZone> 、 <fmt:setTimeZone> 標(biāo)簽 屬性和說明

    屬性
    描述

    value
    時(shí)區(qū)的設(shè)置

    var
    <fmt:setTimeZone> 獨(dú)有的屬性,用于保存時(shí)區(qū)為一個(gè)變量

    scope
    變量的作用范圍


    9.5.8 用于格式化數(shù)字的 <fmt:formatNumber> 標(biāo)簽
    <fmt: formatNumber > 標(biāo) 簽用于格式化數(shù)字。它的屬性和描述如表 9.21 所示:

    表 9.21   <fmt:formatNumber> 標(biāo)簽屬性和說明

    屬性
    描述

    value
    格式化的數(shù)字,該數(shù)值可以是 String 類型或 java.lang.Number 類型的實(shí)例

    type
    格式化的類型

    pattern
    格式化模式

    var
    結(jié)果保存變量

    scope
    變量的作用范圍

    maxIntegerDigits
    指定格式化結(jié)果的最大值

    minIntegerDigits
    指定格式化結(jié)果的最小值

    maxFractionDigits
    指定格式化結(jié)果的最大值,帶小數(shù)

    minFractionDigits
    指定格式化結(jié)果的最小值,帶小數(shù)


    <fmt:formatNumber> 標(biāo)簽實(shí)際是對應(yīng) java.util.NumberFormat 類, type 屬性的可能值包括 currency (貨幣)、 number (數(shù)字)和 percent (百分比)。

    下面看一個(gè)示例。

    <fmt:formatNumber value="1000.888" type="currency" var="money"/>

    該結(jié)果將被保存在“ money ”變量中,將根據(jù) Locale 環(huán)境顯示當(dāng)?shù)氐呢泿鸥袷健?


    9.5.9 用于解析數(shù)字的 <fmt:parseNumber> 標(biāo)簽
    <fmt:parseNumber> 標(biāo)簽用于解析一個(gè)數(shù)字,并將結(jié)果作為 java.lang.Number 類的實(shí)例返回。 <fmt:parseNumber> 標(biāo)簽看起來和 <fmt:formatNumber> 標(biāo)簽的作用正好相反。它的屬性和描述如表 9.22 所示:

    表 9.22   <fmt:parseNumber> 標(biāo)簽屬性和說明

    屬性
    描述

    value
    將被解析的字符串

    type
    解析格式化的類型

    pattern
    解析格式化模式

    var
    結(jié)果保存變量,類型為 java.lang.Number

    scope
    變量的作用范圍

    parseLocale
    以本地化的形式來解析字符串,該屬性的內(nèi)容應(yīng)為 String 或 java.util.Locale 類型的實(shí)例


    下面看一個(gè)示例。

    <fmt:parseNumber value="15%" type="percent" var="num"/>

    解析之后的結(jié)果為“ 0.15 ”。

    9.5.10 用于格式化日期的 <fmt:formatDate> 標(biāo)簽
    <fmt:formatDate> 標(biāo)簽用于格式化日期。它的屬性和描述如表 9.23 所示:

    表 9.23   <fmt:formatDate> 標(biāo)簽屬性和說明

    屬性
    描述

    value
    格式化的日期,該屬性的內(nèi)容應(yīng)該是 java.util.Date 類型的實(shí)例

    type
    格式化的類型

    pattern
    格式化模式

    var
    結(jié)果保存變量

    scope
    變量的作用范圍

    timeZone
    指定格式化日期的時(shí)區(qū)


    <fmt:formatDate> 標(biāo)簽與 <fmt:timeZone> 、 <fmt:setTimeZone> 兩組標(biāo)簽的關(guān)系密切。若沒有指定 timeZone屬性, 也可以通過 <fmt:timeZone> 、 <fmt:setTimeZone> 兩組標(biāo)簽設(shè)定的時(shí)區(qū)來格式化最后的結(jié)果。

    9.5.11 用于解析日期的 <fmt:parseDate> 標(biāo)簽
    <fmt:parseDate> 標(biāo)簽用于解析一個(gè)日期,并將結(jié)果作為 java.lang.Date 類型的實(shí)例返回。 <fmt:parseDate> 標(biāo)簽看起來和 <fmt:formatDate> 標(biāo)簽的作用正好相反。它的屬性和描述如表 9.24 所示:

    表 9.24   <fmt:parseDate> 標(biāo)簽屬性和說明

    屬性
    描述

    value
    將被解析的字符串

    type
    解析格式化的類型

    pattern
    解析格式化模式

    var
    結(jié)果保存變量,類型為 java.lang.Date

    scope
    變量的作用范圍

    parseLocale
    以本地化的形式來解析字符串,該屬性的內(nèi)容為 String 或 java.util.Locale 類型的實(shí)例

    timeZone
    指定解析格式化日期的時(shí)區(qū)


    <fmt:parseNumber> 和 <fmt:parseDate> 兩組標(biāo)簽都實(shí)現(xiàn)解析字符串為一個(gè)具體對象實(shí)例的工作,因此,這兩組解析標(biāo)簽對 var 屬性的字符串參數(shù)要求非常嚴(yán)格。就 JSP 頁面的表示層前段來說,處理這種解析本不屬于份內(nèi)之事,因此 <fmt:parseNumber> 和 <fmt:parseDate> 兩組標(biāo)簽應(yīng)該盡量少用,替代工作的地方應(yīng)該在服務(wù)器端表示層的后段,比如在 Servlet 中。

      回復(fù)  更多評論
      
    主站蜘蛛池模板: 美女视频黄视大全视频免费的| 午夜免费福利在线观看| 美女18一级毛片免费看| 亚洲黄色免费网站| 亚洲中文字幕无码一久久区| 精品免费国产一区二区| 午夜国产精品免费观看| 96免费精品视频在线观看| 日本高清不卡aⅴ免费网站| 日韩在线观看视频免费| 亚洲av日韩专区在线观看| 中文文字幕文字幕亚洲色| 亚洲综合婷婷久久| 亚洲国产精品国自产拍AV| 国产自偷亚洲精品页65页| 亚洲福利视频一区二区| 免费人成年激情视频在线观看| 成人免费无码大片a毛片软件| 久久国产色AV免费看| 国色精品va在线观看免费视频| 一级做a爰片久久毛片免费陪| 自拍偷自拍亚洲精品播放| 亚洲AV无码成人精品区日韩| 亚洲愉拍一区二区三区| 亚洲色欲色欲www在线播放| 亚洲首页国产精品丝袜| 亚洲人成电影在线观看网| 亚洲大香伊人蕉在人依线| 久久av无码专区亚洲av桃花岛| 亚洲人成电影在在线观看网色| 亚洲国产老鸭窝一区二区三区| 日本亚洲视频在线| 亚洲国产精品无码久久久不卡| 国产亚洲一区二区手机在线观看| 337p日本欧洲亚洲大胆裸体艺术| 中文亚洲AV片在线观看不卡| 亚洲国产另类久久久精品小说| 亚洲精品无码久久久久| 亚洲国产精品久久久久婷婷软件| 久久精品a亚洲国产v高清不卡 | 高h视频在线免费观看|