`
EJB_wawa
  • 浏览: 107172 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

整合Eclipse、Struts、Hibernate和Spring的Java web开发

    博客分类:
  • web
阅读更多
本讲我们将介绍几种比较常用的Struts高级技术。

本讲要点:
l         Struts对国际化的支持

l         DispatchAction类

l         动态ActionForm

l         Validator验证框架

5.1  Struts对国际化的支持
“国际化”是指一个应用程序在运行时能够根据客户端请求所来自的国家/地区、语言的不同而显示不同的用户界面。例如,请求来自于一台中文操作系统的客户端计算机,则应用程序响应界面中的各种标签、错误和帮助信息均使用中文文字;如果客户端计算机采用的是英文操作系统,则应用程序也应能识别并自动以英文界面做出响应。

可以看出,引入国际化机制的目的在于提供自适应、更友好的用户界面,而并未改变程序的其他功能/业务逻辑。人们常用I18N这个词作为“国际化”的简称,其来源是英文Internationaliztion的首末字母i和n及它们之间的字符数18。

Struts框架通过使用<bean:message>标记,以及使用java.util数据包中定义的Locale和ResourceBundle类来支持国际化。java.text.MessageFormat类定义的技术可以支持消息的格式。利用此功能,开发人员不需了解这些类的细节就可进行国际化和设置消息的格式。

5.1.1  资源文件和资源包
要用Struts实现国际化和本地化,首先要定义资源文件的名称,这个文件会包含用默认语言编写的在程序中会出现的所有消息。这些消息以“关键字—值”的形式存储,例如:

error.validation.location = The entered location is invalid

当对一个应用程序进行国际化处理时,所要用的各种语言版本的“标签”信息应该存放在不同的属性文件中,每一个这样的文件对应一种语言的版本。所有属性文件合在一起被称为资源包(Resource Bundle)。

属性文件的命名格式可分为以下两种:

l         文件名前缀.properties

l         文件名前缀_语言种类.properties

文件名后缀必须为properties,前缀则由开发者自行确定,其中的语言种类字段必须是有效的ISO(International Standardization Organization,国际标准化组织)语言代码,ISO-639标准定义的这些代码格式为英文小写、双字符,具体见表5-1所示。

表5-1  ISO-639标准常用语言代码

语    言
编    码

汉语(Chinese)
Zh

英语(English)
En

法语(French)
Fr

德语(German)
De

日语(Japanese)
Ja

意大利语(Italian)
It


访问网址http://www.ics.uci.edu/pub/ietf/http/related/iso639.txt可以获取其他ISO-639标准语言代码。

文件名前缀中默认语言代码的为默认属性文件。当系统找不到与客户端请求的语言属性匹配的属性文件时,则使用该默认属性文件。

例如,如果我们要对前面的登录系统进行国际化处理,要求根据不同的语言环境显示英文和中文用户界面,那么就需要创建英文和中文版本的资源文件,分别取名为ApplicationResources.properties和ApplicationResources_zh.properties。它们的内容如例程5-1和例程5-2所示。

例程5-1  英文版资源文件ApplicationResources.properties

#A simple properties file

title.login = Login Page

label.username = Input your username

label.password = Input your password

item.submit = Submit

item.reset = Reset

message.success = you’re successful to login in. Now you’ve entered the main page.

message.failure = you fail to login in. You need register your information.

例程5-2  中文版资源文件ApplicationResources_zh.properties

#一个简单的属性文件

title.login = 登录页面

label.username = 姓名

label.password = 密码

item.submit = 登录

item.reset = 重置

message.success = 你已成功登录。现进入了主页。

message.failure = 你登录失败。现进入注册页面,请注册你的信息。

可以看出,属性文件中包含的是“键—值”对的形式的字符串信息。属性文件在应用程序启动时被载入内存,并根据客户端请求所携带的语言/地区信息进行匹配和使用。这些信息以java.util.Locale类的属性的方式被封存在request对象中。可以通过HttpServletRequest类的getLocale()方法获得相应的Locale对象,进而再调用Locale对象的getLanguage()方法获取具体的语言种类信息。

资源文件需要存储在类的路径下,而且它的路径要作为初始化参数传送给ActionServlet时,路径的格式要符合完整Java类的标准命名规范。比如,如果资源文件存储在WEB-INF\classes目录中,文件名是 ApplicationResources.properties,那么需要传递的参数值是ApplicationResources。如果文件在WEB-INF\classes\com\test中,那么参数值就应该是com.test.ApplicationResources。

资源包需要在Struts配置文件struts-config.xml中进行配置。<message-resources>元素就是用来配置资源包的。

<message-resources parameter="ApplicationResources"/>

如果有多个资源包要配置,那么它们用key属性来进行区分。

<message-resources parameter="ApplicationResources"/>

<message-resources key="Image" parameter="ApplicationImageResources"/>

<message-resources key="XXX" parameter="ApplicationXXXResources"/>

其中,不带key属性的就是默认的资源包。

资源包应该放在Web应用程序的WEB-INF/classes目录下,当系统初始化时,会装载这些资源文件。如果修改了资源文件,则需要重启应用服务器。

5.1.2  资源文件的编码转化
由于资源包是国际化的保证,因此它的编码应当使用标准的编码方式,一般为Unicode。所以,在资源包中的文件都需要经过编码转制。在JDK自带的工具中有一个native2ascii程序就是专门来进行资源文件转码的。该工具位于JDK安装目录下的bin目录中。

需要特别注意的是,中文版属性文件ApplicationResources_zh.properties需要进一步处理,需要把它里面的中文字符转化为Unicode代码,否则国际化处理的页面将会出现乱码。利用native2ascii程序对中文版资源文件进行编码转化的命令格式如下:

文件所在目录> native2ascii –encoding GB2312 ApplicationResources_zh.properties

ApplicationResources_zh_CN.properties

例如,假如资源文件ApplicationResources_zh.properties放在D:\ login\WEB-INF\classes目录中,使用native2ascii对它进行转化的命令如下:

D:\login\WEB-INF\classes>native2ascii –encoding GB2312 ApplicationResources_zh.properties

ApplicationResources_zh_CN.properties

经过native2ascii转化后,生成一个新的资源文件ApplicationResources_zh_ CN.properties,它的内容例程5-3所示。

例程5-3  中文版资源文件ApplicationResources_zh_CN.properties

title.login = \u767b\u5f55\u9875\u9762

label.username = \u59d3\u540d

label.password = \u5bc6\u7801

item.submit = \u767b\u5f55

item.reset = \u91cd\u7f6e

message.success = \u4f60\u5df2\u6210\u529f\u767b\u5f55\u3002\u73b0\u8fdb\u5165\u4e86\u4e3b\

u9875\u3002

message.failure = \u4f60\u767b\u5f55\u5931\u8d25\u3002\u73b0\u8fdb\u5165\u6ce8\u518c\u9875\

u9762\uff0c\u8bf7\u6ce8\u518c\u4f60\u7684\u4fe1\u606f\u3002

5.1.3  资源包的访问
资源包建立好后,就可以对其进行访问了。访问的方式主要有两种:一种在JSP页面中通过<bean:message>标记来访问,另一种是在程序中访问。

在JSP页面中访问资源包,需要使用<bean:message>标记。在使用该标记之前,必须首先部署包含此标记的Struts标记库文件struts-bean.tld,具体操作步骤如下:

(1)将Struts发布包中提供的标记库文件struts-bean.tld复制到待进行国际化的应用程序所在项目的WEB-INF目录下。

(2)在使用该标记库的应用程序的部署文件web.xml的<web-app>元素中添加相应的<taglib>元素,具体语法格式如下:

<taglib>

    <taglib-uri>/WEB-INF/struts-bean.tld</taglib-uri>

    <taglib-location>/WEB-INF/struts-bean.tld</taglib-location>

</taglib>

(3)在使用<bean:message>标记的JSP源文件的开头引入此标记库,具体格式如下:

<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>

在程序中访问资源包主要是在Action类中用到。Action提供了getResources()方法可以获得org.apache.struts.MessageResources类的一个实例。MessageResources代表资源包的一个类,它是一个抽象类,因此需要由Action的基类中的getResources()方法来返回它的一个实例。以下是一段程序示例:

//获得用户的Locale信息

Locale locale = getLocale(request);

//获取资源包

MessageResources message = getResources(request);

//从资源包中得到消息文本

String title = message.getMessage(locale,"title.login");

可以看到在调用了getResources()方法后,便可以获得相应的资源包,接下来,就可以按照request对象中的Locale信息来获取相应资源包中的文本。值得注意的是getMessage()有几种形式,如下所示:

getMessage(String key)

getMessage(Locale locale, String key)

getMessage(Locale locale, String key, Object[] args)

其中,最后一种getMessage()方法可以传入参数给资源包中的文件,更加灵活地实现消息的输出。

5.1.4  国际化的应用举例
例如,我们要对第3讲的登录系统的登录页面进行国际化处理。需要修改的组件有login.jsp、web.xml、struts-config.xml及资源文件。具体步骤如下。

(1)创建所需的资源包,其中包含2个属性文件:ApplicationResources.properties和ApplicationResources_zh_CN.properties,分别如例程5-1和例程5-3所示。

(2)将这两个属性文件保存到Web应用项目的WEB-INF/目录下。

(3)把struts-bean.tld标记库文件和struts-html.tld标记库文件复制到Web应用项目的WEB-INF/目录下。这些标记库文件可以从Struts的下载压缩包的lib目录中得到。

(4)修改web.xml文件。

在web.xml中相应的<taglib>元素,以声明资源文件和struts-bean.tld标记库。web.xml文件修改如下:

<web-app>

   ……

  <taglib>

    <taglib-uri>/WEB-INF/struts-bean.tld</taglib-uri>

    <taglib-location>/WEB-INF/struts-bean.tld</taglib-location>

  </taglib>

</web-app>

(5)修改struts-conf.xml。

在原来的struts-config.xml中添加<message-resources>元素,以指明所要用到的资源包。修改部分代码如下:

<struts-config>

    …..

<message-resources parameter="ApplicationResources"/>

</struts-config>

(6)修改登录页面login.jsp。

修改登录页面如例程5-4所示。在原来的login.jsp源码中,引入struts-bean.tld标记库文件,利用<bean;message>标记从资源文件中读取标签信息代替原来的字符文本。

例程5-4  国际化处理后的login.jsp

<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>

<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>

<%@ page contentType="text/html; charset=gb2312" %>

<html:html>

    <head><title><bean:message key="title.login"/></title> </head>

    <body>

        <html:form action="loginAction" method="post">

            <bean:message key="label.username"/>:

            <html:text property="username" size="15"/><br><br>

            <bean:message key="label.password"/>:

            <html:password property="password" size="15"/><br><br>

            <html:submit property="submit">

                <bean:message key="item.submit"/>

            </html:submit><br>

        </html:form>

    </body>

</html:html>

(6)部署、运行程序。

按照第2讲所讲的方法部署、运行这个Web应用程序。本节的源代码放在本书附带光盘的code/ch5/I18N/目录中。

在只有默认资源文件的情况下,登录页面运行的结果如图5-1所示。

  • 描述: 图5-1 英文版登录页面 在有中文版资源文件的情况下,登录页面的运行结果如图5-2所示。
  • 大小: 8.1 KB
  • 描述: 图5-2 中文版登录页面
  • 大小: 7.4 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics