二 中英文链接动态选择语言
实现的效果是,在登录页面或者主页面选择一种语言,然后全局都使用这种语言。
如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>
二.七 重启服务器,验证语言是否可以进行选择
经过验证,发现可以正常的进行跳转,可以不用改变浏览器的环境,就可以*选择语言。
选择中文:
选择英文:
三. 国际化完善操作
项目中有两个小的不完美的地方,
第一,默认语言是硬编码。
第二,选择中英文时,不能是两个单独的链接,而应该是一个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包。
三.二.二 修改 /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思想的使用。
本章节代码链接为:
链接:https://pan.baidu.com/s/1ddREC5hnwWpO9xSb3hYBcQ 提取码:z5d9
谢谢您的观看!!!