利用标记库国际化JSP(1)

文章出处:

http://www.ibm.com/developerworks/cn/java/l-jspinternationalization/#3 

当我们在用 JSP 设计面对不同国家的站点时 , 特别是那些在界面之间没有特别大差别的商业站点 , 我们可以利用 JSP 的一些机制来支持国际化。
通常有三种方式可以实现国际化
  • 为每个国家编写一套JSP代码, 可以通过嵌入BEAN和标记处理器的方式重用一些逻辑代码。
  • 维护统一的JSP代码,直接利用JAVA的资源捆绑机制实现国际化。
  • 维护统一的JSP代码,利用通用的或自定义标记库实现国际化。
我们重点讨论第三种方法 , 因为它有很好的灵活性 , 可维护性和可扩展性。
其实标记库也是利用 JAVA 的资源捆绑机制 , 只是把国际化常用的方法封装的更容易使用 , 而且更符合 JSP 的编程思想 , 把表述层和逻辑层分开。通用的标记库比较著名的有 JAKARTA I18N 标记库。本文包括以下内容:
  • JSP国际化的简介
  • 如何配置i18n标记库
  • 详细介绍i18n标记库的各种标记和使用方法
一个简单的例子
JSP 国际化的简介
JSP 的国际化的基础是 JAVA 的国际化 , 都是利用资源捆绑机制把资源与代码分离 , 通过读取相应的 locale 信息 , 自动的匹配相应的资源 , 并在此基础上实现文本 , 时间 , 日期 , 货币 , 数字等格式的国际化。关于 JAVA 国际化的基本概念和方法见 The Java TMTutorial Internationalization
但同一般的 JAVA 程序的国际化的过程和具体方法还是有很多区别。主要在与 locale 信息的来源 : JSP locale 信息在大部分情况下来自与浏览器,而一般的 JAVA 程序的 locale 大都来自当前的 JVM
利用 JSP 的标记库机制实现国际化:通过使用通用或用户自定义的 I18N 标记库,可以有很好的灵活性 , 可维护性和可扩展性。但需要在服务器端配置标记库。
如何配置 i18n标记库
首先需要一个支持 JavaServer Pages Specification 1.1 或更高版本的 servlet 容器,如 Tomcat 4.03 ,然后按以下步骤配置你的网络服务器。
  • 拷贝标记库的描述文件到网络服务器的/WEB-INF子目录中
  • 拷贝标记库的JAR文件到网络服务器的/WEB-INF/lib子目录中
  • /WEB-INF/web.xml文件中加入<taglib>元素
<taglib>
 <taglib-uri>http://jakarta.apache.org/taglibs/i18n-1.0</taglib-uri>
 <taglib-location>/WEB-INF/i18n.tld</taglib-location>
</taglib>
 
为了在你的 JSP 中可以使用它,在每个页面的最顶端加入
<%@ taglib uri="http://jakarta.apache.org/taglibs/i18n-1.0" prefix="i18n" %>
 
其中 "i18n" 是该标记的前缀,您可以起其他你喜欢的名字。
 
i18n 标记库的各种标记和使用方法
bundle
为该页的其他 I18N 标记建立 ResourceBundle. 如果没有给定 locale 信息 , 它会使用浏览器的设定。
注意 : 该标记必须写在该页任何 HTML 标记以前 , 以便根据所选择的 locale 信息设置 Content Type
<%@ taglib uri="http://jakarta.apache.org/taglibs/i18n-1.0" prefix="i18n" %>
<i18n:bundle baseName="i18n-test"
             id="bundle"/>
<HTML>
<HEAD>
......
 
