∪∩deniable Design

          個(gè)人JAVA版GAE(google app engine),struts2+jpa+jQuery開(kāi)發(fā),互相交流 http://iunbug.appspot.com/

           

          Struts 筆記
          2008 08 23
              為什么把國(guó)際化通稱I18n呢?   你數(shù)數(shù)國(guó)際化的單詞 internationalization有幾個(gè)字母?   20個(gè)!   那頭尾各是什么字母?   i和n!   20-2=?   18!   那好請(qǐng)記下:I18n
          一.標(biāo)準(zhǔn)i18n(國(guó)際化)操作
          (1)添加資源文件的方式之一:在struts.xml文件中引入資源文件    
          <constant name="struts.custom.i18n.resources" value="資源文件名" />
                  添加資源文件的方式之二:創(chuàng)建struts.properties并在添加語(yǔ)句struts.custom.i18n.resources=資源文件名
          (2)在JSP頁(yè)面中調(diào)用資源文件的方法:
                  1)    使用
          <s:text key / label/>
                          如:
          <s:text name="HelloWorld" />
                  2)    使用
          <s:property >
                      如:
                      
          <!-- 1.取當(dāng)前項(xiàng)目文件中的key(name)叫做HelloWorld 
                                      2.使用EL表達(dá)式通過(guò)getText方法簡(jiǎn)單的獲取國(guó)際化字符串
          -->
                      
          <s:property value="%{getText('HelloWorld')}" />
                      
          <!-- 通過(guò)getText設(shè)置UI標(biāo)簽中l(wèi)abel標(biāo)簽的屬性 -->
                      
          <s:textfield name="name" label="%{getText('HelloWorld')}" />
          (3)資源文件不同配置的自動(dòng)查找順序
                  第一:通過(guò)
          <s:i18n>訪問(wèn)待定位置的資源文件
                  第二:Action范圍的資源文件(只能由Action調(diào)用),資源文件名在Action的類文件的同級(jí)目錄下,與Action類名相同.
                  第三:包范圍內(nèi)的資源文件(以模塊方式管理資源文件),放在包目錄下.以package_en_zh
                  第四:通用性較強(qiáng)的全局資源文件,放在SRC目錄下

          項(xiàng)目樹(shù)型圖


          src/struts.xml

           1<?xml version="1.0" encoding="GBK"?>
           2<!DOCTYPE struts PUBLIC
           3         "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
           4         "http://struts.apache.org/dtds/struts-2.0.dtd">
           5<struts>
           6    <!-- 
           7        Struts 2.0有兩個(gè)配置文件,struts.xml和struts.properties都是放在WEB-INF/classes/下。 
           8        struts.xml用于應(yīng)用程序相關(guān)的配置 
           9        struts.properties用于Struts 2.0的運(yùn)行時(shí)(Runtime)的配置
          10        
          11        添加資源文件的方式之一:在struts.xml文件中引入資源文件
          12        添加資源文件的方式之二:在struts.properties下添加語(yǔ)句struts.custom.i18n.resources=globalMessages
          13        1.在Struts當(dāng)中用戶自定義的國(guó)際化資源文件,名為globalMessages.
          14        2.value="globalMessages"沒(méi)有指定路徑,說(shuō)明屬性文件在SRC目錄下,此為全局資源文件
          15    -->
          16    <constant name="struts.custom.i18n.resources"
          17        value="globalMessages" />
          18    <include file="struts-default.xml" /><!-- 使用缺省的struts的配置文件 -->
          19
          20    <!-- 包空間 I18nDemo 繼承 struts-default -->
          21    <package name="I18nDemo" extends="struts-default">
          22
          23        <!-- 映射名name="LoginAction" ,使用com.Login.LoginAction來(lái)實(shí)現(xiàn) -->
          24        <action name="LoginAction" class="com.Login.LoginAction">
          25            <result>/LoginAction.jsp</result>
          26        </action>
          27    </package>
          28</struts>
          29
          30


          WebRoot/WEB-INF/web.xml

           1<?xml version="1.0" encoding="UTF-8"?>
           2<web-app id="WebApp_ID" version="2.4"
           3    xmlns="http://java.sun.com/xml/ns/j2ee"
           4    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           5    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
           6    <display-name>Struts2Hello</display-name>
           7    <filter>
           8        <filter-name>struts2</filter-name>
           9        <filter-class>
          10            org.apache.struts2.dispatcher.FilterDispatcher
          11        </filter-class><!-- 以過(guò)慮器的形式出現(xiàn) -->
          12    </filter>
          13    <filter-mapping>
          14        <filter-name>struts2</filter-name>
          15        <url-pattern>/*</url-pattern><!-- 過(guò)慮所有內(nèi)容 -->
          16    </filter-mapping>
          17    <welcome-file-list>
          18        <welcome-file>index.html</welcome-file>
          19        <welcome-file>index.htm</welcome-file>
          20        <welcome-file>index.jsp</welcome-file>
          21        <welcome-file>default.html</welcome-file>
          22        <welcome-file>default.htm</welcome-file>
          23        <welcome-file>default.jsp</welcome-file>
          24    </welcome-file-list>
          25</web-app>
          26


          WebRoot/index.jsp

           1<%@ page contentType="text/html; charset=UTF-8"%>
           2<%@taglib prefix="s" uri="/struts-tags"%>
           3<html>
           4    <head>
           5        <title>Hello World</title>
           6    </head>
           7    <body>
           8        <h2>
           9            <s:text name="HelloWorld" />
          10        </h2>
          11        <h2>
          12            <!-- 
          13            1.取當(dāng)前項(xiàng)目文件中的key(name)叫做HelloWorld 
          14            2.使用EL表達(dá)式通過(guò)getText方法簡(jiǎn)單的獲取國(guó)際化字符串
          15            -->
          16            <s:property value="%{getText('HelloWorld')}" />
          17        </h2>
          18        <!-- 通過(guò)getText設(shè)置UI標(biāo)簽中l(wèi)abel標(biāo)簽的屬性 -->
          19        <s:textfield name="name" label="%{getText('HelloWorld')}" />
          20    </body>
          21</html>
          22
          23

          WebRoot/LoginAction.jsp
           1<%@ page language="java" import="java.util.*" pageEncoding="GBK"%>
           2<%@ page contentType="text/html; charset=GBK" %>
           3<%
           4    String path = request.getContextPath();
           5    String basePath = request.getScheme() + "://"
           6            + request.getServerName() + ":" + request.getServerPort()
           7            + path + "/";
           8
          %>
           9<%@taglib prefix="s" uri="/struts-tags"%>
          10<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
          11<html>
          12    <head>
          13        <title>Login Action</title>
          14    </head>
          15    <!-- 用http://localhost:8080/i18n/LoginAction.action?uname=admin&upass=123顯示頁(yè)面 -->
          16    <body>
          17        <!--
          18            1.包范圍內(nèi)的資源文件(以模塊方式管理資源文件)
          19            2.輸出請(qǐng)求文件當(dāng)中tip,user的值.(在LoginAction中已經(jīng)被放入值)
          20         -->
          21        ${requestScope.tip}
          22        <br>
          23        ${sessionScope.user}
          24        <br>
          25
          26        <!--
          27            1.Action范圍的資源文件(只能由Action調(diào)用)
          28             2.輸出標(biāo)準(zhǔn)的request的tip屬性 
          29         -->
          30        <jsp:useBean id="d" class="java.util.Date" scope="page" />
          31        <!-- s:text name="msg"直接從資源文件中取值({0},{1}兩個(gè)值)并顯示 -->
          32        <s:text name="msg">
          33
          34            <%
          35                //給msg的{0}攜帶值
          36            
          %>
          37            <s:param>
          38                <s:property value="uname" />
          39            </s:param>
          40
          41            <%
          42                //給msg的{1}攜帶值
          43            
          %>
          44            <s:param>$wmqeeuq</s:param>
          45        </s:text>
          46
          47        <!-- 通過(guò)s:i18n訪問(wèn)待定位置的資源文件,此時(shí)只訪問(wèn)globalMessages -->
          48        <s:i18n name="globalMessages">
          49            <s:text name="HelloWorld" />
          50        </s:i18n>
          51        <br>
          52        <!-- 通用性較強(qiáng)的全局資源文件 -->
          53        <s:property value="%{getText('HelloWorld')}" />
          54        <br>
          55        <hr>
          56        <!-- 包含 LangSelector.jsp頁(yè)面-->
          57        <s:include value="LangSelector.jsp"/>
          58    </body>
          59</html>
          60

          WebRoot/LangSelector.jsp
           1<%@ page language="java" contentType="text/html; charset=GBK"%>
           2
           3<%@taglib prefix="s" uri="/struts-tags"%>
           4
           5<!-- 提交表單的方法 -->
           6<script type="text/javascript">
           7function langSelecter_onChanged()
           8{
           9    document.getElementById("langForm").submit();
          10}

          11
          </script>
          12
          13
          14<!-- 
          15            1.s:set:將用戶的的session中的WW_TRANS_I18N_LOCALE設(shè)置成SESSION_LOCALE,(SESSION_LOCALE已經(jīng)存在)
          16            2.s:bean:執(zhí)行com.locales.Locales類,將內(nèi)容為SESSION_LOCALE得到的值傳入類中的參數(shù)current,
          17                傳值時(shí)如果值為空則選擇為locale(本地)否則選擇為SESSION_LOCALE
          18         -->
          19<s:set name="SESSION_LOCALE" value="#session['WW_TRANS_I18N_LOCALE']" />
          20<s:bean id="locales" name="com.locales.Locales">
          21    <s:param name="current"
          22        value="#SESSION_LOCALE == null?locale:#SESSION_LOCALE" />
          23</s:bean>
          24
          25<!-- 
          26            1.action="<s:url/>":提交給當(dāng)前的地址
          27            2.s:text:獲取資源文件(這里得到的是全局資源文件的里的Key)
          28            3.list="#locales.locales":通過(guò)s:bean id="locales"調(diào)用Locales.java中的getLocales()方法
          29         -->
          30<form action="<s:url/>" id="langForm"
          31    style="background-color: #bbbbbb; padding-top: 4px; padding-bottom: 4px;">
          32    <s:text name="languag" />
          33    <s:select label="Language" list="#locales.locales" listKey="value"
          34        listValue="key"
          35        value="#SESSION_LOCALE == null ? locale : #SESSION_LOCALE"
          36        name="request_locale" id="langSelecter"
          37        onchange="langSelecter_onChanged()" theme="simple" />
          38</form>
          39

          src/com/package_en_US.properties
          succtip=Login success
          failtip=Login failed

          src/com/package_zh_CN.properties
          succtip=\u767B\u5F55\u6210\u529F
          failtip=\u767B\u5F55\u5931\u8D25

          src/com.i18n.Loc.java
           1package com.i18n;
           2
           3import java.util.Locale;
           4
           5/**
           6 * @author ∪∩BUG E-mail: tidelgl@163.com
           7 * @version Aug 23, 2008 3:37:45 PM
           8 * @獲取語(yǔ)言環(huán)境
           9 */

          10public class Loc {
          11    public static void main(String[] args) {
          12        Locale[] localelist = Locale.getAvailableLocales();
          13        for (int i = 0; i < localelist.length; i++{
          14            // 打印國(guó)家名+國(guó)家編寫(xiě)名+語(yǔ)言名+語(yǔ)言縮寫(xiě)名
          15            System.out.println(localelist[i].getDisplayCountry() + " = "
          16                    + localelist[i].getCountry() + "  "
          17                    + localelist[i].getDisplayLanguage() + " = "
          18                    + localelist[i].getLanguage());
          19        }

          20        // 獲取系統(tǒng)的默認(rèn)的國(guó)家/語(yǔ)言環(huán)境
          21        // Locale myLocale = Locale.getDefault();
          22        // ResourceBundle bundle = ResourceBundle.getBundle("資源文件名", myLocale);
          23        // System.out.println(bundle.getString("定義的Key鍵"));
          24    }

          25
          26}

          27

          src/com.locales.Locales.java
           1package com.locales;
           2
           3import java.util.Hashtable;
           4import java.util.Locale;
           5import java.util.Map;
           6
           7/**
           8 * @author ∪∩BUG E-mail: tidelgl@163.com
           9 * @version Aug 23, 2008 11:27:29 PM
          10 * @本地化
          11 */

          12public class Locales {
          13    private Locale current;
          14
          15    // 設(shè)置當(dāng)前用戶的語(yǔ)言種類
          16    public void setCurrent(Locale current) {
          17        this.current = current;
          18    }

          19
          20    public Map<String, Locale> getLocales() {
          21        Map<String, Locale> locales = new Hashtable<String, Locale>();
          22
          23        // 往集合中裝載語(yǔ)言種類
          24        locales.put("USA English", Locale.US);
          25        locales.put("Simplified Chinese", Locale.CHINA);
          26        return locales;
          27
          28    }

          29}

          30

          src/com.Login.LoginAction.java
           1package com.Login;
           2
           3import com.opensymphony.xwork2.ActionContext;
           4import com.opensymphony.xwork2.ActionSupport;
           5
           6/**
           7 * @author ∪∩BUG E-mail: tidelgl@163.com
           8 * @version Aug 23, 2008 8:39:58 PM 
           9 * @國(guó)際化
          10 */

          11public class LoginAction extends ActionSupport {
          12    private String uname;
          13    private String upass;
          14
          15    public LoginAction(String uname, String upass) {
          16        super();
          17        this.uname = uname;
          18        this.upass = upass;
          19    }

          20
          21    public LoginAction() {
          22
          23    }

          24
          25    public String getUname() {
          26        return uname;
          27    }

          28
          29    public void setUname(String uname) {
          30        this.uname = uname;
          31    }

          32
          33    public String getUpass() {
          34        return upass;
          35    }

          36
          37    public void setUpass(String upass) {
          38        this.upass = upass;
          39    }

          40
          41    @Override
          42    public String execute() throws Exception {
          43
          44        ActionContext ctx = ActionContext.getContext();// 獲取struts2的整個(gè)上下文對(duì)象,這里是request
          45        if ("admin".equals(this.uname) & "123".equals(this.getUpass())) {
          46//            ctx.getSession().put("user", this.getUname());     // 把當(dāng)前的用戶名放入session當(dāng)中.
          47//            ctx.put("tip", this.getText("succtip"));         // Action當(dāng)中獲取資源文件的方法,這里取的key名為succtip
          48            
          49            //占位的資源文件的獲取
          50            ctx.getSession().put("user"this.getUname());     // 把當(dāng)前的用戶名放入session當(dāng)中.
          51            ctx.put("tip"this.getText("succtip",new String[]{this.uname})); //在字符串?dāng)?shù)組中的第一個(gè)數(shù)組元素放入uname的值
          52        }
           else {
          53//            ctx.put("tip", this.getText("failtip"));         // Action當(dāng)中獲取資源文件的方法,這里取的key名為failtip
          54            ctx.put("tip"this.getText("failtip",new String[]{this.uname})); //在字符串?dāng)?shù)組中的第一個(gè)數(shù)組元素放入uname的值
          55        }

          56
          57        return SUCCESS;
          58    }

          59
          60}

          61

          src/com.locales.LoginAction_en_US.properties
          succtip={0}Login success
          failtip
          ={0}Login failed
          msg
          ={0}welcome,now is\:{1}

          src/com.locales.LoginAction_zh_CN.properties
          1succtip={0}\u767B\u5F55\u6210\u529F
          2failtip={0}\u767B\u5F55\u5931\u8D25
          3msg={0}\u6B22\u8FCE,\u73B0\u5728\u662F\:{1}
          4

          src/globalMessages_en_US.properties
          HelloWorld=Hello World\!
          com.locales
          =Test Locale

          src/globalMessages_zh_CN.properties
          HelloWorld=\u4F60\u597D,\u4E16\u754C\!
          com.locales
          =\u672C\u5730\u6D4B\u8BD5

          src/struts.properties
          struts.custom.i18n.resources=globalMessages



          評(píng)論

          # re: struts2.0學(xué)習(xí)筆記(四)--I18n(國(guó)際化)  回復(fù)  更多評(píng)論   

          2008-08-24 01:50 by ∪∩BUG
          國(guó)際化學(xué)得有點(diǎn)暈,不過(guò)看看筆記在看看做完的練習(xí)就有了頭緒.

          # re: struts2.0學(xué)習(xí)筆記(四)--I18n(國(guó)際化)[未登錄](méi)  回復(fù)  更多評(píng)論   

          2008-08-25 20:44 by Jimmy
          請(qǐng)問(wèn)為什么我加了國(guó)際化后,輸入表單都不輸出了

          <s:textfield name="user" label="用戶名" size="18" />

          都沒(méi)了

          # re: struts2.0學(xué)習(xí)筆記(四)--I18n(國(guó)際化)  回復(fù)  更多評(píng)論   

          2008-08-25 21:01 by ∪∩BUG
          @Jimmy
          可能是你獲取值的方式不對(duì),你仔細(xì)看看你的struts.xml文件及相關(guān)的action類,只占處理過(guò)程有沒(méi)有關(guān)聯(lián)不對(duì)的..

          # re: struts2.0學(xué)習(xí)筆記(四)--I18n(國(guó)際化)  回復(fù)  更多評(píng)論   

          2008-08-25 21:31 by ∪∩BUG
          @Jimmy
          還有一個(gè)可能是你默認(rèn)的語(yǔ)種是英文,設(shè)置為中文看看,JSP頁(yè)面最好把字符集設(shè)置為UTF-8而不是GBK
          主站蜘蛛池模板: 静安区| 赤水市| 宁津县| 香格里拉县| 阳信县| 景德镇市| 罗城| 洪江市| 通化市| 平果县| 平凉市| 平顺县| 克什克腾旗| 武宁县| 庐江县| 南乐县| 庄河市| 长白| 南充市| 西峡县| 昌黎县| 喀什市| 衡阳县| 阳城县| 麻阳| 漳浦县| 皋兰县| 莱阳市| 和顺县| 安福县| 阜康市| 通州市| 阳山县| 申扎县| 普洱| 彰化市| 宣化县| 苗栗市| 白水县| 揭西县| 平邑县|