struts2.1.6教程七、国际化
尽管国际化不是重点内容,但是也有必要了解它的使用。在struts2中国际化有三种级别:分别是针对某个Action的action级别,针对package的package级别,针对webapp的webapp级别。下面我们建立struts2i18n项目来演示国际化在struts2中的使用。
1.action级别下的国际化
步骤一、首先是建立login.jsp及LoginAction,由于它们经常使用,在此省去它们的代码。
步骤二、建立资源文件,由于LoginAction在com.asm包中,所以我们应在com.asm包下我们建立两个资源文件:一个是中文LoginAction_zh_CN.properties、一个是英文LoginAction_en_US.properties。注意它们的名字相对固定,前面与Action的名字相同,后面是语言和国家代码。
英文资源文件内容如下:
login_page=login page
login_username=userName
login_password=password
login_sex=sex
login_male=male
login_female=female
login_submit=login
login_reset=reset
login_suc=Welcome {0}
中文资源文件,需要特别注意:我们应使用Myeclipse自带的MyEclipse properties Editer编辑器来打开此资源文件,并在properties视图下进行编辑,这样它会把中文进行编码(我们切换到source视图下可以看到经编码后的中文)。 这一步非常重要,否则会出现乱码。
步骤三,修改login.jsp中的内容:
<%@ page language="java" pageEncoding="utf-8"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<html>
<body>
<s:text name="login_page"/><br>
<s:label key="login_username"/>
<s:form action="/login.action" method="post">
<!--
<s:textfield label="用户名" name="username" required="true" />
-->
<s:textfield label="%{getText('login_username')}" name="username" /> <!--
<s:password label="密码" name="password" required="true"/>
-->
<s:password key="login_password" name="password" /> <!--
<s:radio list="#{1:'男',2:'女'}" value="1" label="性别" name="sex" />
-->
<s:radio list="#{1:getText('login_male'),2:getText('login_female')}" value="1" label="%{getText('login_sex')}" name="sex" />
<s:submit key="login_submit" /> <s:reset key="login_reset"/>
</s:form>
</body>
</html>
说明:对资源文件的引用,我们采取了两种方式
:有的是通过在label中使用%{getText('资源文件中的key')}这样的形式,
有的是通过key=资源文件中的key这种形式。需要注意在radio标签中list对资源文件的引用。另外需要注意:
<s:text name="login_page"/><br>
<s:label key="login_username"/>
它们的区别:前面是纯文本,后者是一个块。我们可以通过查看login.jsp的源码来证明。
步骤四、当我们直接访问login.jsp时会报错,因为在login.jsp中用到了资源文件,而资源文件又依赖于LoginAction,所以我们只能通过此Action来跳到login.jsp。但是使用包范围、全局范围的资源文件时,可以直接访问login.jsp文件实现国际化。操作步骤如下:
首先在LoginAction中增加一个方法:
public String doGoLogin() {
return LOGIN;
}
随后再在struts.xml中配置如下内容:
<package name="i18n" extends="struts-default" namespace="/">
<action name="login" class="com.asm.LoginAction">
<result name="success">success.jsp</result>
<result name="login">login.jsp</result>
</action>
</package>
接着再编写一个link.jsp页面,内容如下:
<a href="<%=request.getContextPath() %>/login!goLogin.action">登录</a>
直接访问Action中的方法 格式:doX(大写)xxx ---- ActionName!x(小写)xxx.action 注意此方法和前面二.7中相关方法的区别。 我们通过此Action跳转到login.jsp这样便能成功访问到login.jsp页面。
步骤五、在success.jsp中使用资源文件,主要内容如下
<s:text name="login_suc">
<s:param value="%{username}"></s:param>
</s:text>
说明:在前面的资源文件中,我们配置了login_suc=Welcome {0},其中{0}表示占位参数,这里我们使用<s:param>来给此参数赋值。
步骤六、测试:在ie的internet选项中改变语言实现国际化的访问。
2.配置package的资源文件
同样在建立com.asm包下建立两个资源文件(package级别的资源文件名必须以package开头):取名为:package_zh_CN.properties,它的内容为:pack=pack属性值 和package_en_US.properties,它的内容为:pack=packageAttributeValue
然后再在login.jsp页面中增加如下内容:
<h4>测试包资源文件</h4>
<s:text name="pack"></s:text>
这样便完成了package级别的资源文件配置,最后发布测试。
3.app级别的资源文件
在src目录下建立两个资源文件,取名为myapp_en_US.properties,它的内容为:
app=appAttributeValue和myapp_zh_CN.properties,它的内容为:
然后还需要在strust.xml中增加如下配置:
<constant name="struts.custom.i18n.resources" value="myapp"></constant>
注意:name是固定值,而value来自于这个资源文件的基名。
最后在login.jsp中增加如下内容:
<h4>测试app级别资源文件</h4>
<s:text name="app"></s:text>
这样便完成了app级别的资源文件配置,随后发布测试。
说明:action级的资源文件优先级别最高,app最低。Pack级别的资源文件可作用于同一个包,app级别的资源文件可作用于当前项目。
补充:在jsp页面中直接访问某个资源文件,struts2为我们提供了i18n标签,使用此标签我们可以在类路径下直接从某个资源文件中获取国际化数据,而无需任何配置:
<s:i18n name="XXX"> --xxx为类路径下资源文件的基名
<s:text name="">
<s:param></s:param>
</s:text>
</s:i18n>
而如果要访问的资源文件在类路径的某个包下(如action或package级别的资源文件),可以这样访问:
<s:i18n name="com/asm/资源文件基名">--com.asm为包名
4.使用资源文件的原理
我们建立ReadResourceFileTest类,代码如下:
package com.asm;
import java.util.Locale;
import java.util.ResourceBundle;
public class ReadResourceFileTest {
public static void main(String[] args) {
ResourceBundle rb=ResourceBundle.getBundle("com.asm.LoginAction", Locale.US);
System.out.println(rb.getString("login_suc"));
}
}
补充:在Action类(必须继承自ActionSupport)中获取资源文件的值的方法,可以使用如下代码:
String value = this.getText("资源文件的键名");
//获取资源文件的对应的值。如果想给资源文件中的占位符赋值,可以使用getText的重载方法。
ActionContext.getContext().put("XXX",value);//存放在request范围,供jsp获取此值
5.选择使用资源文件
其实在我们成功访问到login.jsp页面后,只要在地址栏中增加参数request_locale=en_US便可以正确切换到登录页面为英文。当然我们可以再链接根据此参数写这个资源文件的链接。当然我们也可借助一个新Action来实现,操作步骤如下:在login.jsp中增加如下代码:
<a href="change.action?request_locale=zh_CN">
<s:text name="chinese"></s:text>
</a>
<a href="change.action?request_locale=en_US">
<s:text name="english"></s:text>
</a>
change.action对应的配置为:
<action name="change" class="com.asm.ChangeLangAction">
<result>/login.jsp</result>
</action>
ChangeLangAction的主要代码如下:
package com.asm;
public class ChangeLangAction extends ActionSupport {
public String execute() throws Exception {
return SUCCESS;
}
}
以上是第一种方法,特别要注意,由于使用了不同Action,所以要资源文件这时只有pack级别和app级别的才起作用,所以这时还应把action级别的资源文件内容增加到app级别的资源文件中去。下面使用第二种方法,原理基本和上面一样,只需在此ChangeLangAction中增加一个新的字段String lang及相应的get/set方法,再增加一个新的方法changeLang,代码如下:
public String changeLang() throws Exception {
Locale locale = null;
System.out.println(lang);
if (lang.equals("zh")) {
// 显示中文
locale = Locale.CHINA;
System.out.println("======" + lang+locale);
} else {
// 显示英文
locale = Locale.US;
}
ActionContext.getContext().setLocale(locale); ServletActionContext.getRequest().getSession().setAttribute("WW_TRANS_I18N_LOCALE", locale);
return SUCCESS;
}
配置内容为:
<action name="cl" class="com.asm.ChangeLangAction" method="changeLang">
<result>/login.jsp</result>
</action>
在login.jsp中对应的链接为:
<a href="cl.action?lang=zh">
<s:text name="chinese"></s:text>
</a>
<a href="cl.action?lang=en">
<s:text name="english"></s:text>
</a>
这样操作后,当我们成功访问到login.jsp后,便可以点击链接来随意切换访问英文或中文页面。
struts2.1.6教程七、国际化的更多相关文章
- struts2官方 中文教程 系列七:消息资源文件
介绍 在本教程中,我们将探索使用Struts 2消息资源功能(也称为 resource bundles 资源绑定).消息资源提供了一种简单的方法,可以将文本放在一个视图页面中,通过应用程序,创建表单字 ...
- struts2官方 中文教程 系列十:Form标签
介绍 在本教程中,我们将探索其他Struts 2表单控件.在前面的教程中,我们介绍了如何使用Struts 2表单(处理表单.表单验证和消息资源文件),我们介绍了如何使用Struts 2 head, f ...
- CRL快速开发框架系列教程七(使用事务)
本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...
- Laravel教程 七:表单验证 Validation
Laravel教程 七:表单验证 Validation 此文章为原创文章,未经同意,禁止转载. Laravel Form 终于要更新这个Laravel系列教程的第七篇了,期间去写了一点其他的东西. 就 ...
- 无废话ExtJs 入门教程七[登陆窗体Demo:Login]
无废话ExtJs 入门教程七[登陆窗体Demo:Login] extjs技术交流,欢迎加群(201926085) 在这节我们通过前几节讲的内容做一个登陆页面,把前几节讲的内容贯穿一下. 1.代码如下: ...
- ASP.NET 5系列教程(七)完结篇-解读代码
在本文中,我们将一起查看TodoController 类代码. [Route] 属性定义了Controller的URL 模板: [Route("api/[controller]") ...
- 黄聪:Microsoft Enterprise Library 5.0 系列教程(七) Exception Handling Application Block
原文:黄聪:Microsoft Enterprise Library 5.0 系列教程(七) Exception Handling Application Block 使用企业库异常处理应用程序模块的 ...
- webpack4 系列教程(七): SCSS提取和懒加载
教程所示图片使用的是 github 仓库图片,网速过慢的朋友请移步>>> (原文)webpack4 系列教程(七): SCSS 提取和懒加载. 个人技术小站: https://god ...
- (转)NGUI系列教程七(序列帧动画UITexture 和 UIsprit)
NGUI系列教程七(序列帧动画) 今天我给大家讲一下如何使用NGUI做序列帧动画.本节主要包括两方面内容,分别是使用UIspirit和使用UITexture 做序列帧动画.废话不说了,下面开始.还 ...
随机推荐
- 《Python基础教程》第1章读书笔记
# -*- coding:utf-8 -*- x = "hello " y = "world" print x+y print "hello &quo ...
- JS实现轻量级计算器
想尝试做一个网页版计算器后,参考了很多博客大神的代码,综合归纳.总结修改,整理如下文. 附: Demo 源码 一.HTML+CSS 具体结构样式如下图,基本参照手机计算器界面.按钮功能可以查 ...
- 深度理解 Virtual DOM
目录: 1 前言 2 技术发展史 3 Virtual DOM 算法 4 Virtual DOM 实现 5 Virtual DOM 树的差异(Diff算法) 6 结语 7 参考链接 1 前言 我会尽量把 ...
- 利用 Forcing InnoDB Recovery 特性解决 MySQL 重启失败的问题
小明同学在本机上安装了 MySQL 5.7.17 配合项目进行开发,并且已经有了一部分重要数据.某天小明在开发的时候,需要出去一趟就直接把电脑关掉了,没有让 MySQL 正常关闭,重启 MySQL 的 ...
- Css清除浮动最优方式之一
---恢复内容开始--- .container:before, .container:after { display: table; content: " "; } .contai ...
- 使用Dubbox构架分布式服务
第一部分:Dubbo的背景分析及工作原理 1. Dubbo是什么?Dubbo是一个来自阿里巴巴的开源分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案. 简单的说 ...
- three.js提供的几何体
1.简单几何体 three.js提供的稍微简单点的几何体包括有:PlaneGeometry(平面).CircleGeometry(圆形).ShapeGeometry(塑性).CubeGeometry( ...
- JavaScript巧学巧用
关于 微信公众号:前端呼啦圈(Love-FED) 我的博客:劳卜的博客 知乎专栏:前端呼啦圈 前言 由于工作和生活上的一些变化,最近写文章的频率有点下降了,实在不好意思,不过相信不久就会慢慢恢复过来, ...
- Html5-audio标签简介及手机端不自动播放问题
1.audio:html5音频标签 <audio loop src="/photo/aa.mp3" id="audio" autoplay preload ...
- split()方法
split()方法用于把一个字符串分隔成字符串数组. 它有两个参数: separator:从参数指定的地方分隔字符串,必需: howmany:该参数可指定返回的数组的最大长度.如果设置了该参数,返回的 ...