- 浏览: 77410 次
- 性别:
- 来自: 重庆
最新评论
-
禀圣含华:
怎么弄空格呢?___________然后我固定这些空格,怎么弄 ...
第18章. iText PDF 生成 -
super0555:
managed
第13章 Seam 应用程序框架 -
Javakeith:
代码呢?共享下代码呗!
第18章. iText PDF 生成 -
tonyshen277:
同感啊。还在做Win32下的开发,楼主所说的一个都不能少啊。
转自baidu wqqq 给软件开发初学者 -
kdboy:
的确,把人放在宇宙中去看,从上帝的眼中去看,人的确是非常渺小, ...
人生是什么
第16章. 国际化、本地化和主题
Seam使构建国际化应用程序变得十分容易。首先,让我们初排一下需要国际化和本地化你的应用程序的所有场景。然后,我们看一看组件Seam bundles.Seam。
16.1. 国际化你的应用程序
一个JEE应用程序由许多组件组成,并且对你的应用程序本地化,它们都必须适当地被配置。
第一步是从底部开始,确保你的数据库服务器和客户机对你的区域设置使用了正确的字符编码。通常情况下你希望使用UTF-8,这个怎样做已超出本教程的范围。
16.1.1. 应用程序服务器配置
为确保应用程序服务器根据客户机请求的正确编码收到请求参数,你必须配置tomcat连接器。如果你使用了Tomcat 或 JBoss AS,增加URIEncoding="UTF-8"属性到连接器配置。对
JBoss AS 4.2,改变${JBOSS_HOME}/server/(default)/deploy/jboss-web.deployer/server.xml:
<Connector port="8080" URIEncoding="UTF-8"/> 有一个更好的替代方法。你可以告诉JBoss AS,请求参数的编码将从请求获取:
<Connector port="8080" useBodyEncodingForURI="true"/>
16.1.2. 转换应用程序字符串
你也需要本地化在你的应用程序中的所有消息字符串(如在你视窗上的标签字段)。首先你需要确定你的资源包使用了想得到的字符编码进行编码。默认使用ASCII。尽管ASCII对大部分语言足够了,但它并不为所有语言提供字符。
资源包必须用ASCII 创建,或者使用代表Unicode字符的Unicode转义码。因为你没有编译属性文件成字节码,就没有办法告诉JVM使用了那种字符集。所以,你必须使用ASCII字符或没有在ASCII字符集中的转义字符。你能在任何Java文件中使用\uXXXX表示Unicode字符,这里的XXXX是十进制字符表示。
你能使用本地编码为你的资源包编写转化的标签(<xlink>Labels</xlink>),并且然后使用JDK 提供的工具native2ascii
转换文件的内容为转义格式。这个工具会转换你用本地编码编写的文件成为一个非ASCII字符表示,作为Unicode转义序列。
这个工具的用法被描述在http://java.sun.com/j2se/1.5.0/docs/tooldocs/index.html#intl或http://java.sun.com/javase/6/docs/technotes/tools/#intl。例如,根据UTF-8转换一个文件。
$ native2ascii -encoding UTF-8 messages_cs.properties > messages_cs_escaped.properties
16.1.3. 其它的编码设置
我们需要确保视窗显示你的本地化数据、使用正确的字符集的消息以及任何使用正确的编码提交的数据。
为设置显示字符编码,你需要使用<f:view locale="cs_CZ"/>标签(这里我们告诉JSF使用
捷克地区)。你可能希望改变
xml文档本身
的编码,如果你想嵌入本地化字符在xml中。为做这个,视需要而定改变在xml中声明的编码属性<?xml version="1.0" encoding="UTF-8"?>。
JSF/Facelets不仅应当提交使用了指定字符编码的任何请求,而且还应确保没有指定编码的任何请求,你可以使用servlet过滤器强迫请求编码:
<web:character-encoding-filter encoding="UTF-8"
override-client="true"
url-pattern="*.seam" />
16.2. 区域
每个用户的login会话有一个关联的java.util.Locale(可用到应用程序作为一个命名区域的组件)实例。在一般情况下,为设置区域你不需要做任何特殊配置。
Seam只是委派JSF决定活动的区域:
· 如果有一个与HTTP 请求关联的区域(浏览器区域),并且这个区域是在来自faces-config.xml
支持的区域的列表内,对会话的其余部分会使用这个区域。
· 否则,如果在faces-config.xml
中指定了默认区域,对会话的其余部分会使用这个区域。
· 否则, 使用服务器的默认区域。
通过Seam配置属性org.jboss.seam.international.localeSelector.language
, org.jboss.seam.international.localeSelector.country
和org.jboss.seam.international.localeSelector.variant
可以手动地配置区域,但我们想不出任何充分的理由一直这样做。
然而,允许用户通过应用程序接口手动设置区域是有用的,Seam提供内建功能用,用上面的算法重载确定的区域。你不得不增加下面全部片段到一个JSP 或Facelets页面的表单:
<h:selectOneMenu value="#{localeSelector.language}">
<f:selectItem itemLabel="English" itemValue="en"/>
<f:selectItem itemLabel="Deutsch" itemValue="de"/>
<f:selectItem itemLabel="Francais" itemValue="fr"/>
</h:selectOneMenu>
<h:commandButton action="#{localeSelector.select}"
value="#{messages['ChangeLanguage']}"/>
或者,如果你想要一个来自faces-config.xml
支持的所有区域的列表,只需使用:
<h:selectOneMenu value="#{localeSelector.localeString}">
<f:selectItems value="#{localeSelector.supportedLocales}"/>
</h:selectOneMenu>
<h:commandButton action="#{localeSelector.select}"
value="#{messages['ChangeLanguage']}"/>
当用户从下接列表中选一个项目时,那么点命令按钮,Seam 和JSF区域会覆盖会话的其余部分。
对支持区域带给我们的问题是定义。 通常情况下,你提供一个区域列表,用于你拥有的在JSF配置文件(/META-INF/faces-config.xml) 中的<locale-config>元素相
匹配的资源包。然而,你已经意识到Seam的组件配置机制比Java EE提供的更强大。出于这一原因,使用内建的名为org.jboss.seam.international.localeConfig
的组件,你能配置支持的区域,和默认服务器的区域。为使用它,你首先用Seam组件描述符声明一个Seam的国际化包的XML命名空间。然后,你定义默认区域和支持的区域,象下面:
<international:locale-config default-locale="fr_CA" supported-locales="en fr_CA fr_FR"/>
当然,如果你声明了你支持的一个区域,就你较好地提供了一个资源包匹配它!下次,你会学习如何定义特定语言的标签。
16.3. 标签
JSF支持用户接口标签和描述文本的国际化,通过<f:loadBundle />的
使用。你在Seam 应用程序中可以使用这个方法。另外,你能利用Seam messages
组件显示具有嵌入式EL表达式的模板标签。
16.3.1. 定义标签
Seam提供一个java.util.ResourceBundle
(供应用程序作为org.jboss.seam.core.resourceBundle使用)。通过这个特殊资料包你必会让你的国际化标签可用。默认时, Seam使用的资料包被命名为messages
,并且因此你需要在名为messages.properties、messages_en.properties
和 messages_en_AU.properties等等
文件中定义你的
标签。这些文件通常应归入WEB-INF/classes目录。
所以, 在 messages_en.properties中
:
Hello=Hello
在messages_en_AU.properties中
:
Hello=G'day
通过设置名为org.jboss.seam.core.resourceLoader.bundleNames
的Seam配置属性,你也能给资源包选一个不同的名字。你甚至能指定一个搜索(深度优先)消息的资源包列表名。
<core:resource-loader>
<core:bundle-names>
<value>mycompany_messages</value>
<value>standard_messages</value>
</core:bundle-names>
</core:resource-loader>
如果你只想为一个特殊页面定义一个消息,你能在一个删除头/和尾的
文件扩展名就与JSF视窗id同样名的资源包中指定它。所以,如果我们只想在/welcome/hello.jsp中显示消息,我们能放我们的消息在welcome/hello_en.properties中。
你甚至能在pages.xml中
指定一个明确的名字:
<page view-id="/welcome/hello.jsp" bundle="HelloMessages"/>
然后,我们能在/welcome/hello.jsp
上使用定义在HelloMessages.properties
中的消息。
16.3.2. 显示标签
如果你使用Seam资料包定义了你的标签,你可以使用他们,不必在每一页上输入<f:loadBundle ... />
。 实事上,你简单地输入:
<h:outputText value="#{messages['Hello']}"/>
或者:
<h:outputText value="#{messages.Hello}"/>
甚至更好, 消息自身或以包含EL表达式:
Hello=Hello, #{user.firstName} #{user.lastName}
Hello=G'day, #{user.firstName}
你甚至能在你的代码中使用消息:
@In private Map<String, String> messages;
@In("#{messages['Hello']}") private String helloMessage;
16.3.3. Faces消息
facesMessages
组件是显示成功或失败信息给用户的一个超级方便的方法。我们刚描述的功能也为faces 消息工作:
@Name("hello") @Stateless public class HelloBean implements Hello { @In FacesMessages facesMessages; public String sayIt() { facesMessages.addFromResourceBundle("Hello"); } }
这会显示Hello、 Gavin King
、 G'day或Gavin
, 依赖于用户的区域。
16.4. 时区
也有一个会话范围的java.util.Timezone实例
, 名为org.jboss.seam.international.timezone
, 和一个改变时区的Seam组件名为org.jboss.seam.international.timezoneSelector
. 默认时,时区是缺省的服务器时区。不幸的是,JSF的规范说所有的日期和时间应假定为UTC(Universal Time Coordinated),并显示为UTC ,除非明确地用<f:convertDateTime>指定时区。这是一个极其不便的默认行为
。
Seam 覆盖这种行为,并且默认所有日期和时间是Seam时区。 另外,Seam提供了<s:convertDateTime>
标签,其始终用Seam时区执行转换。
16.5. 主题
Seam应用程序也非常容易换肤的。 主题API与本地化API是非常相似的,但是,当然这两个问题是正交,一些应用程序支持本地化和主题两者。
首先,配置支持的主题集:
<theme:theme-selector cookie-enabled="true">
<theme:available-themes>
<value>default</value>
<value>accessible</value>
<value>printable</value>
</theme:available-themes>
</theme:theme-selector>
注意:第一个列的主题是默认主题。
主题被定义在一个与主题同名的属性文件中。例如,default
主题定义一组条目在default.properties
文件中。例如default.properties
可以定义:
css ../screen.css
template /template.xhtml
通常在一个主题资料包的条目将指出CSS样式、图像或facelets模板名的路径(不像本地化资料包,它们通常是文本)。
现在在JSP或facelets页面我们能使用这些条目。例如,在facelets页面中主题化样式表。
<link href="#{theme.css}" rel="stylesheet" type="text/css" />
或者,当页面定义在一个子目录中:
<link href="#{facesContext.externalContext.requestContextPath}#{theme.css}"
rel="stylesheet" type="text/css" />
facelets通过一个 <ui:composition>让我们主题化模板最有力:
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
template="#{theme.template}">
就象区域选择器,有一个内建的主题选择器,允许用户自由切换主题:
<h:selectOneMenu value="#{themeSelector.theme}">
<f:selectItems value="#{themeSelector.themes}"/>
</h:selectOneMenu>
<h:commandButton action="#{themeSelector.select}" value="Select Theme"/>
16.6. 通过cookies 持久化区域设置和主题参数
区域选择器、主题选择器和时区选择器全部支持区域和优化主题持久化到cookie。在components.xml中仅设置cookie-enabled属性:
<theme:theme-selector cookie-enabled="true">
<theme:available-themes>
<value>default</value>
<value>accessible</value>
<value>printable</value>
</theme:available-themes>
</theme:theme-selector>
<international:locale-selector cookie-enabled="true"/>
发表评论
-
第31章. Seam内建组件
2009-05-28 11:51 1393第31章. Seam内建组件 本章描述Seam内建组件 ... -
第30章. Seam注释
2009-05-26 20:21 1504第30章. Seam注释 在你编写一个Seam应用程 ... -
第31章. Seam内建组件
2009-05-26 20:21 1339第31章. Seam内建组件 本章描述Seam内建组件 ... -
第29章. 配置Seam和打包Seam应用程序
2009-05-26 20:19 1481第29章. 配置Seam和打包Seam应用程序 配置 ... -
第28章. Hibernate搜索
2009-05-26 20:17 149028.1. 介绍 如Apache Lucen ... -
第27章. Spring框架集成
2009-05-26 20:16 1332第27章. Spring框架集成 Spring集成 ... -
第26章. Seam和Google网页工具
2009-05-26 20:15 1160第26章. Seam和Google网页工具 ... -
第25章. 远程
2009-05-26 20:15 1217第25章. 远程 Seam 提供了一个从网页远程访 ... -
第24章. Web服务
2009-05-26 20:15 1586第24章. Web服务 Seam 集成了JBossWS, ... -
第23章. 缓存
2009-05-26 20:14 1351第23章. 缓存 在 ... -
第22章. 异步和消息
2009-05-26 20:12 2061第22章. 异步和消息 Seam 使异步执行来自网页请 ... -
第21章. Email
2009-05-26 20:11 1266现在Seam包含一个用于模板和发送邮件的可选组件。 Emai ... -
第 20章. RSS支持
2009-05-26 20:10 785第 20章. RSS支持 20.1. 安装 20.2. ... -
第19章. 微软的Excel 电子表格应用程序支持
2009-05-26 20:07 1786第19章. 微软的Excel 电子表格应用程序支持 S ... -
第18章. iText PDF 生成
2009-05-26 20:01 6387第18章. iText PDF 生成 18.1. 使用PDF ... -
第17章. Seam文本
2009-05-26 19:59 998第17章. Seam文本 面向协作站点需要一种更有友好的 ... -
第15章 安全(2)
2009-05-26 19:56 896第15章 安全(2) 15.5. 错误消息 安全 ... -
第15章 安全(1)
2009-05-26 19:53 94015.1. 概述 Seam安全API为你基于Seam的 ... -
第14章 Seam 和 JBoss 规则
2009-05-26 19:50 1374第14章 Seam 和 JBoss 规则 Seam使从 ... -
第13章 Seam 应用程序框架
2009-05-26 19:49 1354第13章 Seam 应用程序框架 Seam真正地使通过 ...
相关推荐
摘要4-5Abstract5-8第一章 序论8-91.1 引言8-91.2 本论文的研究主题91.2.1 主要内容91.2.2 论文的组织结构9第二章 本地化概念9-142.1 软件本地化9-102.2 藏文化102.3 国际化10-112.4 本地化的意义11-142.4.1 软件...
第十六章. 图表(521) 16.1.节创建一个图表 16.2.节. 为图表添加效果 16.3.节在图表中选择一个区域 16.4.节设计图表的刻度线 16.5.节为图表创建自定义标签 16.6.节创建列状图的明细项目效果 16.7节为图表的元素更换...
第16章 实战型单元测试 16.1 单元测试概述 16.1.1 为什么需要单元测试 16.1.2 单元测试之误解 16.1.3 单元测试之困境 16.1.4 单元测试基本概念 16.2 JUnit 4快速进阶 16.2.1 JUnit 4概述 16.2.2 JUnit 4生命周期 ...
第16章 DECODE和CASE.SQL中的if-fhen-else 第17章 创建和管理表、视图、索引、群集和序列 第18章 分区 第19章 Oracle基本安全 第Ⅲ部分 高级主题 第20章 高级安全性-虚拟专用数据库 第21章 高级安全性:透明数据加密...
第16章 DECODE和CASE.SQL中的if-fhen-else 第17章 创建和管理表、视图、索引、群集和序列 第18章 分区 第19章 Oracle基本安全 第Ⅲ部分 高级主题 第20章 高级安全性-虚拟专用数据库 第21章 高级安全性:透明数据加密...
第16章 实战型单元测试 16.1 单元测试概述 16.1.1 为什么需要单元测试 16.1.2 单元测试之误解 16.1.3 单元测试之困境 16.1.4 单元测试基本概念 16.2 JUnit 4快速进阶 16.2.1 JUnit 4概述 16.2.2 JUnit 4生命周期 ...
第16章 GPS应用开发 565 16.1 支持GPS的核心API 566 16.2 获取LocationProvider 568 16.2.1 获取所有可用的 LocationProvider 568 16.2.2 通过名称获得指定 LocationProvider 569 16.2.3 根据Criteria获得 Location...
第16章 GPS应用开发 565 16.1 支持GPS的核心API 566 16.2 获取LocationProvider 568 16.2.1 获取所有可用的 LocationProvider 568 16.2.2 通过名称获得指定 LocationProvider 569 16.2.3 根据Criteria获得 Location...
书中介绍了如何利用Struts 2 来解决Web 应用开发中的常见问题,同时还深入浅出地探讨了许多能帮助程序员编写Struts 2 应用程序的技巧,如管理页面导航活动、输入验证、国际化和本地化、对Ajax 的支持,等等。...
全面覆盖Java 2技术的高级主题,包括:多线程、集合框架、网络API、数据库编程、分布式对象等,深入探究了Swing、Java 2D API、JavaBean、Java安全模式、XML、注释、元数据等主题,同时涉及本地方法、国际化以及JDK ...
管理安全、可访问性、国际化和本地化。学会使用Liferay的JSF团队领导开发的JSF和Portlet,Liferay是处于领导地位的JavaPortal开发商。 全面介绍JSF2.0、详述如何使用Ajax,以及按照JSF2.0、的方式构建组件、快速理解...
目 录 第1章 Android应用与开发环境 1 1.1 Android的发展和历史 2 1.1.1 Android的发展和简介 2 ... 第16章 GPS应用开发 565 16.1 支持GPS的核心API 566 16.2 获取LocationProvider 568 ...
管理安全、可访问性、国际化和本地化。学会使用Liferay的JSF团队领导开发的JSF和Portlet,Liferay是处于领导地位的JavaPortal开发商。 全面介绍JSF2.0、详述如何使用Ajax,以及按照JSF2.0、的方式构建组件、快速理解...
第11章 理解国际化 240 11.1 Struts 2框架和Java i18n 241 11.1.1 使用ResourceBundle和Locale取得本地化文本 241 11.1.2 Struts 2如何解决本地Java对i18n支持的问题 243 11.2 Struts 2 i18n示例 244 11.2.1 Struts ...
在过去的14年中,他与IanAbramson和MichaelCorey为OraclePress合著了一系列图书.Abbey在国际Oracle用户团体非常活跃,经常出席COLLABORATE、OraclecOpenWorld和区域性用户组会议. Michael J.Corey是Ntirety...
第六章GHOST的备份与恢复 34 第七章 综合应用 44 一.文件的后缀名, *号任意的文件名 44 二.内存出错或是系统出错引起蓝屏 48 三.本机病毒删除不了,解决方法是把硬盘拆下来换到别台主机上进行杀毒,要求挂上去的...