Struts2入門(六)——國際化

1、前言

1.一、國際化簡介html

國際化是指應用程序在運行的時候,根據客戶端請求來自的國家地區、語言的不一樣而顯示不一樣的界面(簡單說就是根據你的地區顯示相關地區的語言,若是你如今在英國,那麼顯示的語言就是英語),國際化的存在價值就是:當一個應用須要在全球使用。java

國際化(Internationalization),國際化也被存在I18N,由於頭字母是I,尾字母是N,中間有18爲字母,這個你瞭解就好。web

本地化(Localization),首字母是L,尾字母是N,中間有10個字母,因此也成爲L10N。(本地化:根據不一樣區域顯示本地語言)瀏覽器

1.二、國際化實現思路框架

將程序中的信息等放在資源文件中,程序在運行過程當中,會根據本地語言和國家代碼自動到相關的資源文件中提取信息。jsp

1.三、Java的國際化代碼實現ide

新建一個java項目工具

package com.i18n.resource;

import java.util.Locale;
import java.util.ResourceBundle;

import javax.ejb.Local;

public class I18NTest {

    public static void main(String[] args) {
        //資源包基包(包名+myproperties)
        String basename = "com.i18n.resource.myproperties";
        //設置語言環境
        Locale cn = Locale.CHINA;    //中文
        Locale en = Locale.ENGLISH;    //英文
        
        //根據基名和語言環境加載對應的語言資源文件
        ResourceBundle mycn = ResourceBundle.getBundle(basename,cn);//加載myproperties_cn
        ResourceBundle myen = ResourceBundle.getBundle(basename,en);//加載myproperties_en
        
        //加載資源文件後, 程序就能夠調用ResourceBundle實例對象的 getString方法獲取指定的資源信息名稱所對應的值。
        //String value =  myResources.getString(「key");
        String usernamecn = mycn.getString("username");
        String passwordcn = mycn.getString("password");
        
        String usernameen = myen.getString("username");
        String passworden = myen.getString("password");

        //顯示中文的編碼
        System.out.println(usernamecn+"----"+passwordcn);
        //顯示英文的編碼
        System.out.println(usernameen+"----"+passworden);
    }
}
/*輸出結果爲:
 * 用戶----密碼
username----password
 * */

注意:使用國際化必須創建資源文件纔可以使用post

en:表示英語,zh:表示中文測試

myproperties_en.properties文件代碼爲:

username=username
password=password
submit=submit

myproperties_zh.properties代碼爲:(注意:中文被編譯爲ASCLL格式)

username=\u7528\u6237
password=\u5BC6\u7801
submit=\u63D0\u4EA4

咱們能夠新建jsp頁面,根據不一樣的地區顯示不一樣的語言。

<%@page import="java.util.ResourceBundle"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>測試i18n</title>
</head>
    <%
        //加載i18n資源文件,request.getLocale()獲取用戶所在的國家地區
        ResourceBundle my = ResourceBundle.getBundle("com.i18n.resource.myproperties",request.getLocale());
    %>
<body>
    <form action="" method="post">
        <%=my.getString("username") %>:<input type="text" name="username"><br/>
        <%=my.getString("password") %>:<input type="text" name="password"><br/>
        <input type="submit" value="<%=my.getString("submit")%>">
    </form>
</body>
</html>

選擇IE瀏覽器——工具——語言——可添加英語語言,將其移動到頂層,保存的時候,則當前的語言爲英語。

 

jsp界面爲:

若是是中文在頂層的話,則顯示爲中文。

 2、Struts2的國際化入門

2.一、Struts2的國際化通常是創建在java基礎上的,同樣也是經過不一樣國家/語言環境的資源文件,而後經過ResourceBundle加載指定的Locale對應的資源文件,再取得該資源文件中指定Key對應的消息——整個過程與java程序的國際化徹底相同,只是Struts2框架對Java程序國際化作了進一步的封裝,從而簡化了應用程序的國際化。

Struts2應用程序的國際化主要包括:輸入校驗提示信息國際化,類型轉換提供國際化,Action信息國際化和JSP頁面國際化等組成。這裏主要介紹如何在Action中取得國際化消息,如何在JSP頁面上輸出國際化消息,如何進行輸入校驗提示信息的國際化。

2.二、國際化的類型

一、Application級別的國際化

二、Package級別的國際化

三、Action級別的國際化

2.三、案例分析

Struts2中提供了不少加載國際化資源文件的方式,最簡單最經常使用的就是加載全局的國際化資源文件,加載全局的國際化資源文件一般使用配置常量來實現的。不論是Web.xml文件配置常量,仍是struts.properties文件中配置常量,以及在struts.xml中配置常量,只須要配置struts.custom.i18n.resources常量便可。該常量的值爲全局國際化資源文件的名字。

1、配置常量

如:

該資源文件的名字爲:messageResource,後面的en_US表示美國英語,zh_CN表示中文。

加載全局國際化配置文件有三種方法

一、咱們能夠新建struts.properties,將其放在同級目錄下。

內容爲:struts.custom.i18n.resources=messageResource

二、也能夠在struts.xml中配置常量

三、web.xml(沒試過)

Struts2訪問國際化資源文件有如下4種方式:

一、在jsp頁面使用struts2的<s:text>,該標籤指定一個name屬性,該屬性指定國際化資源文件中的key

二、action類中訪問國際化消息,使用ActionSupport類中的getText(),該方法接受一個name屬性,該屬性指定國際化資源文件中的key

三、在表單元素的label輸出國際化消息,能夠爲其指定一個key屬性,該屬性指定國際化資源文件中的key

