Struts2实现国际化操作及中英文切换(九)下

二 中英文链接动态选择语言


实现的效果是,在登录页面或者主页面选择一种语言,然后全局都使用这种语言。


如Login.jsp时显示一种默认的语言,有一个选择语言的框,点击中文后,跳转到success.jsp显示中文,


success.jsp跳转到list.jsp也会显示中文。


在login.jsp页面点击英文后,跳转到success.jsp显示英文,success.jsp跳转到list.jsp也会显示英文。


模拟这种全局都显示一种语言的项目。要想全局都使用这种语言,就需要对全局性进行一次判断,


故最好用拦截器实现。 非常幸运的是,Struts2中有一个i18n的拦截器,我们只需要稍微添加一些操作即可。


二.一 编写后端 LoginAction, 用于实现跳转


package com.yjl.web.action;

import com.opensymphony.xwork2.ActionSupport;

/**
* @author 两个蝴蝶飞
* @version 创建时间:Aug 27, 2018 10:56:50 AM
* 登录的国际化操作
*/
public class LoginAction extends ActionSupport{
    private static final long serialVersionUID = 1L;
    //跳转到首页,用的是默认的语言环境
    public String toLogin(){
        return "toLogin";
    }
    //跳转到登录页面,用的是选择的语言环境
    public String login(){
        return SUCCESS;
    }
    //根据所选择的语言环境,继续相应的跳转,表示全局性选择语言。
    public String list(){
        return "list";
    }
}


二.二 配置 struts.xml 文件


<struts>
    <!--修改国际化编码 -->
    <constant name="struts.i18n.encoding" value="UTF-8"></constant>
    <!--修改是否为开发者模式 -->
    <constant name="struts.devMode" value="true"></constant>
    <!--修改ui样式表 -->
    <constant name="struts.ui.theme" value="simple"></constant>
    <!-- 添加国际化的资源所在的位置 -->
    <constant name="struts.custom.i18n.resources" value="i18n"></constant>
    <package name="hello" extends="struts-default" namespace="/">
        <action name="Login_*" class="com.yjl.web.action.LoginAction" method="{1}">
                <result name="toLogin">/WEB-INF/content/login2.jsp</result>
                <result name="success">/WEB-INF/content/success2.jsp</result>
                <result name="list">/WEB-INF/content/list2.jsp</result>
        </action>
        <!-- 配置跳转页面 -->
        <action name="*">
            <result>/WEB-INF/content/{1}.jsp</result>
        </action>
    </package>
</struts>


二.三 编写前端页面


二.三.一 编写 /content/login2.jsp


<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title><s:text name="i18n.login.title"/></title>
</head>
<body>
    <s:form action="Login_login.action" namespace="/" method="post">
            <s:text name="i18n.login.userName"/>: <s:textfield  name="name"/>  <br/>
            <s:text name="i18n.login.password"/>: <s:password name="password"/><br/>
 
            <input type="submit" value="<s:text name='i18n.login.submit'></s:text>"/>
            <input type="reset" value="<s:text name='i18n.login.reset'></s:text>"/> <br/>
            <s:a action="Login_login.action?request_locale=zh_CN" namespace="/">中文</s:a>
            <s:a action="Login_login.action?request_locale=en_US" namespace="/">英文</s:a>
    </s:form>
</body>
</html>


二.三.二 编写 /content/success2.jsp


<body>
    <s:text name="i18n.success.welcome">
        <s:param name="0">两个蝴蝶飞</s:param>
        <s:param name="1">男</s:param>
        <s:param name="2">24</s:param>
    </s:text>
    <s:a action="Login_list" namespace="/">跳转到list页面</s:a>
</body>


二.三.三 编写 /content/list2.jsp


<body>
    <s:text name="i18n.success.welcome">
        <s:param name="0">YJL</s:param>
        <s:param name="1">男</s:param>
        <s:param name="2">24</s:param>
    </s:text>
</body>


二.四 重启服务器 检测跳转是否正确


输入网址: http://localhost:8080/Struts_i18n/Login_toLogin


页面按照设定进行相应的跳转,只是语言只是一种语言,没有改变。


