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 做序列帧动画.废话不说了,下面开始.还 ...
随机推荐
- java中GUI的awt和Swing的知识点
刚刚学习了java的GUI,写了几个程序,基本熟悉了awt和Swing,下面和大家分享一下知识点 1.JFrame的层次结构 参考:http://tieba.baidu.com/p/200421612 ...
- idea2015的使用心得
今天打开myeclipse感觉里面全是project,也懒着换地方了,因为这些代码还要时常看,索性安装了idea试试水,感觉还不错,用起来并不比myeclipse差,跟webstorm差不多,他俩就是 ...
- 表格组件神器:bootstrap table详细使用指南
1.bootstrap-table简介 1.1.bootstrap table简介及特征: Bootstrap table是国人开发的一款基于 Bootstrap 的 jQuery 表格插件,通过简单 ...
- DataReader和DataSet区别
可以使用DataReader类的对象或DataSet类的对象从数据库读取数据,但它们是有区别的,归纳起来大致有以下几条: 1. DataReader是数据管理提供者类,而DataSet是一 ...
- Spring+Redis(keyspace notification)实现定时任务(订单过期自动关闭)
1.起因 最近公司项目要做订单超期未支付需自动关闭,首先想到的是用spring的定时器(@Schedule),结果领导举各种例子说会影响性能,只能作罢.后来想能不能基于redis实现, 学习(baid ...
- ios 获取当前ViewController
- (UIViewController*)getpresentVC:(UIWindow *)window{ if ([window.rootViewController class]==[UITabB ...
- 4 安装MPush
cnblogs-DOC 1.服务器环境 2.安装Redis3.安装Zookeeper4.安装MPush5.安装Alloc服务6.完整测试7.常见问题 一.Linux安装Mpush [root@loca ...
- ENetwork Basic Configuration PT Practice SBA
CCNA Exploration: 网络基础知识 (版本 4.0) A few things to keep in mind while completing this activity: 1 Do ...
- Ubuntu下安装Tomcat7
第一部分:基本安装 1.打开http://tomcat.apache.org/download-70.cgi,下载apache-tomcat-7.0.68.zip. 2.拷贝至合适位置,如/usr/l ...
- bzoj2876 [Noi2012]骑行川藏
Description 蛋蛋非常热衷于挑战自我,今年暑假他准备沿川藏线骑着自行车从成都前往拉萨.川藏线的沿途有着非常美丽的风景,但在这一路上也有着很多的艰难险阻,路况变化多端,而蛋蛋的体力十分有限,因 ...