• Struts2入门(六)——国际化


    一、前言

    1.1、国际化简介

    国际化是指应用程序在运行的时候,根据客户端请求来自的国家地区、语言的不同而显示不同的界面(简单说就是根据你的地区显示相关地区的语言,如果你现在在英国,那么显示的语言就是英语),国际化的存在价值就是:当一个应用需要在全球使用。

    国际化(Internationalization),国际化也被存在I18N,因为头字母是I,尾字母是N,中间有18为字母,这个你了解就好。

    本地化(Localization),首字母是L,尾字母是N,中间有10个字母,所以也成为L10N。(本地化:根据不同区域显示本地语言)

    1.2、国际化实现思路

    将程序中的信息等放在资源文件中,程序在运行过程中,会根据本地语言和国家代码自动到相关的资源文件中提取信息。

    1.3、Java的国际化代码实现

    新建一个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
     * */

    注意:使用国际化必须建立资源文件才能够使用

    en:表示英语,zh:表示中文

    myproperties_en.properties文件代码为:

    username=username
    password=password
    submit=submit

    myproperties_zh.properties代码为:(注意:中文被编译为ASCLL格式)

    username=u7528u6237
    password=u5BC6u7801
    submit=u63D0u4EA4

    我们可以新建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界面为:

    如果是中文在顶层的话,则显示为中文。

     二、Struts2的国际化入门

    2.1、Struts2的国际化一般是建立在java基础上的,一样也是通过不同国家/语言环境的资源文件,然后通过ResourceBundle加载指定的Locale对应的资源文件,再取得该资源文件中指定Key对应的消息——整个过程与java程序的国际化完全相同,只是Struts2框架对Java程序国际化做了进一步的封装,从而简化了应用程序的国际化。

    Struts2应用程序的国际化主要包括:输入校验提示信息国际化,类型转换提供国际化,Action信息国际化和JSP页面国际化等组成。这里主要介绍如何在Action中取得国际化消息,如何在JSP页面上输出国际化消息,如何进行输入校验提示信息的国际化。

    2.2、国际化的类型

    1、Application级别的国际化

    2、Package级别的国际化

    3、Action级别的国际化

    2.3、案例分析

    Struts2中提供了很多加载国际化资源文件的方式,最简单最常用的就是加载全局的国际化资源文件,加载全局的国际化资源文件通常使用配置常量来实现的。不管是Web.xml文件配置常量,还是struts.properties文件中配置常量,以及在struts.xml中配置常量,只需要配置struts.custom.i18n.resources常量即可。该常量的值为全局国际化资源文件的名字。

    一、配置常量

    如:

    该资源文件的名字为:messageResource,后面的en_US表示美国英语,zh_CN表示中文。

    加载全局国际化配置文件有三种方法

    1、我们可以新建struts.properties,将其放在同级目录下。

    内容为:struts.custom.i18n.resources=messageResource

    2、也可以在struts.xml中配置常量

    3、web.xml(没试过)

    Struts2访问国际化资源文件有以下4种方式:

    1、在jsp页面使用struts2的<s:text>,该标签指定一个name属性,该属性指定国际化资源文件中的key

    2、action类中访问国际化消息,使用ActionSupport类中的getText(),该方法接受一个name属性,该属性指定国际化资源文件中的key

    3、在表单元素的label输出国际化消息,可以为其指定一个key属性,该属性指定国际化资源文件中的key

    4、在jsp页面还可以使用<s:property value="getText('name')">,其实是调用了getText方法。

    二、新建资源文件(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=u767Bu5F55u9875u9762
    errorPage=u9519u8BEFu9875u9762
    succPage=u6210u529Fu9875u9762
    failTip={0}uFF0Cu5BF9u4E0Du8D77uFF0Cu4F60u4E0Du80FDu767Bu5F55
    succTip={0}uFF0Cu6B22u8FCEuFF0Cu4F60u5DF2u7ECFu767Bu5F55uFF01
    user=u7528u6237u540D
    pass=u5BC6u7801
    login=u767Bu5F55
    welcomeMsg={0}uFF0Cu60A8u597DuFF01u73B0u5728u65F6u95F4u662F{1}uFF01
    messageResource_zh_CN.properties

    在国际化资源文件中,中文是以ASCLL的格式保存的。

    注意:这里的资源文件有使用到通配符的。

    三、新建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)

    四、新建两个类,分别继承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配置

    五、新建登录成功的界面和登录失败的界面

    新建 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

    效果如下:

  • 相关阅读:
    基于maven的javaweb项目模块化开发
    ramoops具体失败原因来解释驱动寄存器
    REQIMPORT-购买内部应用程序(R12.2.3)
    iOS_动态插入或删除行
    leetcode:pascal&#39;s_triangle_II
    设计模式-----观察者模式(Obsever)
    org.eclipse.birt.report.data.oda.jdbc.JDBCException: Missing properties in Connection.open(Propertie
    Unity3D-RPG项目实战(1):发动机的特殊文件夹
    NYOJ 372 巧克力的
    LeetCode Solutions : Reorder List
  • 原文地址:https://www.cnblogs.com/IT-1994/p/6021127.html
Copyright © 2020-2023  润新知