Struts2的国际化

一.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的国际化,其中登录错误的页面就不展示出来了。

四.以上就是全部内容,仅供大家学习参考,写得不好,请见谅,如有错误,请指出,谢谢!最后,说一下,我也是根据老师所教的和书本上的知识,所写博客,请见谅!

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-12-20 17:06:33

Struts2的国际化的相关文章

浅谈struts2的国际化----i18n

可能大家在使用struts框架的时候,偶尔会看到这个词: i18n.也就是 Internationalization    i 开头,n 结尾, 总共18个字母,今天的主要内容就是围绕这 四个字母. struts2国际化是建立在 java 国际化的基础上的,通过提供不同国家.语言环境的消息资源,然后通过 ResourceBundle 加载指定Locale 对应的资源文件,取得文件中指定的 key 对应的信息. Locale 对象表示了特定的地理.政治和文化地区.需要 Locale 来执行其任务的

struts2访问国际化消息的四种方式

Struts2的国际化是建立在java国际化的基础之上的,因此具有强大的国际互能力.Struts2运行时自动检测当前的 Location,然后使用RsourceBundle加载对应的Locale资源文件.因为Struts2对java的国际化进行了封装,因此国际化起来更简单,用户一般提供不同国家的消息资源即可.在Struts2的国际化包含三个部分:前台的国际化,Action中的国际化,验证配置文件的国际化. 在Struts2中加载全局资源文件 国际化的前提是如何让Struts2能够加载到国际化消息

Struts2的国际化(二)-利用超链接实现动态加载国际化资源文件

原理:程序是根据Locale来确定国际化资源文件,因此关键之处在于知道 Struts2 框架是如何确定 Local 对象的 ! 由于Struts2 使用 i18n 拦截器处理国际化,并且将其注册在默认的拦截器中,因此,可以通过阅读 I18N 拦截器知道. 具体确定 Locale 对象的过程: > Struts2 使用 i18n 拦截器 处理国际化,并且将其注册在默认的拦截器栈中 > i18n拦截器在执行Action方法前,自动查找请求中一个名为 request_locale 的参数. 如果该参

Struts2的国际化(一)-国际化资源文件的配置及国际化信息的访问

一.概述: 1)国际化是一种技术:在程序设计领域,把在无需改写源代码即可让开发出来的应用程序能够支持多种语言和数据格式的技术称为国际化. 2)本地化是一个动作:与国际化对应的是本地化,指让一个具备国际化支持的应用程序支持某个特定的地区. 3)Struts2 国际化是建立在 Java 国际化基础上的: >为不同国家/语言提供对应的消息资源文件 >Struts2 框架会根据请求中包含的Locale 加载对应的资源文件 >通过程序代码取得该资源文件中指定 key 对应的消息 二.如何配置国际化

Struts2之国际化

时间:2017-1-11 11:12 --国际化 Struts2已经对国际化进行了封装,我们只需要根据其提供的API进行访问即可. 要使用国际化的Action必须继承ActionSupport. 1.什么是国际化    同一款软件可以为不同用户提供不同语言界面. 2.国际化原理    需要一个语言资源包,包含很多properties文件,每个properties文件针对一个国家或一种语言,通过Java程序根据来访者国家语言,自动读取不同的properties文件. 3.读取properties文

Struts2的国际化入门

Struts2的国际化入门 Struts2国际化是建立在Java国际化的基础上的,一样是通过提供不同国家/语言环境的消息资源,然后通过ResourceBundle加载指定Locale对应的资源文件,再取得该资源文件中指定key对应的消息--整个过程与JAVA程序的国家化完全相同,只是Struts2框架对JAVA程序国际化进行了进一步封装,从而简化了应用程序的国际化. Struts2需要国际化的部分 a.类型转换: b.数据校验: c.验证框架xml配置文件的国际化:RegisterAction-

struts2 资源国际化

web.xml: <?xml version="1.0" encoding="UTF-8"?><web-app id="WebApp_9" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schem

【Struts2】 国际化

一.概述 二.Struts2中国际化: 2.1 问题1 全局 局部 2.2 问题2 2.3 问题3 2.4 问题4 在Action中怎样使用 在JSP页面上怎样使用 一.概述 同一款软件 可以为不同用户,提供不同语言界面 ---- 国际化软件 需要一个语言资源包(很多properties文件,每个properties文件 针对一个国家或者语言,通过java程序根据来访者国家语言,自动读取不同properties文件 ) 资源包编写 properties文件命名: 基本名称_语言(小写)_国家(大

Struts2实现国际化

public class I18nAction extends ActionSupport { private static final long serialVersionUID = -6933309304624396640L; public String reg() { return "success"; } public String toRegView() { System.out.println("toRegView"); return "reg