Struts2入门(六)——国际化
一、前言
1.1、国际化简介
国际化是指应用程序在运行的时候,根据客户端请求来自的国家地区、语言的不同而显示不同的界面(简单说就是根据你的地区显示相关地区的语言,如果你现在在英国,那么显示的语言就是英语),国际化的存在价值就是:当一个应用需要在全球使用。
国际化(Internationalization),国际化也被存在I18N,因为头字母是I,尾字母是N,中间有18为字母,这个你了解就好。
本地化(Localization),首字母是L,尾字母是N,中间有10个字母,所以也成为L10N。(本地化:根据不同区域显示本地语言)
1.2、国际化实现思路
将程序中的信息等放在资源文件中,程序在运行过程中,会根据本地语言和国家代码自动到相关的资源文件中提取信息。
1.3、Java的国际化代码实现
新建一个java项目
package com.i18n.resource; import java.util.Locale;
import java.util.ResourceBundle; import javax.ejb.Local; public class I18NTest { public static void main(String[] args) {
//资源包基包(包名+myproperties)
String basename = "com.i18n.resource.myproperties";
//设置语言环境
Locale cn = Locale.CHINA; //中文
Locale en = Locale.ENGLISH; //英文 //根据基名和语言环境加载对应的语言资源文件
ResourceBundle mycn = ResourceBundle.getBundle(basename,cn);//加载myproperties_cn
ResourceBundle myen = ResourceBundle.getBundle(basename,en);//加载myproperties_en //加载资源文件后, 程序就可以调用ResourceBundle实例对象的 getString方法获取指定的资源信息名称所对应的值。
//String value = myResources.getString(“key");
String usernamecn = mycn.getString("username");
String passwordcn = mycn.getString("password"); String usernameen = myen.getString("username");
String passworden = myen.getString("password"); //显示中文的编码
System.out.println(usernamecn+"----"+passwordcn);
//显示英文的编码
System.out.println(usernameen+"----"+passworden);
}
}
/*输出结果为:
* 用户----密码
username----password
* */
注意:使用国际化必须建立资源文件才能够使用

en:表示英语,zh:表示中文
myproperties_en.properties文件代码为:
username=username
password=password
submit=submit
myproperties_zh.properties代码为:(注意:中文被编译为ASCLL格式)
username=\u7528\u6237
password=\u5BC6\u7801
submit=\u63D0\u4EA4
我们可以新建jsp页面,根据不同的地区显示不同的语言。
<%@page import="java.util.ResourceBundle"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>测试i18n</title>
</head>
<%
//加载i18n资源文件,request.getLocale()获取用户所在的国家地区
ResourceBundle my = ResourceBundle.getBundle("com.i18n.resource.myproperties",request.getLocale());
%>
<body>
<form action="" method="post">
<%=my.getString("username") %>:<input type="text" name="username"><br/>
<%=my.getString("password") %>:<input type="text" name="password"><br/>
<input type="submit" value="<%=my.getString("submit")%>">
</form>
</body>
</html>
选择IE浏览器——工具——语言——可添加英语语言,将其移动到顶层,保存的时候,则当前的语言为英语。

jsp界面为:

如果是中文在顶层的话,则显示为中文。
二、Struts2的国际化入门
2.1、Struts2的国际化一般是建立在java基础上的,一样也是通过不同国家/语言环境的资源文件,然后通过ResourceBundle加载指定的Locale对应的资源文件,再取得该资源文件中指定Key对应的消息——整个过程与java程序的国际化完全相同,只是Struts2框架对Java程序国际化做了进一步的封装,从而简化了应用程序的国际化。
Struts2应用程序的国际化主要包括:输入校验提示信息国际化,类型转换提供国际化,Action信息国际化和JSP页面国际化等组成。这里主要介绍如何在Action中取得国际化消息,如何在JSP页面上输出国际化消息,如何进行输入校验提示信息的国际化。
2.2、国际化的类型
1、Application级别的国际化
2、Package级别的国际化
3、Action级别的国际化
2.3、案例分析
Struts2中提供了很多加载国际化资源文件的方式,最简单最常用的就是加载全局的国际化资源文件,加载全局的国际化资源文件通常使用配置常量来实现的。不管是Web.xml文件配置常量,还是struts.properties文件中配置常量,以及在struts.xml中配置常量,只需要配置struts.custom.i18n.resources常量即可。该常量的值为全局国际化资源文件的名字。
一、配置常量
如:

该资源文件的名字为:messageResource,后面的en_US表示美国英语,zh_CN表示中文。
加载全局国际化配置文件有三种方法
1、我们可以新建struts.properties,将其放在同级目录下。
内容为:struts.custom.i18n.resources=messageResource
2、也可以在struts.xml中配置常量

3、web.xml(没试过)
Struts2访问国际化资源文件有以下4种方式:
1、在jsp页面使用struts2的<s:text>,该标签指定一个name属性,该属性指定国际化资源文件中的key
2、action类中访问国际化消息,使用ActionSupport类中的getText(),该方法接受一个name属性,该属性指定国际化资源文件中的key
3、在表单元素的label输出国际化消息,可以为其指定一个key属性,该属性指定国际化资源文件中的key
4、在jsp页面还可以使用<s:property value="getText('name')">,其实是调用了getText方法。
二、新建资源文件(messageResource_en_US.properties和messageResource_zh_CN.properties,将其放在classes文件夹下。)
messageResource_en_US.properties文件内容:
loginPage=Login Page
errorPage=Error Page
succPage=Welcome Page
failTip={0},Sorry,you can,t login!
succTip={0},Welcome,you has logged in!
user=User Name
pass=User Pass
login=Login
welcomeMsg={0},Hello!Now is {1}!
messageResource_en_US.properties
messageResource_zh_CN.properties文件内容:
loginPage=\u767B\u5F55\u9875\u9762
errorPage=\u9519\u8BEF\u9875\u9762
succPage=\u6210\u529F\u9875\u9762
failTip={0}\uFF0C\u5BF9\u4E0D\u8D77\uFF0C\u4F60\u4E0D\u80FD\u767B\u5F55
succTip={0}\uFF0C\u6B22\u8FCE\uFF0C\u4F60\u5DF2\u7ECF\u767B\u5F55\uFF01
user=\u7528\u6237\u540D
pass=\u5BC6\u7801
login=\u767B\u5F55
welcomeMsg={0}\uFF0C\u60A8\u597D\uFF01\u73B0\u5728\u65F6\u95F4\u662F{1}\uFF01
messageResource_zh_CN.properties
在国际化资源文件中,中文是以ASCLL的格式保存的。
注意:这里的资源文件有使用到通配符的。
三、新建login.jsp登录界面
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title><s:text name="loginPage"></s:text></title>
</head>
<body> <!--通过动态语言切换,实现语言切换功能。request_locale是系统默认的参数,改变值能够切换语言 -->
<a href="lang.action?request_locale=zh_CN">中文</a>
<a href="lang.action?request_locale=en_US">English</a> <s:form action="login" method="post">
<s:textfield name="username" key="user"></s:textfield>
<s:textfield name="password" key="pass"></s:textfield>
<s:submit key="login"></s:submit>
</s:form>
</body>
</html>
在此jsp页面中,有使用到动态语言切换。该jsp页面中使用到<s:textfield>标签来直接输出国际化信息,这里的key对应国际化的key(注意:这里声明一点,国际化资源文件的信息使key-value)
四、新建两个类,分别继承ActionSupport,一个作为动态语言切换,一个作为业务逻辑处理。
新建lang类继承ActionSupport(这里仅仅作为语言切换)
package com.Struts2.I18n; import com.opensymphony.xwork2.ActionSupport; //该action只是单纯的切换显示的语言而已
public class lang extends ActionSupport {
public String execute(){
System.out.println("why");
return SUCCESS;
}
}
新建LoginAction继承ActionSupport,这里作为业务逻辑处理
package com.Struts2.I18n; import java.util.HashMap;
import java.util.Map; import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport; public class LoginAction extends ActionSupport {
private String username;
private String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String execute(){
ActionContext ctx = ActionContext.getContext();
Map<String, Object> m = new HashMap<String,Object>();
//用户登录成功
if("admin".equals(getUsername())&&"123".equals(getPassword())){
System.out.println(getUsername());
if(ctx.getSession()!=null){
System.out.println(ctx.getSession());
ctx.getSession().put("user", this.getUsername());
}
//调用getText方法取出国际化信息(没使用通配符的情况下使用)
//ctx.put("tip", getText("succTip")); //使用通用符
ctx.put("tip", getText("succTip",new String[]{getUsername()})); return SUCCESS;
}else{
//调用getText方法取出国际化信息(没使用通配符的情况下使用)
//ctx.put("tip", getText("failTip")); ctx.put("tip", getText("failTip",new String[]{getUsername()}));
return ERROR;
}
}
}
struts.xml配置
五、新建登录成功的界面和登录失败的界面
新建 Hello.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title><s:text name="scuuPage"></s:text></title>
</head>
<body>
<jsp:useBean id="d" class="java.util.Date" scope="page"></jsp:useBean>
<%-- <!--不使用通配符,仅仅输出国际化信息的标签 -->
<s:property value="#tip"/><br/>
<!--输出用户的名称 -->
<s:property value="#attr.user"/>
<!--输出当前的时间 -->
${pageScope.d } --%> <!--使用通配符 :
通过s:text和s:param来填充占位符,注意:顺序必须一致!-->
<s:property value="#tip"/><br/><!--#tip是获取国际化的信息 -->
<!--使用s:text能够给properties文件里面的通配符赋值,注意:顺序必须一样 -->
<s:text name="welcomeMsg">
<s:param><s:property value="username"/></s:param>
<s:param>${pageScope.d }</s:param>
</s:text>
<!--跳转到登录界面 -->
<a href="/login.jsp">
<s:text name="back"></s:text>
</a>
</body>
</html>
注意:这里的标签有使用非通配符和通配符的标签,笔者这个案例是使用到通配符,你可以将其注释掉,并且在资源文件中吧{0},这些换成你想要显示的信息,然后将第一层注释去掉,就能看到你想要显示的信息了。使用通配符必须注意顺序问题。
新建error.jsp页面
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
Error:<s:fielderror/> </body>
</html>
error.jsp
效果如下:

Struts2入门(六)——国际化的更多相关文章
- java struts2入门学习---国际化
一.国际化的概念 1.不同国家的人访问同一个网站,显示的语言不同. 2.对JSP页面进行国际化 属性(properties)文件命名规则:基名---语言--国家如, message_zh_CN.pro ...
- Struts2 入门
一.Struts2入门案例 ①引入jar包 ②在src下创建struts.xml配置文件 <?xml version="1.0" encoding="UTF-8&q ...
- Struts2入门2 Struts2深入
Struts2入门2 Struts2深入 链接: http://pan.baidu.com/s/1rdCDh 密码: sm5h 前言: 前面学习那一节,搞得我是在是太痛苦了.因为在Web项目中确实不知 ...
- Struts2入门1 Struts2基础知识
Struts2入门1 Struts2基础知识 20131130 代码下载: 链接: http://pan.baidu.com/s/11mYG1 密码: aua5 前言: 之前学习了Spring和Hib ...
- Struts2入门3 深入学习
Struts2入门3 深入学习 处理结果和异常 前言: Struts学习的差不多了,还有最后的一点就收官了就是结果处理和异常处理.前面学习Struts主要围绕就是Action以及struts.xml配 ...
- struts2入门程序
struts2入门程序 1.示例 搭建编程环境就先不说了,这里假设已经搭建好了编程环境,并且下好了strut2的jar包,接下来程序. 1.1 新建web项目 点击File->New->D ...
- struts2中的国际化
[java] view plaincopy 实现struts2中国际化其实非常简单 首先,struts2中的国际化是通过资源文件来配置的. 资源文件分为:action类级,package类级,还有we ...
- Struts2学习笔记 国际化(Internationalization)
概述 国际化(Internationalization),通途的讲,就是让软件实现对多种语言的支持.可以通过简单的设置就可以从一种语言切换到另一种语言.用的最多的地方就是在应用程序的界面表示上.我们经 ...
- DevExpress XtraReports 入门六 控件以程序方式创建一个 交叉表 报表
原文:DevExpress XtraReports 入门六 控件以程序方式创建一个 交叉表 报表 本文只是为了帮助初次接触或是需要DevExpress XtraReports报表的人群使用的,为了帮助 ...
随机推荐
- 纯CSS3实现的一些酷炫效果
之前在网上看到一些用纯CSS3实现的酷炫效果,以为实现起来比较困难,于是想看看具体是怎么实现的. 一.笑脸猫动画 实现效果如下: 这个实现起来确实比较麻烦,很多地方需要花时间,有耐心地调整. 1.先看 ...
- ABP教程-打造一个《电话簿项目》-目录-MPA版本-基于ABP1.13版本
此系列文章会进行不定期的更新,应该会有6章左右. 感兴趣的朋友可以跟着看看,本教程适合已经看过ABP的文档但是又无从下手的小伙伴们. 初衷: 发布系列教程的原因是发现ABP在园子火了很久,但是发现还是 ...
- 在ASP.NET Core应用中如何设置和获取与执行环境相关的信息?
HostingEnvironment是承载应用当前执行环境的描述,它是对所有实现了IHostingEnvironment接口的所有类型以及对应对象的统称.如下面的代码片段所示,一个HostingEnv ...
- app引导页(背景图片切换加各个页面动画效果)
前言:不知不觉中又加班到了10点半,整个启动页面做了一天多的时间,一共有三个页面,每个页面都有动画效果,动画效果调试起来麻烦,既要跟ios统一,又要匹配各种不同的手机,然后产品经理还有可能在中途改需求 ...
- 【绝对干货】仿微信QQ设置图形头像裁剪,让你的App从此炫起来~
最近在做毕业设计,想有一个功能和QQ一样可以裁剪头像并设置圆形头像,额,这是设计狮的一种潮流. 而纵观现在主流的APP,只要有用户系统这个功能,这个需求一般都是在(bu)劫(de)难(bu)逃(xue ...
- 趣说游戏AI开发:曼哈顿街角的A*算法
0x00 前言 请叫我标题党!请叫我标题党!请叫我标题党!因为下面的文字既不发生在美国曼哈顿,也不是一个讲述美国梦的故事.相反,这可能只是一篇没有那么枯燥的关于算法的文章.A星算法,这个在游戏寻路开发 ...
- java中的内部类
/** * 内部类 ?? * 定义在一个内部的类,被称为内部类. * 内部类里有类体,方法体 * 内部类所在的类,被称为外部类. * --------------------------------- ...
- 打破陈规抓痛点,H3 BPM10.0挑战不可能
高效益意味着相似的运营活动比竞争对手做得更好,而战略定位则意味着企业在运营活动中有区别于竞争对手的实施方式,即差异化竞争.在新经济体下,面对社会的变革.市场的竞争环境.不断攀升的成本压力,几乎没有企业 ...
- Demo源码放送:打通B/S与C/S !让HTML5 WebSocket与.NET Socket公用同一个服务端!
随着HTML5 WebSocket技术的日益成熟与普及,我们可以借助WebSocket来更加方便地打通BS与CS -- 因为B/S中的WebSocket可以直接连接到C/S的服务端,并进行双向通信.如 ...
- ztreeDeptSelect 基于jquery和ztree的部门选择插件
插件介绍 首先我们来看插件的功能演示(效果): 插件准备好后.前台只需编写html: <input type="text" class="deptName" ...