一.Struts2实现国际化的流程:
1.首先,必须知道国际化的含义,国际化是指一个应用程序在运行时能够根据客户端请求所来自的国家/地区、语言的不同而显示不同的用户界面。例如:请求来自于一台中文操作系统的客户端计算机,则应用程序响应界面中的各种标签、错误提示和帮助信息均使用中文文字;如果客户端计算机采用英文操作系统,则应用程序也应能识别并自动以英文界面做出响应。
2.为什么要引用国际化的机制呢?引用国际化机制的目的在于提供自适应的、更友好的用户界面,而并未改变程序的其他功能/业务逻辑。人们常用I18N这个词作为“国际化”的简称,其来源是英文单词Internationalization的首末字母I和N及它们之间的字符数18。
3.接下来附上一幅图,来简述Struts2国际化流程:
4.其Struts2国际化的具体流程为:
— 不同地区使用操作系统环境不同,如中文操作系统、英文操作系统、日文操作系统等,在获得客户端地区的语言环境后,struts.xml配置文件会找到国际化资源文件,当操作系统环境是中文语言环境,就加载中文国际化资源文件。所以国际化需要编写支持多种语言的国际化资源文件,并且配置struts.xml文件。
— 根据选择的语言加载相应的国际化资源文件,视图通过Struts2标签读取国际化资源文件并把数据输出到页面上,完成页面的显示。
二.实现国际化的步骤:
1.创建国际化资源文件或者资源文件:
(1).国际化资源文件又称资源文件是以.properties为扩展名的文本文件,可以新建一个记事本把扩展名改为properties即可,该文本文件是以“键-值”对的形式存储国际资源文件。
“键-值”对的形式:key=value。如loginName=用户名称、loginPassword=用户密码。
(2).当需要多个资源文件为不同语言版本提供国际化服务时,可以为资源文件命名,命名的格式有以下两种:
— 资源文件名.properties
— 资源文件名_语言种类.properties
其文件后缀必须是.properties,语言种类必须是有效的ISO(国际标准化组织)语言代码,ISO-639标准定义的这些代码格式为英文小写、双字符,具体如下表所示:
语言 | 编码 |
汉语(Chinese) | zh |
英语(English) | en |
法语(French) | fr |
德语(German) | de |
日语(Japanese) | ja |
意大利语(Italian) | it |
(3).资源文件如果使用第一种命名方式,即缺省语言代码,但系统找不到与客户端请求的语言环境匹配的资源文件,则系统使用该默认的属性文件。
(4).所以建议用第二种命名方式来命名资源文件,如,对一个系统进行国际化处理,要求根据不同的语言环境显示英文和中文用户界面,那么就需要创建英文和中文版本的资源文件,可以取为globalMessages_en.properties和globalMessages_zh.properties。
(5).在国际化中,所有的编码都要使用标准的编码方式,需要把中文符转化为Unicode代码,否则在国际化处理时页面将会出现乱码,使用工具为MyEclipse的就不用转化了。它会自动转化。如果使用的为NetBeans的话,可利用JDK自带的native2ascii工具进行中文资源文件编码方式转换,转换步骤如下:
— 打开命令行窗口,即点击运行,输入cmd后的窗口。
— 进入到你所需要编码的文件目录底下,利用cd命令。
— 使用命令:native2ascii -encoding UTF-8 globalMesages_zh.properties globalMessages_zh_CN.properties 进行编译,编译后在该文件夹下生成一个globalMessages_zh_CN.properties文件,此时这个文件变是转换过编码的文件,就不会出现中文乱码了。
2.接着就在struts.xml配置文件中配置:
(1).编写完国际化资源文件后,需要在struts.xml文件中配置国际化资源文件的名称,从而使Struts2的i18n拦截器在加载国际化资源文件的时候能找到这些国际化资源文件。
(2).那该如何配置呢?此时我们可以找到Struts2核心jar包,即struts2-core-2.3.20.jar包的org.apache.struts2包下,有个default.propertes,即默认的配置文件,如下图所示:
打开此配置文件,里面都是些constant,有的已经赋给了默认值,我们可以配置struts.xml文件修改其值,有的默认已经被注释掉了,但是我们可以在struts.xml文件中配置它,并赋给一个值,其中,对于国际化中的值,我们需要在struts.xml中配置下这句代码即可:
<constant name="struts.custom.i18n.resources" value="globalMessages"/>
如果的Struts2所使用的版本较低的话,还要在struts.xml文件加上此行代码,因为我的default.properties文件里没有注释掉struts.i18n.encoding这个常量,而且默认值就为UTF-8,所以我便没加上这行代码:
<constant name="struts.i18n.encoding" value="UTF-8" />
其中在struts.xml文件中,通过constant元素配置常量,即使用了Struts2中的i18n拦截器,这个常量可在default.properties文件中找到,如下图所示:
其中struts.xml文件中配置constant常量的value属性,即上面那一行代码中的value="globalMessages"便是constant的值,即国际化资源文件的名字。
3.最后一步,便输出国际化信息:
(1).国际化资源文件中的value(值)是要根据语言环境把其中值通过Struts2标签输出到页面上的,即可以在页面上输出国际化信息,也可以在表单的label标签上输出国际化信息。
三.Struts2实现国际化的一个例子:
(1).首先,新建一个Struts2项目,项目名为i18nTest,此项目为一个中英文登录系统,完整项目结构图如下:
(2).首先,新建一个login.jsp登录页面,其中有Struts2的text标签,指定了name属性为一个loginTitle,即国际化资源文件中有键名为loginTitle,从而读取到这个键的值,其中textfield标签和password标签指定key属性,其中key属性值也是在国际化资源文件中的键名,代码如下:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <%@ taglib uri="/struts-tags" prefix="s" %> <% 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><s:text name="loginTitle"/></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"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> </head> <body> <center> <s:form action="checkAction" method="post"> <s:textfield name="loginName" key="loginName" size="22"/> <s:password name="loginPassword" key="loginPassword" size="23"/> <s:submit key="loginSubmit"/> </s:form> </center> </body> </html>
(3).接下来在src目录下,新建两个国际化资源文件,英文资源文件名为globalMessages_en.properties,中文资源文件名为globalMessages_zh.properties,分别如下图所示:
其中可按Add按钮添加内容,其中因为我使用的工具为MyEclipse,所以在写中文资源文件的时候会自动转码为Unicode码。
(4).接下来编写一个LoginAction类,如果用户名为QQ且密码为123的话,就返回字符串SUCCESS,否则返回字符串ERROR,其中Action类的属性与表单标签中输入的name属性必须一致,代码如下:
package com.gk; import com.opensymphony.xwork2.ActionSupport; public class LoginAction extends ActionSupport { private String loginName; private String loginPassword; public String getLoginName() { return loginName; } public void setLoginName(String loginName) { this.loginName = loginName; } public String getLoginPassword() { return loginPassword; } public void setLoginPassword(String loginPassword) { this.loginPassword = loginPassword; } public String execute(){ if(getLoginName().equals("QQ") && getLoginPassword().equals("123")){ return SUCCESS; }else{ return ERROR; } } }
(5).接着配置struts.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.enable.DynamicMethodInvocation" value="true"></constant> <constant name="struts.devMode" value="true"></constant> <constant name="struts.custom.i18n.resources" value="globalMessages"/> <package name="login" namespace="/" extends="struts-default"> <action name="checkAction" class="com.gk.LoginAction"> <result>/loginSuccess.jsp</result> <result name="error">/loginError.jsp</result> </action> </package> </struts>
(6).登录成功的话跳转到loginSuccess.jsp页面,登录失败跳转到loginError.jsp页面,这两个页面代码分别如下:
loginSuccess.jsp页面:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <%@ taglib uri="/struts-tags" prefix="s" %> <% 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><s:text name="successPage"/></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"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> </head> <body> <center> <s:text name="loginName"/>:<s:property value="loginName"/><br/> <s:text name="loginPassword"/>:<s:property value="loginPassword"/> </center> </body> </html>
loginError.jsp页面:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <% 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 'loginError.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"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> </head> <body> 登录失败,请重新<a href="login.jsp">登录</a> </body> </html>
(7).部署此项目到tomcat服务器上,开启tomcat服务器,运行后效果如下:
因为我这里默认浏览器的语言为英文,所以显示英文信息,输入正确的用户名和密码后,如下图所示:
(8).接下来我要把语言改为中文,试下是否会变成中文,打开浏览器的IE选项,点击语言,如下图所示:
记得上移语言的选项,然后刷新一下登录界面,如下图所示:
输入正确的用户名和密码后,如下图所示:
(9).这样便实现了Struts2的国际化,其中登录错误的页面就不展示出来了。
四.以上就是全部内容,仅供大家学习参考,写得不好,请见谅,如有错误,请指出,谢谢!最后,说一下,我也是根据老师所教的和书本上的知识,所写博客,请见谅!
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文:http://blog.csdn.net/u012561176/article/details/46875307