因为并没有写拦截器呢。


二.五 创建国际化拦截器类I18nInterceptor


在com.yjl.web.interceptor包下创建一个类 I18nInterceptor


package com.yjl.web.interceptor;
import java.util.Locale;
import java.util.Map;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor;

/**
* @author 两个蝴蝶飞
* @version 创建时间:Aug 27, 2018 5:44:21 PM
* 类说明  国际化的拦截器
*/
public class I18NInterceptor extends MethodFilterInterceptor{
    private static final long serialVersionUID = 1L;
    @Override
    protected String doIntercept(ActionInvocation ai) throws Exception {
        //1. 得到ActionContext对象,从而获取session
        ActionContext actionContext=ai.getInvocationContext();
        Map<String,Object> session=(Map<String, Object>) actionContext.getSession();
        //2.得到里面设置的值Locale  注意key值
        Locale locale=(Locale) session.get("WW_TRANS_I18N_LOCALE");
        //3. 判断这个值是否为null,如果为null则设置一个默认值
        if(locale==null){
            Locale defaultLocale=new Locale("zh","CN");
            //将其设置到session中
            session.put("WW_TRANS_I18N_LOCALE", defaultLocale);
        }
        //返回
        return ai.invoke();
    }
}


其中Locale defaultLocale=new Locale(“zh”,“CN”);


是采用硬编码编码进去的。


二.六 在struts.xml中配置拦截器


拦截器的具体使用请参照上一章


<package name="user" extends="struts-default" namespace="/">
        <interceptors>
            <interceptor name="i18nInterceptor" class="com.yjl.web.interceptor.I18NInterceptor"></interceptor>
            <interceptor-stack name="defaultStack">
                <interceptor-ref name="i18nInterceptor"></interceptor-ref>
                <interceptor-ref name="defaultStack"></interceptor-ref>
            </interceptor-stack>
        </interceptors>
        <action name="Login_*" class="com.yjl.web.action.LoginAction" method="{1}">
                <result name="toLogin">/login.jsp</result>
                <result name="success">/success.jsp</result>
                <result name="list">/list.jsp</result>
        </action>
</package>


二.七 重启服务器,验证语言是否可以进行选择


经过验证,发现可以正常的进行跳转,可以不用改变浏览器的环境,就可以*选择语言。


选择中文:


Struts2实现国际化操作及中英文切换(九)下


选择英文:


Struts2实现国际化操作及中英文切换(九)下


三. 国际化完善操作


项目中有两个小的不完美的地方,


第一,默认语言是硬编码。


第二,选择中英文时,不能是两个单独的链接,而应该是一个select框进行选择。


三.一 解决默认语言硬编码


三.一.一 拦截器 I18NInterceptor 配置


在I18nInterceptor拦截器中添加两个参数,country和language,


并指明默认参数为"zh",“cn”. 表明用户可以不传递这两个参数,默认是中文


private String country="zh";
private String language="CN";
public String getCountry() {
    return country;
}
public void setCountry(String country) {
    this.country = country;
}
public String getLanguage() {
    return language;
}
public void setLanguage(String language) {
    this.language = language;
}


三.一.二 struts.xml中配置


<interceptors>
    <interceptor name="i18nInterceptor" class="com.yjl.web.interator.I18NInterceptor"></interceptor>
    <interceptor-stack name="defaultStack">
        <interceptor-ref name="i18nInterceptor">
            <param name="country">zh</param>
            <param name="language">CN</param>
        </interceptor-ref>
        <interceptor-ref name="defaultStack"></interceptor-ref>
    </interceptor-stack>
</interceptors>


三.二 解决链接显示的问题


三.二.一 引入关于json的jar包


需要引入关于json的包json-default, 其中必须要引入json与struts的jar包。


Struts2实现国际化操作及中英文切换(九)下