1bundle的属性描述
属性名称
描述
id
ResourceBundle 的标识变量 , 通过它 , 其他标记和代码可以访问该 ResourceBundle, 当一个页面需要多个 ResourceBundle , 可以用它来区分 .
baseName
ResourceBundle 的基本名 , 可以连同 locale 信息定位所需的 ResourceBundle.
changeResponseLocale
指定是否改变响应的 locale 以匹配该标记所用的 locale
scope
指定该标记可被访问的范围 . (application, session, request, page*)
locale
用户可以指定首选的 locale
localeAttribute
不赞成使用
localeRef
用户可以用属性名指定首选的 locale ,这个属性名必须在可被访问的范围内
debug
调试开关
*page: 对象被绑定到 javax.servlet.jsp.PageContent 中,只在该页中可被访问
Request: 对象被绑定到 javax.servlet.ServletRequest , 只要 HttpRequest 对象存在,就可以通过它访问。
Session: 对象被绑定到 javax.servlet.jsp.PageContent 中,并调用 session getArribute() 方法来访问。
Application: 对象被绑定到 javax.servlet.ServletContext 中,是最持久的范围,所有客户都可以访问到。
Message
从默认或指定的 ResourceBundle 中读取文本并利用 java.text.MessageFormat 格式化显示文本
<i18n:message key="column1.header"/>
 
2:Message的属性描述
属性名称
描述
id
Message 的标识变量 , 通过它 , 其他标记和代码可以访问该 Message
key
用它得到 ResourceBundle 中的显示文本
args
利用数组参数通过 java.text.MessageFormat 格式化显示文本
bundle
一个 ResourceBundle 的参考
bundleRef
一个代表 ResourceBundle 的参考的属性名
debug
调试开关
Locale
 
定义 LOCALE 信息
JSP 国际化和一般的 JAVA 应用程序国际化的最重要的区别在于 Locale 信息的源自浏览器 , 具体的讲来自 request 对象 . jakarta i18n 标记库在缺省的情况下可以自动读取 request 对象中的 Locale 信息 , 从而简化了编程和维护的复杂度 , 当然用户也可以显式的定义 Locale 信息 , 解决特殊的显示问题。
3:Locale的属性描述
属性名称
描述
id
Locale 的标识变量 , 通过它 , 其他标记和代码可以访问该 Locale
locale
用户可以指定首选的 locale
localeRef
用户可以用属性名指定首选的 locale ,这个属性名必须在可被访问的范围内
language
用户可以指定首选的语言
country
用户可以指定首选的国家
一个简单的例子:
i18n-test.jsp
<%@ taglib uri="http://jakarta.apache.org/
taglibs/i18n-1.0" prefix="i18n" %>
<i18n:bundle baseName="i18n-test"
             id="bundle"/>
<%
java.util.TreeSet set = new java.util.TreeSet();
for ( java.util.Enumeration enum = bundle.getKeys();
enum.hasMoreElements(); )
 {
 set.add(enum.nextElement());/ /put the keys into Set collection.
 }
%>
<HTML>
<HEAD>
 <TITLE>Examples of I18N Custom Tag Library
 Tag Usage</TITLE>
</HEAD>
<BODY>
This page displays all key/value pairs in the bundle.
locale = <b><%= pageContext.getResponse().
getLocale() %></b><br>
charset = <b><%= pageContext.getResponse().
getCharacterEncoding() %></b><br>
<H2>WebApp translations</H2>
<TABLE>
<%
int index = 0;
for ( java.util.Iterator iter = set.iterator(); iter.hasNext(); )
 {
 String akey = (String)iter.next();
 if ( index++ % 2 == 0 )
    {
    %>
    <TR BGCOLOR="#e0e0e0">
    <%
    }
 else
    {
    %>
    <TR>
    <%
    }
    %>
 <TD><%= akey %></TD><TD><
 i18n:message key="<%= akey %>" /><TD>
 </TR>
 <%
 }
%>
</TABLE>
</BODY>
</HTML>
 
 
i18n-test.properties
test1 = Hello world
test2 = Now you can let jsp i18n using i18n taglib!
 
i18n-test_zh_CN.properties
test1 = 你好世界
test2 = 现在你可以用 i18n 标记库国际化 JSP 了。
 
注意要把资源文件拷贝到 /WEB-INF/classes 子目录下
 
 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值