posts - 70,comments - 408,trackbacks - 0

万维网World Wide Web的迅猛发展推动了跨国业务的发展,为了使企业的Web应用能支持全球客户,软件开发应用发出了支持多国语言,国际化的Web应用.国际化简称I18N指的是在软件设计阶段,就应该使软件具有支持多种语言和地区的功能.这样当需要在应用中添加对一种新的语言和国家的支持的时候,不需要对自己的软件返工,无需修改应用的程序代码.简单的说,本地化意味着针对不同的语言的客户,发出不同的软件版本.国际化意味着同一个软件可以面向使用不同语言的客户.如果一个应用支持国际化,应该具备以下特征:

1)     当应用需要支持一种新的语言时,无需修改应用源代码.

2)     文本,消息和图片从源程序代码中抽取出来,存储在外部.

3)     应该根据用户语言和地理位置,对于特定文化和相关的数据,如日期,时间,货币进行格式转换.

4)     支持非标准字符集.

5)     可以方便快捷的对应用做出调整,使它适应新的语言和地区.

Web应用使用本地化或者国际化都会涉及字符编码转换的问题,默认的情况下IE浏览

器发送请求的时候采用ISO-8859-1字符编码,如果Web应用程序要正确的读取用户发送的中文数据,则需要进行编码转换.一种方式是在处理请求前,先设置HttpServletRequest对象的字符编码,如下:

request.setCharacterEncoding(“gb2312”);

还有一种方法是对用户输入的请求数据进行编码转换如下:

String data=request.getParameter(“data”);

  If(data!=null)

Data=new String(data.getBytes(“ISO-8859-1”),”GB2312”);

如果数据库系统的字符编码是GB2312,那么可以直接读取数据库的中文数据,如果数据库的字符集是ISO-8859-1那么必须先对来自数据库的数据进行编码转换,然后才能使用.如果在XML文件中包含中文,可以将XML文件的字符编码设置为GB2312,例如:

还可以设置相应对象的字符编码.例如:

 Servlet:response.setContentType(“text/html;charset=GB2312”);

 JSP:<%@page contentType=”text/html;charset=GB2312”%>

 HTML:

JAVA在其核心库中提供了支持I18N的类和接口,java.util.Locale类是重要的JAVA的支持I18N的类,在JAVA语言中几乎所有对国际化和本地化的支持都依赖与这个类.关于这个类的详细介绍应参阅JAVA语言的API.ResourceBundle类也是在java.util包中,这个类提供和存放了管理与Locale相关的资源的功能,这些资源包括文本或者按钮的,状态信息图片名,错误信息,网页标题等.Struts框架并没有直接使用JAVA语言提供的ResourceBundle类,在Struts框架中提供了两个类,他们都在org.apache.struts.util包中.这两个类具有ResourceBundle相似的功能,分别是MessageResources和PropertyMessageResources类.

说了半天自己感觉我阐述的很乱,因为都是一些需要了解的知识所以我大略说了一下,下面我详细的介绍一下Struts框架对国际化的支持.主要是体现在能够输出和用户Locale相符合的文本和图片上.当Struts配置文件的元素的locale属性为truts的时候,Struts框架把用户的Locale实例保存在Session范围内,这样Struts矿局爱能够根据这个实例来从ResourceBundle中选择合适的资源文本.最简单的说就是用户如果是cn就去cn的本地资源文件中读取信息,如果是ch就去ch的本地资源文本文件中读取数据.首先要创建Struts的ResourceBundle,对于多个应用模块的Struts应用,可以为每一个子应用配置一个或者多个ResourceBundle应用中的每一个模块都可以访问这些Bundle,配置文件中每个元素定义了一个ResourceBundle,当应用包含多个的时候,用Key属性来区别它们.这只好的.properties文件一般放在Web应用的classes目录下,其实配置没什么就是按照固定的套路,重点要研讨的应该是如何访问ResourceBundle.Struts应用,子应用模块,ResourceBundle和资源文件之间存在以下的关系:

1)     一个Struts应用可以有多个子应用模块,必须有一个默认的子应用模块.只能一个.

2)     一个子应用模块可以有多个ResourceBundle,必须有一个默认的Bundle,只能一个.

3)     一个ResourceBundle可以有多个资源文件,必须有一个默认的文件,只能有一个.

Action类中定义了getResources(request)方法,可以返回默认的MessageResources

对象,代表当前应用模块使用默认的ResourceBundle.如果要获得特定的MessageResources对象可以调用Action基类的getResources(request.key)方法,其中参数key和Struts配置文件中的元素的key属性对应.得到MessageResources对象后,可以通过方法来访问消息文本.例如:

public ActionForward execute(ActionMapping mapping,

                             ActionForm form,

                             HttpServletRequest request,

                             HttpServletResponse response)

throws Exception{

Locale locale = getLocale(request);

MessageResources messages = getResources(request);

String msg = messages.getMessage(locale,”hello.error”);

……

}

org.apache.struts.util.MessageResources的getMessage()方法有好几种重载的形式,下面列出常用的几种:

1)     根据参数指定的Locale检查对应的资源文件,然后返回参数的key对应的消息文本getMessage(java.util.Locale locale,String key)

2)     根据参数指定的Locale检查对应的资源文件,然后返回参数和key对应的文本args参数用于替换符合消息文本的参数:

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

使用ResourceBundle绑定的Struts组件例如:

1)     ActionMessage类和标签.

2)     StringBean标签库和标签.

3)     Validator验证框架中访问ResourceBundle.

4)     在声明类型异常处理中访问ResourceBundle.

国际化应用的问题感觉理解上不是很容易,可以查阅相关的资料百度和Google可是中

国和世界的大宝箱哦. (网友们的支持,是我继续写技术文章的动力!)
posted on 2005-10-28 16:23 我心依旧 阅读(2030) 评论(1)  编辑  收藏

FeedBack:
# re: Struts框架国际化(原创)
2009-10-06 10:48 | amen
你把人家第九章的内容(哪本书就不用我提了吧?)摘抄一下,就号称是自己的原创??让我这个一贯潜水,看帖不回的人都忍不住。。。。。bs~  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航: