Struts2-国际化1
2018-02-07 18:06
375 查看
几年之前,应用程序开发者能够考虑到仅仅支持他们本国的只使用一种语言(或者有时候是两种)和通常只有一种数量表现方式(例如日期、数字、货币值)的应用。然而,基于web技术的应用程序的爆炸性增长,以及将这些应用程序部署在Internet或其它被广泛访问的网络之上,已经在很多情况下使得国家的边界淡化到不可见。这种情况转变成为一种对于应用程序支持国际化(internationalization,经常被称做"i18n",因为18是字母"i"和字母"n"之间的字母个数)和本地化的需求。国际化是商业系统中不可或缺的一部分,所以无论您学习的是什么Web框架,它都是必须掌握的技能。
Java国际化思路
Java程序的国际化思路是将程序中的标签、提示信息等放在资源文件中,程序需要支持国家/语言环境,则必须提供对应的资源文件。资源文件是key-value对,每个资源文件中的key不变,但value随不同的国家/语言变化。
Java程序的国际化主要通过如下3个类完成
Java.util.ResourceBundle:用于加载资源包
Java.util.Locale:对应一个特定的国家/地区、语言环境
Java.text.MessageFormat:用于将消息格式化
资源文件
为了实现程序的国际化,必须先提供程序所需要的资源文件。资源文件的内容是很多的 key-value对,其中key是程序使用的部分,而value是程序的显示部分。
资源文件的命名可以是如下3种形式:
baseName_language_country.properties
baseName_language.properties
baseName.properties
其中baseName是资源文件的基本名称,用户可以自由定义,而language和country都不可随意变化,必须是Java所支持的语言和国家。
Java支持的国家和语言
事实上,Java不可能支持所有的国家和语言,可以通过Locale类的getAvailableLocale方法获取支持的,该方法返回一个Locale数组,该数组中包含了所有支持的国家和语言。
Locale [ ] locales = Locale.getAvailableLocales();
下面是程序示例:
[java] view
plaincopy
package com.ascent.i18n.test;
import java.util.*;
public class LocalTest {
public static void main(String[] args) {
Locale [] locales = Locale.getAvailableLocales();
for(Locale locale:locales){
//输出所有支持的国家 System.out.print(locale.getDisplayCountry()+":"+locale.getCountry());
//输出所有支出的语言 System.out.println(locale.getDisplayLanguage()+":"+locale.getLanguage());
}
}
}
程序会打印出所有支持的国家和语言
使用资源文件完成程序国际化
《1》首先编写两个资源文件,例如:
resource_zh_CN.properties
title=标题
resource_en_US.properties
title=title
《2》中文的可以使用jdk的native2ascii 命令进行转码Unicode编码。
命令: native2ascii resource_zh_CN..properties teme.properties
然后在将转好的编码拷贝替换到resource_zh_CN.properties,替换后是:
title=\u6807\u9898
国际化实例
[java] view
plaincopy
package com.ascent.i18n.test;
import java.util.*;
public class ResourceBundleTest {
public static void main(String[] args) {
//设置本地区语言(默认)
Locale locale = Locale.getDefault();
//可以使用Local的常量设置具体的语言环境
//Locale locale = Locale.US;
//根据地区不同加载不同的资源文件
ResourceBundle rb = ResourceBundle.getBundle("resource", locale);
//根据key获得value值
String title = rb.getString("title");
System.out.println(title);
}
}<span style="color:#ff0000;">
</span>
Java国际化包含占位符的消息
以上在资源文件配置的消息都是简单的消息,假如消息中含有参数,即有参数占位,我们
如何实现呢?例如下面消息:
英文:hello=Hello,{0}!Today is {1}.
中文:hello=你好,{0}!今天是{1}.
此时,我们需要使用MessageFormat类,该类有个很有用的静态的方法
format(String pattern,Object… values)
返回后面多个参数值填充前面pattern字符串,其中pattern字符串就是一个带占位符的字符串。
[java] view
plaincopy
package com.ascent.i18n.test;
import java.util.Date;
import java.util.Locale;
import java.util.ResourceBundle;
import java.text.*;
public class MessageFormatTest {
public static void main(String[] args) {
Locale locale = Locale.getDefault();
ResourceBundle rb = ResourceBundle.getBundle("resource", locale);
String hello = rb.getString("hello");
String result = MessageFormat.format(hello, "焦学理",new Date());
System.out.println(result);
}
}
Struts 2的国际化入门
Struts 2国际化是建立在Java国际化的基础之上,一样也是通过提供不同国家/语言环境的消息资源,然后通过ResourceBundle加载指定Locale对应的资源文件,再取得该资源文件中指定key对应的消息---整个过程与Java程序的国际化完全相同,只是Struts2框架对Java程序国际化进行了进一步封装,从而简化了应用程序的国际化。
Struts 2中加载全局资源文件
Struts 2提供了很多加载国际化资源文件的方式,最简单.最常用的就是加载全局的国际化资源文件,加载全局的国际化资源文件的方式通过配置常量来实现。不管在struts..xml文件中配置常量,还是在在struts.properties文件中配置常量,只需要配置struts.custom.i18n.resources常量即可。
配置struts.custom.i18n.resources常量时,该常量值为全局国际化资源文件的baseName。
假如系统需要加载的国际化资源文件的baseName为properties/message,则我们
可以在struts.properties文件中指定如下一行:
struts.custom.i18n.resources= properties.message
或者更好的做法是在struts.xml文件中配置如下的一个常量:
<!-- 定义资源文件的位置和类型 -->
<constant name="struts.custom.i18n.resources"value="properties/message"/>
访问国际化资源
Struts2即可以在JSP页面中通过标签输出国际化消息,也可以在Action类中输出国际化消息,不管采用哪种方式,Struts2都提供了支持, 使用起来非常简单。
Struts2访问国际化消息主要在如下3种方式:
1)为了在JSP页面中输出国际化消息,可以使用Struts2的<s:text…/>标签,该标签可以指定
一个name 属性,该属性指定了国际化资源文件中的key.
2) 为了在Action类中访问国际化消息,可以使用ActionSupport类的getText方法,该方法可以接受一个name 参数,该参数指定了国际化资源文件中的key .
3) 为了在该表单元 Label里输出国际化信息,可以为该表单标签指定一个key属性, 该key指定了国际化资源文件中的key.
以项目中的登陆国际化为例,下面我们要做的是在项目中src下添加properties文件夹,下面添加资源文件 message_zh_CN.properties和message_en_US.properties
例如:
#资源文件的内容就是key-value对
message_zh_CN.properties内容:
loginPage=loginPage
errorPage=errorPage
welcomePage=welcomePage
showBooksPage=showBooksPage
message_en_US.properties内容:
loginPage=登陆页面
errorPage=错误页面
welcomePage=成功欢迎页面
showBooksPage=图书展现页面
提供了上面两份资源文件后,系统会根据浏览者所在的Locale来加载对应的语言资源文件.
[html] view
plaincopy
<%@ page language="java" contentType="text/html; charset=utf-8"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<html>
<head>
<!—使用s:text 标签输出国际化消息-->
<title><s:text name="loginPage"/></title>
</head>
<body>
<h3><s:text name="loginTip"/></h3>
<!—在表单元素中使用key来指定国际化消息的key-->
<s:form action="Login" method="post">
<s:textfield name="username" key="user"/>
<s:password name="password" key="password"/>
<s:submit name="submit" key="submit" />
</s:form>
</body>
</html>
上面的JSP页面中使用了<s:text…/>标签来直接输出国际化信息,也通过在表单元素中指定key属性来输出国际化信息.通过这种方式,就可以完成JSP页面中普通文本.表单元素标签的国际化.
如果在简体中文环境下,浏览该页面将看到如下图所示的页面
如果在控制面板中修改语言/区域,将机器的语言/区域环境修改成美国英语环境,再次浏览
该页面,将看到如下图页面
如果为了在Action中访问国际化消息,则可以利用ActionSupport类的getText方法.
下面是本示例应用中Action类的代码:
[java] view
plaincopy
public class LoginAction extends ActionSupport{
public String execute(){
if(getUsername().equals("ascent")&& getPassword().equals("ascent")){
ActionContext.getContext().getSession().put("user", this.getUsername());
return SUCCESS;
}
return ERROR;
}
//完成输入校验需要重写的validate方法(读取资源文件getText(String str))
public void validate(){
//调用getText方法取出国际化信息
if(getUsername()==null||"".equals(this.getUsername().trim())){
this.addFieldError("username", this.getText("username.required"));
}
if(this.getPassword()==null||"".equals(this.getPassword().trim())){
this.addFieldError("password", this.getText("password.required"));
}
}
}
通过在Action类中调用ActionSupport类的getText通过这种方式,就可以取得国际化资源文
件中的国际化消息。通过这种方式,即使Action需要设置在下一个页面显示的信息,也无需
直接设置字符串常量,而是使用国际化消息的key来输出,从而实现程序的国际化。
参数化国际化字符串 (带有占位符)
许多情况下,我们都需要在运行时(runtime)为国际化字符插入一些参数,例如在输入验证
提示信息的时候。在Struts 2.0中,我们通过可以方便地做到这点。
《1》.如果需要在JSP页面中填充国际化消息里的占位符,则可以通过在<s:text…/>标签中使
用多个<s:param…/>标签来填充消息中的占位符。第一个<s:param…/>标签指定第一个占位
符值,第二个<s:param…/>标签指定第二个占位符值……依此类推。
实例中国际化资源文件中有如下国际化消息:
#带占位符的国际化信息
welcomeTip=欢迎,{0},您已经登陆成功!
《2》.如果需要在Action中填充国际化消息里的占位符,则可以通过在调用getText方法时使
用getText(String aTextName,List args)或getText(String key, String[] args)方法来填充
占位符。该方法的第二个参数既可以是一个字符串数组,也可以是字符串组成的List对象,从
而完成对占位符,字符串数组、字符串集合中第二个元素将填充第二个占位符,依此类推。
为了在Action类中输出占位符的消息,我们在Action类中调用ActionSupport类的getText方
法,调用该方法时,传入用于填充占位符的参数值。访问该带占位符消息的Action类如下:
[java] view
plaincopy
public String execute(){
if(getUsername().equals("ascent")&& getPassword().equals("ascent")){
//调用getText方法取出国际化信息,使用字符串数组传入占位符的参数值( request范围)
ActionContext.getContext().put("user", this.getText("welcomeTip", new String[]{this.getUsername()}));
return SUCCESS;
}
return ERROR;
}
通过上面的带参数的getText方法,就可以为国际化消息的占位符传入参数了。
为了在JSP页面中输出带两个占位符的国际化消息,只需要为<s:text…/>标签指定<s:param…/>子标签即可。下面是welcome.jsp页面的代码:
[html] view
plaincopy
<body>
<!--使用s:text标签输出welcomeTip对应的国际化信息-->
<s:text name="welcomeTip">
<!--使用s:param为国际化信息的占位符传入参数-->
<s:param><s:property value="username"/></s:param>
</s:text>
<br><br>
<!-- 输出request范围内的user值(资源文件取值)-->
request:${requestScope.user}
<br>
<a href="getBooks.action"><s:text name="welcomeLink"/></a>
</body>
上面的页面使用${requestScope.user}输出的是Action类中取出的国际化消息,而通过
<s:text…/>标签取出的是另一个国际化消息,且使用了<param…/>标签为该国际化消息
的占位符指定了占位符值。登录成功进入后如图所示:
中英文切换
[java] view
plain copy
Action
package com.lxitedu.ant;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
public class Action extends ActionSupport implements ModelDriven<User> {
private static final long serialVersionUID = 1L;
private User user = new User();
@Override
public String execute() throws Exception {
return SUCCESS;
}
@Override
public User getModel() {
return user;
}
public String run() throws Exception {
System.out.println("Action.run()");
return INPUT;
}
}
user.java
package com.lxitedu.ant;
public class User {
private String name;
private String password;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
资源文件
messageResource_en_US.properties
login=login
password=password
sub=submit
cn=Chinese
us= English
messageResource_zh_CN.properties
login=帐号
password=密码
sub=提交
cn=中文
us=英文
struts.xml
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package name="hello" namespace="/abc" extends="struts-default">
<action name="user" class="com.lxitedu.ant.Action">
<result name="success">/success.jsp</result>
<result name="input">/index.jsp</result>
</action>
<action name="input" class="com.lxitedu.ant.Action" method="run">
<result name="input">/index.jsp</result>
<interceptor-ref name="i18n" />
</action>
</package>
</struts>
index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Insert title here</title>
</head>
<body>
<a href="abc/input.action?request_locale=zh_CN"><s:label key="cn"/></a><br/>
<a href="abc/input.action?request_locale=en_US"><s:label key="us"/></a>
<s:form action="abc/user.action">
<s:textfield name="name" key="login" /><br/>
<s:textfield name="password" key="password" /><br/>
<s:submit key="sub"/>
</s:form>
</body>
</html>
success.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Insert title here</title>
</head>
<body>
user Name: <s:property value="name" /><br/>
password: <s:property value="password"/>
</body>
</html>
或者是
1.首先把Struts2的环境搭建起来,
2.建立一个action.测试i18n的。
3.下面这个是struts.xml的简单配置,里有2中properties文件的配置,一种是全局的,一种是局部的,
Xml代码
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name="struts.devMode" value="true" />
<!-- 局部的配置 -->
<!--
<constant name="struts.custom.i18n.resources"
value="com/test/action/I18n"></constant>
-->
<!-- 全局的配置 -->
<!-- -->
<constant name="struts.custom.i18n.resources" value="test"></constant>
<package name="default" namespace="/" extends="struts-default">
<action name="" class="com.test.action.I18nAction">
<result >/index.jsp</result>
</action>
</package>
</struts>
4.根据struts2的配置,插件一个名字为test_en_US.properties和test_zh_CN.properties的配置文件,
test_en_US.properties里面的内容为:hello=hi,hello
test_zh_CN.properties里面的内容为:hello=\u4F60\u597D (注意了:这个是通过编码编译过来的,也可以试用MyEclipse的properties自动编辑转换实现)。
5.下面是jsp的展现页面:本人整理了以下几种实现方法,
Html代码
<%@
page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@
taglib prefix="s" uri="/struts-tags" %>
<%
String path = request.getContextPath();
String basePath =request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My
JSP 'index.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This
is my page">
</head>
<body>
<a href="<%=basePath%>?local=zh_CN">中文</a>
<a href="<%=basePath%>?local=en_US">英文</a>
This is my JSP page. <br>
<s:debug></s:debug>
property:<s:property value="getText('hello')"/><br>
text:<s:text name="hello"></s:text><br>
i18n:<s:i18n name="test">
<s:text name="hello"></s:text>
</s:i18n>
</body>
</html>
6.想要实现中英文切换,还要在action中加入这一一句话
Java代码
Locale locale=new Locale("zh","CN");//(这个能根据你传来的值动态改变)
ServletActionContext.getRequest().getSession().setAttribute("WW_TRANS_I18N_LOCALE",
locale);
7.基本上可以实现动态链接切换中英文了,不过,还有个小问题,需要解决,那就是,需要点击2下中文才能切换到中文,
英文同样也是,这个问题怎么解决呢?
8.想解决那个问题其实很简单,配置一个fitler拦截器就行了,这个拦截器最好配置在struts2的拦截器前面,
拦截器的内容大概是:
Java代码
String local=arg0.getParameter("local");
if(local!=null){
String loc[]=local.split("_");
Locale locale=new Locale(loc[0],loc[1]);
((HttpServletRequest)arg0).getSession().setAttribute("WW_TRANS_I18N_LOCALE",
locale);
}
arg2.doFilter(arg0, arg1);
这样就能实现动态切换中英文了
Java国际化思路
Java程序的国际化思路是将程序中的标签、提示信息等放在资源文件中,程序需要支持国家/语言环境,则必须提供对应的资源文件。资源文件是key-value对,每个资源文件中的key不变,但value随不同的国家/语言变化。
Java程序的国际化主要通过如下3个类完成
Java.util.ResourceBundle:用于加载资源包
Java.util.Locale:对应一个特定的国家/地区、语言环境
Java.text.MessageFormat:用于将消息格式化
资源文件
为了实现程序的国际化,必须先提供程序所需要的资源文件。资源文件的内容是很多的 key-value对,其中key是程序使用的部分,而value是程序的显示部分。
资源文件的命名可以是如下3种形式:
baseName_language_country.properties
baseName_language.properties
baseName.properties
其中baseName是资源文件的基本名称,用户可以自由定义,而language和country都不可随意变化,必须是Java所支持的语言和国家。
Java支持的国家和语言
事实上,Java不可能支持所有的国家和语言,可以通过Locale类的getAvailableLocale方法获取支持的,该方法返回一个Locale数组,该数组中包含了所有支持的国家和语言。
Locale [ ] locales = Locale.getAvailableLocales();
下面是程序示例:
[java] view
plaincopy
package com.ascent.i18n.test;
import java.util.*;
public class LocalTest {
public static void main(String[] args) {
Locale [] locales = Locale.getAvailableLocales();
for(Locale locale:locales){
//输出所有支持的国家 System.out.print(locale.getDisplayCountry()+":"+locale.getCountry());
//输出所有支出的语言 System.out.println(locale.getDisplayLanguage()+":"+locale.getLanguage());
}
}
}
程序会打印出所有支持的国家和语言
使用资源文件完成程序国际化
《1》首先编写两个资源文件,例如:
resource_zh_CN.properties
title=标题
resource_en_US.properties
title=title
《2》中文的可以使用jdk的native2ascii 命令进行转码Unicode编码。
命令: native2ascii resource_zh_CN..properties teme.properties
然后在将转好的编码拷贝替换到resource_zh_CN.properties,替换后是:
title=\u6807\u9898
国际化实例
[java] view
plaincopy
package com.ascent.i18n.test;
import java.util.*;
public class ResourceBundleTest {
public static void main(String[] args) {
//设置本地区语言(默认)
Locale locale = Locale.getDefault();
//可以使用Local的常量设置具体的语言环境
//Locale locale = Locale.US;
//根据地区不同加载不同的资源文件
ResourceBundle rb = ResourceBundle.getBundle("resource", locale);
//根据key获得value值
String title = rb.getString("title");
System.out.println(title);
}
}<span style="color:#ff0000;">
</span>
Java国际化包含占位符的消息
以上在资源文件配置的消息都是简单的消息,假如消息中含有参数,即有参数占位,我们
如何实现呢?例如下面消息:
英文:hello=Hello,{0}!Today is {1}.
中文:hello=你好,{0}!今天是{1}.
此时,我们需要使用MessageFormat类,该类有个很有用的静态的方法
format(String pattern,Object… values)
返回后面多个参数值填充前面pattern字符串,其中pattern字符串就是一个带占位符的字符串。
[java] view
plaincopy
package com.ascent.i18n.test;
import java.util.Date;
import java.util.Locale;
import java.util.ResourceBundle;
import java.text.*;
public class MessageFormatTest {
public static void main(String[] args) {
Locale locale = Locale.getDefault();
ResourceBundle rb = ResourceBundle.getBundle("resource", locale);
String hello = rb.getString("hello");
String result = MessageFormat.format(hello, "焦学理",new Date());
System.out.println(result);
}
}
Struts 2的国际化入门
Struts 2国际化是建立在Java国际化的基础之上,一样也是通过提供不同国家/语言环境的消息资源,然后通过ResourceBundle加载指定Locale对应的资源文件,再取得该资源文件中指定key对应的消息---整个过程与Java程序的国际化完全相同,只是Struts2框架对Java程序国际化进行了进一步封装,从而简化了应用程序的国际化。
Struts 2中加载全局资源文件
Struts 2提供了很多加载国际化资源文件的方式,最简单.最常用的就是加载全局的国际化资源文件,加载全局的国际化资源文件的方式通过配置常量来实现。不管在struts..xml文件中配置常量,还是在在struts.properties文件中配置常量,只需要配置struts.custom.i18n.resources常量即可。
配置struts.custom.i18n.resources常量时,该常量值为全局国际化资源文件的baseName。
假如系统需要加载的国际化资源文件的baseName为properties/message,则我们
可以在struts.properties文件中指定如下一行:
struts.custom.i18n.resources= properties.message
或者更好的做法是在struts.xml文件中配置如下的一个常量:
<!-- 定义资源文件的位置和类型 -->
<constant name="struts.custom.i18n.resources"value="properties/message"/>
访问国际化资源
Struts2即可以在JSP页面中通过标签输出国际化消息,也可以在Action类中输出国际化消息,不管采用哪种方式,Struts2都提供了支持, 使用起来非常简单。
Struts2访问国际化消息主要在如下3种方式:
1)为了在JSP页面中输出国际化消息,可以使用Struts2的<s:text…/>标签,该标签可以指定
一个name 属性,该属性指定了国际化资源文件中的key.
2) 为了在Action类中访问国际化消息,可以使用ActionSupport类的getText方法,该方法可以接受一个name 参数,该参数指定了国际化资源文件中的key .
3) 为了在该表单元 Label里输出国际化信息,可以为该表单标签指定一个key属性, 该key指定了国际化资源文件中的key.
以项目中的登陆国际化为例,下面我们要做的是在项目中src下添加properties文件夹,下面添加资源文件 message_zh_CN.properties和message_en_US.properties
例如:
#资源文件的内容就是key-value对
message_zh_CN.properties内容:
loginPage=loginPage
errorPage=errorPage
welcomePage=welcomePage
showBooksPage=showBooksPage
message_en_US.properties内容:
loginPage=登陆页面
errorPage=错误页面
welcomePage=成功欢迎页面
showBooksPage=图书展现页面
提供了上面两份资源文件后,系统会根据浏览者所在的Locale来加载对应的语言资源文件.
[html] view
plaincopy
<%@ page language="java" contentType="text/html; charset=utf-8"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<html>
<head>
<!—使用s:text 标签输出国际化消息-->
<title><s:text name="loginPage"/></title>
</head>
<body>
<h3><s:text name="loginTip"/></h3>
<!—在表单元素中使用key来指定国际化消息的key-->
<s:form action="Login" method="post">
<s:textfield name="username" key="user"/>
<s:password name="password" key="password"/>
<s:submit name="submit" key="submit" />
</s:form>
</body>
</html>
上面的JSP页面中使用了<s:text…/>标签来直接输出国际化信息,也通过在表单元素中指定key属性来输出国际化信息.通过这种方式,就可以完成JSP页面中普通文本.表单元素标签的国际化.
如果在简体中文环境下,浏览该页面将看到如下图所示的页面
如果在控制面板中修改语言/区域,将机器的语言/区域环境修改成美国英语环境,再次浏览
该页面,将看到如下图页面
如果为了在Action中访问国际化消息,则可以利用ActionSupport类的getText方法.
下面是本示例应用中Action类的代码:
[java] view
plaincopy
public class LoginAction extends ActionSupport{
public String execute(){
if(getUsername().equals("ascent")&& getPassword().equals("ascent")){
ActionContext.getContext().getSession().put("user", this.getUsername());
return SUCCESS;
}
return ERROR;
}
//完成输入校验需要重写的validate方法(读取资源文件getText(String str))
public void validate(){
//调用getText方法取出国际化信息
if(getUsername()==null||"".equals(this.getUsername().trim())){
this.addFieldError("username", this.getText("username.required"));
}
if(this.getPassword()==null||"".equals(this.getPassword().trim())){
this.addFieldError("password", this.getText("password.required"));
}
}
}
通过在Action类中调用ActionSupport类的getText通过这种方式,就可以取得国际化资源文
件中的国际化消息。通过这种方式,即使Action需要设置在下一个页面显示的信息,也无需
直接设置字符串常量,而是使用国际化消息的key来输出,从而实现程序的国际化。
参数化国际化字符串 (带有占位符)
许多情况下,我们都需要在运行时(runtime)为国际化字符插入一些参数,例如在输入验证
提示信息的时候。在Struts 2.0中,我们通过可以方便地做到这点。
《1》.如果需要在JSP页面中填充国际化消息里的占位符,则可以通过在<s:text…/>标签中使
用多个<s:param…/>标签来填充消息中的占位符。第一个<s:param…/>标签指定第一个占位
符值,第二个<s:param…/>标签指定第二个占位符值……依此类推。
实例中国际化资源文件中有如下国际化消息:
#带占位符的国际化信息
welcomeTip=欢迎,{0},您已经登陆成功!
《2》.如果需要在Action中填充国际化消息里的占位符,则可以通过在调用getText方法时使
用getText(String aTextName,List args)或getText(String key, String[] args)方法来填充
占位符。该方法的第二个参数既可以是一个字符串数组,也可以是字符串组成的List对象,从
而完成对占位符,字符串数组、字符串集合中第二个元素将填充第二个占位符,依此类推。
为了在Action类中输出占位符的消息,我们在Action类中调用ActionSupport类的getText方
法,调用该方法时,传入用于填充占位符的参数值。访问该带占位符消息的Action类如下:
[java] view
plaincopy
public String execute(){
if(getUsername().equals("ascent")&& getPassword().equals("ascent")){
//调用getText方法取出国际化信息,使用字符串数组传入占位符的参数值( request范围)
ActionContext.getContext().put("user", this.getText("welcomeTip", new String[]{this.getUsername()}));
return SUCCESS;
}
return ERROR;
}
通过上面的带参数的getText方法,就可以为国际化消息的占位符传入参数了。
为了在JSP页面中输出带两个占位符的国际化消息,只需要为<s:text…/>标签指定<s:param…/>子标签即可。下面是welcome.jsp页面的代码:
[html] view
plaincopy
<body>
<!--使用s:text标签输出welcomeTip对应的国际化信息-->
<s:text name="welcomeTip">
<!--使用s:param为国际化信息的占位符传入参数-->
<s:param><s:property value="username"/></s:param>
</s:text>
<br><br>
<!-- 输出request范围内的user值(资源文件取值)-->
request:${requestScope.user}
<br>
<a href="getBooks.action"><s:text name="welcomeLink"/></a>
</body>
上面的页面使用${requestScope.user}输出的是Action类中取出的国际化消息,而通过
<s:text…/>标签取出的是另一个国际化消息,且使用了<param…/>标签为该国际化消息
的占位符指定了占位符值。登录成功进入后如图所示:
中英文切换
[java] view
plain copy
Action
package com.lxitedu.ant;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
public class Action extends ActionSupport implements ModelDriven<User> {
private static final long serialVersionUID = 1L;
private User user = new User();
@Override
public String execute() throws Exception {
return SUCCESS;
}
@Override
public User getModel() {
return user;
}
public String run() throws Exception {
System.out.println("Action.run()");
return INPUT;
}
}
user.java
package com.lxitedu.ant;
public class User {
private String name;
private String password;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
资源文件
messageResource_en_US.properties
login=login
password=password
sub=submit
cn=Chinese
us= English
messageResource_zh_CN.properties
login=帐号
password=密码
sub=提交
cn=中文
us=英文
struts.xml
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package name="hello" namespace="/abc" extends="struts-default">
<action name="user" class="com.lxitedu.ant.Action">
<result name="success">/success.jsp</result>
<result name="input">/index.jsp</result>
</action>
<action name="input" class="com.lxitedu.ant.Action" method="run">
<result name="input">/index.jsp</result>
<interceptor-ref name="i18n" />
</action>
</package>
</struts>
index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Insert title here</title>
</head>
<body>
<a href="abc/input.action?request_locale=zh_CN"><s:label key="cn"/></a><br/>
<a href="abc/input.action?request_locale=en_US"><s:label key="us"/></a>
<s:form action="abc/user.action">
<s:textfield name="name" key="login" /><br/>
<s:textfield name="password" key="password" /><br/>
<s:submit key="sub"/>
</s:form>
</body>
</html>
success.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Insert title here</title>
</head>
<body>
user Name: <s:property value="name" /><br/>
password: <s:property value="password"/>
</body>
</html>
或者是
1.首先把Struts2的环境搭建起来,
2.建立一个action.测试i18n的。
3.下面这个是struts.xml的简单配置,里有2中properties文件的配置,一种是全局的,一种是局部的,
Xml代码
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name="struts.devMode" value="true" />
<!-- 局部的配置 -->
<!--
<constant name="struts.custom.i18n.resources"
value="com/test/action/I18n"></constant>
-->
<!-- 全局的配置 -->
<!-- -->
<constant name="struts.custom.i18n.resources" value="test"></constant>
<package name="default" namespace="/" extends="struts-default">
<action name="" class="com.test.action.I18nAction">
<result >/index.jsp</result>
</action>
</package>
</struts>
4.根据struts2的配置,插件一个名字为test_en_US.properties和test_zh_CN.properties的配置文件,
test_en_US.properties里面的内容为:hello=hi,hello
test_zh_CN.properties里面的内容为:hello=\u4F60\u597D (注意了:这个是通过编码编译过来的,也可以试用MyEclipse的properties自动编辑转换实现)。
5.下面是jsp的展现页面:本人整理了以下几种实现方法,
Html代码
<%@
page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@
taglib prefix="s" uri="/struts-tags" %>
<%
String path = request.getContextPath();
String basePath =request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My
JSP 'index.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This
is my page">
</head>
<body>
<a href="<%=basePath%>?local=zh_CN">中文</a>
<a href="<%=basePath%>?local=en_US">英文</a>
This is my JSP page. <br>
<s:debug></s:debug>
property:<s:property value="getText('hello')"/><br>
text:<s:text name="hello"></s:text><br>
i18n:<s:i18n name="test">
<s:text name="hello"></s:text>
</s:i18n>
</body>
</html>
6.想要实现中英文切换,还要在action中加入这一一句话
Java代码
Locale locale=new Locale("zh","CN");//(这个能根据你传来的值动态改变)
ServletActionContext.getRequest().getSession().setAttribute("WW_TRANS_I18N_LOCALE",
locale);
7.基本上可以实现动态链接切换中英文了,不过,还有个小问题,需要解决,那就是,需要点击2下中文才能切换到中文,
英文同样也是,这个问题怎么解决呢?
8.想解决那个问题其实很简单,配置一个fitler拦截器就行了,这个拦截器最好配置在struts2的拦截器前面,
拦截器的内容大概是:
Java代码
String local=arg0.getParameter("local");
if(local!=null){
String loc[]=local.split("_");
Locale locale=new Locale(loc[0],loc[1]);
((HttpServletRequest)arg0).getSession().setAttribute("WW_TRANS_I18N_LOCALE",
locale);
}
arg2.doFilter(arg0, arg1);
这样就能实现动态切换中英文了
相关文章推荐
- 学习笔记-------------------struts2国际化
- struts2国际化开发
- Struts2国际化——完整实例代码
- Struts2的国际化支持
- Struts2学习笔记17:Struts2的国际化
- struts2国际化问题实例解析
- Struts2学习(一) 国际化
- Struts2国际化
- struts2简单国际化的实现
- struts2国际化
- Struts2的国际化
- Struts2国际化
- Struts2学习笔记----国际化(I18N)(一)
- struts2 的国际化
- Struts2 资源配置文件国际化
- struts2-19配置国际化全局资源文件、输出国际化信息
- JAVA_WEB Struts2学习:使用验证框架进行校验JSP页面元素 反编译工具的配置 Strtuts2 国际化学习
- Struts2国际化
- Struts2学习——国际化
- struts2国际化设置浏览器语言