四、在jsp頁面還可使用<s:property value="getText('name')">,實際上是調用了getText方法。

2、新建資源文件(messageResource_en_US.properties和messageResource_zh_CN.properties,將其放在classes文件夾下。)

messageResource_en_US.properties文件內容:

loginPage=Login Page
errorPage=Error Page
succPage=Welcome Page
failTip={0},Sorry,you can,t login!
succTip={0},Welcome,you has logged in!
user=User Name
pass=User Pass
login=Login
welcomeMsg={0},Hello!Now is {1}!
messageResource_en_US.properties

messageResource_zh_CN.properties文件內容:

loginPage=\u767B\u5F55\u9875\u9762
errorPage=\u9519\u8BEF\u9875\u9762
succPage=\u6210\u529F\u9875\u9762
failTip={0}\uFF0C\u5BF9\u4E0D\u8D77\uFF0C\u4F60\u4E0D\u80FD\u767B\u5F55
succTip={0}\uFF0C\u6B22\u8FCE\uFF0C\u4F60\u5DF2\u7ECF\u767B\u5F55\uFF01
user=\u7528\u6237\u540D
pass=\u5BC6\u7801
login=\u767B\u5F55
welcomeMsg={0}\uFF0C\u60A8\u597D\uFF01\u73B0\u5728\u65F6\u95F4\u662F{1}\uFF01
messageResource_zh_CN.properties

在國際化資源文件中,中文是以ASCLL的格式保存的。

注意:這裏的資源文件有使用到通配符的。

3、新建login.jsp登陸界面

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s" %>    
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title><s:text name="loginPage"></s:text></title>
</head>
<body>

    <!--經過動態語言切換,實現語言切換功能。request_locale是系統默認的參數,改變值可以切換語言  -->
    <a href="lang.action?request_locale=zh_CN">中文</a>
    <a href="lang.action?request_locale=en_US">English</a>
    
    <s:form action="login" method="post">
        <s:textfield name="username" key="user"></s:textfield>
        <s:textfield name="password" key="pass"></s:textfield>
        <s:submit key="login"></s:submit>
    </s:form>
</body>
</html>

在此jsp頁面中,有使用到動態語言切換。該jsp頁面中使用到<s:textfield>標籤來直接輸出國際化信息,這裏的key對應國際化的key(注意:這裏聲明一點,國際化資源文件的信息使key-value)

4、新建兩個類,分別繼承ActionSupport,一個做爲動態語言切換,一個做爲業務邏輯處理。

新建lang類繼承ActionSupport(這裏僅僅做爲語言切換)

package com.Struts2.I18n;

import com.opensymphony.xwork2.ActionSupport;

//該action只是單純的切換顯示的語言而已
public class lang extends ActionSupport {
    public String execute(){
        System.out.println("why");
        return SUCCESS;
    }
}

新建LoginAction繼承ActionSupport,這裏做爲業務邏輯處理

package com.Struts2.I18n;

import java.util.HashMap;
import java.util.Map;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;

public class LoginAction extends ActionSupport {
    private String username;
    private String password;
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public String execute(){
        ActionContext ctx = ActionContext.getContext();
        Map<String, Object> m = new HashMap<String,Object>();
        //用戶登陸成功
        if("admin".equals(getUsername())&&"123".equals(getPassword())){
            System.out.println(getUsername());
            if(ctx.getSession()!=null){
                System.out.println(ctx.getSession());
                ctx.getSession().put("user", this.getUsername());
            }
            //調用getText方法取出國際化信息(沒使用通配符的狀況下使用)
            //ctx.put("tip", getText("succTip"));
            
            //使用通用符
            ctx.put("tip", getText("succTip",new String[]{getUsername()}));
            
            return SUCCESS;
        }else{
            //調用getText方法取出國際化信息(沒使用通配符的狀況下使用)
            //ctx.put("tip", getText("failTip"));
            
            ctx.put("tip", getText("failTip",new String[]{getUsername()}));
            return ERROR;
        }
    }
}

struts.xml配置

 

5、新建登陸成功的界面和登陸失敗的界面

新建 Hello.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s" %>    
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title><s:text name="scuuPage"></s:text></title>
</head>
<body>
    <jsp:useBean id="d" class="java.util.Date" scope="page"></jsp:useBean>
        <%-- <!--不使用通配符,僅僅輸出國際化信息的標籤  -->
        <s:property value="#tip"/><br/>
        <!--輸出用戶的名稱  -->
        <s:property value="#attr.user"/>
        <!--輸出當前的時間  -->
        ${pageScope.d } --%>
        
        <!--使用通配符 :
        經過s:text和s:param來填充佔位符,注意:順序必須一致!-->
        <s:property value="#tip"/><br/><!--#tip是獲取國際化的信息  -->
        <!--使用s:text可以給properties文件裏面的通配符賦值,注意:順序必須同樣  -->
        <s:text name="welcomeMsg">
            <s:param><s:property value="username"/></s:param>
            <s:param>${pageScope.d }</s:param>
        </s:text>
    <!--跳轉到登陸界面  -->
    <a href="/login.jsp">
        <s:text name="back"></s:text>
    </a>
</body>
</html>

注意:這裏的標籤有使用非通配符和通配符的標籤,筆者這個案例是使用到通配符,你能夠將其註釋掉,而且在資源文件中吧{0},這些換成你想要顯示的信息,而後將第一層註釋去掉,就能看到你想要顯示的信息了。使用通配符必須注意順序問題。

新建error.jsp頁面

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s"%>    
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
    Error:<s:fielderror/>
    
</body>
</html>
error.jsp

效果以下:

相關文章
相關標籤/搜索