尽管国际化不是重点内容,但是也有必要了解它的使用。在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教程七、国际化的更多相关文章

  1. struts2官方 中文教程 系列七:消息资源文件

    介绍 在本教程中,我们将探索使用Struts 2消息资源功能(也称为 resource bundles 资源绑定).消息资源提供了一种简单的方法,可以将文本放在一个视图页面中,通过应用程序,创建表单字 ...

  2. struts2官方 中文教程 系列十:Form标签

    介绍 在本教程中,我们将探索其他Struts 2表单控件.在前面的教程中,我们介绍了如何使用Struts 2表单(处理表单.表单验证和消息资源文件),我们介绍了如何使用Struts 2 head, f ...

  3. CRL快速开发框架系列教程七(使用事务)

    本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...

  4. Laravel教程 七:表单验证 Validation

    Laravel教程 七:表单验证 Validation 此文章为原创文章,未经同意,禁止转载. Laravel Form 终于要更新这个Laravel系列教程的第七篇了,期间去写了一点其他的东西. 就 ...

  5. 无废话ExtJs 入门教程七[登陆窗体Demo:Login]

    无废话ExtJs 入门教程七[登陆窗体Demo:Login] extjs技术交流,欢迎加群(201926085) 在这节我们通过前几节讲的内容做一个登陆页面,把前几节讲的内容贯穿一下. 1.代码如下: ...

  6. ASP.NET 5系列教程(七)完结篇-解读代码

    在本文中,我们将一起查看TodoController 类代码. [Route] 属性定义了Controller的URL 模板: [Route("api/[controller]") ...

  7. 黄聪:Microsoft Enterprise Library 5.0 系列教程(七) Exception Handling Application Block

    原文:黄聪:Microsoft Enterprise Library 5.0 系列教程(七) Exception Handling Application Block 使用企业库异常处理应用程序模块的 ...

  8. webpack4 系列教程(七): SCSS提取和懒加载

    教程所示图片使用的是 github 仓库图片,网速过慢的朋友请移步>>> (原文)webpack4 系列教程(七): SCSS 提取和懒加载. 个人技术小站: https://god ...

  9. (转)NGUI系列教程七(序列帧动画UITexture 和 UIsprit)

    NGUI系列教程七(序列帧动画)   今天我给大家讲一下如何使用NGUI做序列帧动画.本节主要包括两方面内容,分别是使用UIspirit和使用UITexture 做序列帧动画.废话不说了,下面开始.还 ...

随机推荐

  1. 华为C语言编程规范笔记1

    入职之前,公司培训,做了点笔记~

  2. EDP转换IC NCS8803:HDMI转EDP芯片

    HDMI-to-eDP Converter w/ scaler1 Features    Embedded-DisplayPort (eDP) Output    1/2/4-lane eDP @ 1 ...

  3. ajax第三步

    ajaxSend()函数用于设置当AJAX请求即将被发送时执行的回调函数. 这是一个全局AJAX事件函数,用于为任何AJAX请求的ajaxSend事件绑定事件处理函数.当AJAX请求即将被发送时,将触 ...

  4. quartus ii有符号数的问题(待完善)

    1.有符号数是以补码的形式存储的,在modelsim仿真时,补码自动转换为有符号的十进制数. 2.关于截位的问题: 当只取寄存器中的其中m位时,这时候取得的数是按照无符号位来处理的? 3.reg型数据 ...

  5. Nginx配置同一个域名同时支持http与https两种方式访问

    Nginx配置同一个域名http与https两种方式都可访问,证书是阿里云上免费申请的 server{listen 80;listen 443 ssl;ssl on;server_name 域名;in ...

  6. C++ 中关于optional 使用过程中遇到的问题

    头文件:#include <boost/optional.hpp> using namespace boost; optional很像一个仅能存放一个元素的容器,它实现了"未初始 ...

  7. HTML、CSS、JS 样式

    把一个数组(一维或二维等)的内容转化为对应的字符串.相当于把print_r($array)显示出来的内容赋值给一个变量.$data= array('hello',',','world','!'); $ ...

  8. HDU 5617 DP

    沿着一条条斜线DP即可,dp[k][i][j]表示第k步,一端在第j列,另一端在第i列,构成回文的个数,沿着四个方向推下去即可. #include <iostream> #include ...

  9. 浩哥解析MyBatis源码(十二)——binding绑定模块之MapperRegisty

    原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6758456.html 1.回顾 之前解析了解析模块parsing,其实所谓的解析模块就是为 ...

  10. xmlplus 组件设计系列之五 - 选项卡

    这一章将设计一个选项卡组件,选项卡组件在手持设备上用的比较多,下面是一个示意图: 选项卡组件的分解 在具体实现之前,想像一下目标组件是如何使用的,对于设计会有莫大的帮助.通过观察,可以将选项卡组件分为 ...