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教程七、国际化相关推荐
- MVC5+EF6 入门完整教程七
原文:MVC5+EF6 入门完整教程七 本篇我们针对表格显示添加一些新功能. 前面我们已经讲解过表格显示数据了,现在我们添加三个常用功能: 对显示结果进行排序.过滤.分页. 文章提纲 理论基础/前置准 ...
- MongoDB 教程七: MongoDB和PHP结合开发
视频:MongoDB 教程七: MongoDB和PHP结合开发 Linux上安装 MongoDB PHP扩展 在终端上安装 你可以在linux中执行以下命令来安装MongoDB 的 PHP 扩展驱动 ...
- java struts2国际化代码下载_【Java框架】java struts2框架中页面表示国际化的方法 - 思诚科技...
在struts2框架中,前端页面表示国际化的实现更加简单.简单的应用struts2框架提供的支持国际化的表达式即可快速方便的进行页面的国际化的实现.如何做呢?本文以英文和中文为例进行说明. 1,自定义 ...
- c语言第七章函数笔记,我的C语学习笔记-C语言教程(七).doc
我的C语学习笔记- C语言教程(七) C语言教程---第一章: C语言概论 C语言教程---第二章: 数据类型.运算符.表达式 C语言教程---第三章: C语言程序设计初步 C语言教程---第四章: ...
- 汇川小型PLC梯形图编程系列教程(七):数值存储与二进制数据知识详解
原文链接:汇川小型PLC梯形图编程系列教程(七):数值存储与二进制数据知识详解 PLC数据存储原理简介 H123U小型PLC内部采用的是32位的处理器,PLC中的数据处理和电脑中的数据处理基本是一致的 ...
- Struts2的资源文件和国际化(i18n)
文章目录 资源文件的命名 资源文件基名的指定 struts.xml 文件指定资源文件的基名 struts.properties 文件指定资源文件的基名 通过标签 i18n 指定资源文件的基名 资源文件 ...
- 静态时序分析简明教程(七)]端口延迟
端口延迟 一.写在前面 1.1 快速导航链接· 二.端口延迟 2.1 输入有效 2.2 输出有效 2.3 set_input_delay 2.3.1 -clock clock_name 2.3.2 - ...
- ASP.NET 5系列教程(七)完结篇-解读代码
在本文中,我们将一起查看TodoController 类代码. [Route] 属性定义了Controller的URL 模板: [Route("api/[controller]&quo ...
- 黄聪:Microsoft Enterprise Library 5.0 系列教程(七) Exception Handling Application Block
黄聪:Microsoft Enterprise Library 5.0 系列教程(七) Exception Handling Application Block 原文:黄聪:Microsoft Ent ...
最新文章
- Embedding Lua, in Scala, using Java(转)
- 零件库管理信息系统设计--part03:管理员登录部分设计
- 使用Microsoft Azure Backup备份Hyper-V数据
- mysql post 中文乱码_mysql/mariaDB中文乱码问题的处理
- 让Team Exploer自动登录TFS
- NYOJ1071 - 不可以!
- 串口与modem流量控制大全(1)
- Linux下查看用户登陆后的操作记录
- MFC编程入门之二十(常用控件:静态文本框)
- [USACO09FEB]改造路Revamping Trails 分层最短路 Dijkstra BZOJ 1579
- 【STM32】 JDY-31蓝牙模块
- 汉洛塔hanoi递归问题
- 快速部署OpenStack的操作笔记(珍藏版)
- 常用的几种数据库介绍
- android8.0 桌面图标适配
- Mysql数据库基础知识总结,结构分明,内容详细
- 微软拼音打不出中文解决方法
- FFmpeg av_frame_free崩溃可能原因
- C++ 函数的声明和定义
- Luogu P1535 【游荡的奶牛】