三.二.二 修改 /content/login.jsp 页面


    <div class="content">
        <s:form action="Login_login.action" namespace="/" method="post">
                <s:text name="i18n.login.userName"/>: <s:textfield  name="name"/>  <br/>
                <s:text name="i18n.login.password"/>: <s:password name="password"/><br/>
                <input type="submit" value="<s:text name='i18n.login.submit'/>"/>
                <input type="reset" value="<s:text name='i18n.login.reset'/>"/>
        </s:form>
    </div>
    <s:select name="i18nCharset" id="i18nSelect" list="#{'zh_CN':'中文','en_US':'英文'}">
                <%--这里中文和英文也应该用国际化<s:text>显示的,为了简便,为中文写出来 
                    不能用html注释--%>
                <!-- <option value="zh_CN">中文</option>
                <option value="en_US">英文</option> -->
    </s:select>


三.二.三 重写 LoginAction 方法


添加一个charset字符串数据,实现setter和getter方法,传递选择的数据。


然后添加一个getCharacterSelect()方法。


package com.yjl.web.action;

import java.util.Locale;
import java.util.Map;

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

/**
* @author 两个蝴蝶飞
* @version 创建时间:Aug 27, 2018 10:56:50 AM
* 登录的国际化操作
*/
public class LoginAction extends ActionSupport{
    private static final long serialVersionUID = 1L;
    private String charset;
    public void setCharset(String charset) {
        this.charset = charset;
    }
    public String getCharset() {
        return charset;
    }

    //跳转到首页,用的是默认的语言环境
    public String toLogin(){
        return "toLogin";
    }
    //跳转到登录页面,用的是选择的语言环境
    public String login(){
        return SUCCESS;
    }
    //根据所选择的语言环境,继续相应的跳转,表示全局性选择语言。
    public String list(){
        return "list";
    }
    //语言编码改变时调用这一个
    public String charsetChange(){
        return "charsetChange";
    }
    //获取相应的编码
    public String getCharsetSelect(){
        Map<String,Object> session=(Map<String, Object>) ActionContext.getContext().getSession();
        Locale locale=(Locale) session.get("WW_TRANS_I18N_LOCALE");
        //取得值
        charset=locale.getLanguage()+"_"+locale.getCountry();
        System.out.println("获取的值:"+charset);
        return "getCharsetSelect";
    }
}


三.二.四 配置 struts.xml 文件


在struts.xml中:


    <action name="Login_*" class="com.yjl.web.action.LoginAction" method="{1}">
        <result name="toLogin">/login.jsp</result>
        <result name="charsetChange">/login.jsp</result>
        <!--注意json形式的写法-->
        <result name="getCharsetSelect" type="json">
            <param name="root">charset</param>
        </result>
        <result name="success">/success.jsp</result>
        <result name="list">/list.jsp</result>
                
</action>


注意,包要添加 default-json 的包。


<package name="hello" extends="struts-default,json-default" namespace="/">


三.二.五 在/content/login2.jsp 页面中 添加如下 js


添加 js 脚本代码


<!-- 在线引入jquery 需要联网,用户可以自己下载后本地引用即可-->
<script src="https://cdn.bootcss.com/jquery/1.10.2/jquery.min.js"></script>
<script>
    $(document).ready(function(){
        $("select#i18nSelect").change(function(){
            //select改变时触发整个
            //取得option中的值
            var charset=$("select#i18nSelect option:selected").val();
                $.post("/Struts_i18n/Login_charsetChange.action",{"request_locale":charset},
                         function(data,status){
                             //成功之后,刷新一下界面
                            window.location.reload();
                        }
                );
        });
    });
    $(document).ready(function(){
        $.post("/Struts_i18n/Login_getCharsetSelect.action",
                 function(data,status){
                    var charset=data;
                    $("select#i18nSelect").val(charset);
                }
        );
    });
</script>


三.二.六 重启服务器,验证


按照设计那样运行,可以实现自动回显的操作了。


注意两个js思想的使用。


Struts2实现国际化操作及中英文切换(九)下


Struts2实现国际化操作及中英文切换(九)下


本章节代码链接为:


链接:https://pan.baidu.com/s/1ddREC5hnwWpO9xSb3hYBcQ 
提取码:z5d9


谢谢您的观看!!!

上一篇:iOS: Xcode7安装KSImageNamed插件,自动读取图片名称


下一篇:《SEO的艺术(原书第2版)》——2.3 确定搜索者意图并交付相关、新鲜的内容