产生XML的组件
XML生成程序是一个由一套根据应答产生相应的XML页面的类组成的组件。 例如,OptionsXML.java类有一个getOptionsXML()静态方法,用来使用指定的语言和请求设备所需要的内容来产生Options.jsp文件。
方法参数是pagetype(" Web "、" Wap "或者" iMode ")、language、country和一个HttpResponse对象,这个对象是向客户端写应答所用的,举例来说:
OptionsXML.getOptionsXML(pageType, language, country, response); |
XML生成程序类首先创建一地区对象然后加载需要的资源包(Resource Bundle)文件。
//创建地区和资源包对象
Locale locale = new Locale(language,country);
ResourceBundle rb = ResourceBundle.getBundle("ArticlesGUI",locale); |
|
在前面这小段代码中,“ArticlesGUI”是资源文件名。 locale实例定义了资源文件的后缀。 比如说,一个日文请求将使用ArticlesGUI_ja_JP.properties资源包文件。 同样地,对于一个英语请求,资源包文件将是ArticlesGUI_en_US.properties。
想要获取Java应用程序中的更多的国际化信息,请访问http://java.sun.com/products/jdk/1.1/docs/guide/intl/。
在加载适当的资源包文件之后,JSP页面实例化一个GenerateXML对象。 在完全的国际化应用程序中,所有的文字--甚至栏目标签、按钮文字和消息都是从资源文件中取得的,详细的请看下面的程序代码。 这个程序代码段添加一个页面标题、一个表单元素和一个超链接到页面中。
String sb="";
xml.addPageTitle(rb.getString(pageType+"_Options_Page_Heading"));
Element form = xml.addForm(1, "optionform",true);
xml.addLink(1,"_self", rb.getString(pageType+"_Options_Page_Option_1"), " ", url+"YourResponse.jsp?optionType=1&language=" +language+"&country="+country, rb.getString(pageType+"_Options_Page_Option_1"), form,true);
sb = xml.getGeneratedXMLString(); | |
XSL/XSLT所扮演的角色
XSL在这个应用程序中扮演举足轻重的角色,负责把产生的XML文件转化为一个特定用户设备上所用的格式。 应用程序使用服务器端XML转换而不是客户端转换,这是因为∶
· 并不是所有的客户端都安装了XML语法分析程序。或者安装了也不一定都可用。 分析服务器上的XML消除了对客户端的依赖性,使应用程序更加容易支持任何用户设备。
· XSL技术还没有完全成熟,标准还没有固定;所以不同的客户端可能会使用不同的方法转换XML。 使用服务器端转化就可以避免上述这些问题。
因为这个应用程序很小,只有一个非常简单的图形用户界面,所以每个用户设备之需要一个XSL样式表:
· articles-html-form.xsl —用于生成HTML (Web)
· articles-wml-form.xsl —用于生成WML (WAP)
· articles-imode-form.xsl —用于生成CHTML (iMode)
然而,这个应用程序的结构仍然可以扩展。 随着图形用户界面的复杂性的增加,你可以为相对于每种用户设备格式的每个页面编写不同的XSL样式表。 代码段1是WML特定的样式表articles-wml-form.xsl中的一段。
代码段1:
<?xml version="1.0"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:output method="xml" indent="yes" media-type="text/vnd.wap.wml" doctype-public="-//WAPFORUM//DTD WML 1.1//EN" doctype-system="http://www.wapforum.org/DTD/wml_1.1.xml" />
<xsl:template match="/"> <wml> <xsl:apply-templates select="WAYNE-ARTICLES-XML" /> </wml> </xsl:template>
<xsl:template match="WAYNE-ARTICLES-XML"> <xsl:variable name="ptitle"> <xsl:value-of select="self::WAYNE-ARTICLES-XML/PAGE-TITLE"/> </xsl:variable>
<xsl:for-each select="FORM"> <xsl:variable name="formname"> <xsl:value-of select="self::FORM/attribute::Name"/> </xsl:variable> <xsl:sort order="ascending" select="FIELD/@SeqNo" /> <card title="{$ptitle}" id="{$formname}"> <p align="center"> <strong><xsl:value-of select="$ptitle"/></strong><br/> <xsl:apply-templates select="FIELD" /> </p> </card> </xsl:for-each> </xsl:template>
<xsl:template match="FIELD"> <xsl:variable name="lname"> <xsl:value-of select="self::FIELD/LABEL-NAME"/> </xsl:variable>
<xsl:variable name="value"> <xsl:value-of select="self::FIELD/VALUE"/> </xsl:variable>
<xsl:variable name="name"> <xsl:value-of select="self::FIELD/attribute::Name"/> </xsl:variable>
<xsl:variable name="length"> <xsl:value-of select="self::FIELD/attribute::Length"/> </xsl:variable>
<xsl:variable name="ftype"> <xsl:value-of select="self::FIELD/attribute::Type"/> </xsl:variable>
<xsl:if test="self::FIELD/attribute::Type='TEXT'"> <strong><xsl:value-of select="$lname"/></strong> <input maxlength="{$length}" size="10" format="{$length}m" value="{$value}" type="text" name="{$name}"/> <br/> </xsl:if>
<xsl:if test="self::FIELD/attribute::Type='PASSWORD'"> <strong><xsl:value-of select="$lname"/></strong> <input maxlength="{$length}" size="10" format="{$length}m" value="{$value}" type="password" name="{$name}"/> <br/> </xsl:if>
<xsl:if test="self::FIELD/attribute::Type='S-TEXT'"> <strong><xsl:value-of select="$lname"/></strong> <xsl:value-of select="$value"/> <br/> </xsl:if>
<xsl:if test="self::FIELD/attribute::Type='LINK'"> <strong><xsl:value-of select="$lname"/></strong> <xsl:variable name="target"> <xsl:value-of select="self::FIELD/attribute::Target" /> </xsl:variable>
<xsl:variable name="alt"> <xsl:value-of select="self::FIELD/attribute::Alt" /> </xsl:variable>
<xsl:variable name="dname"> <xsl:value-of select="DISPLAY-NAME"/> </xsl:variable> <a title="{$alt}" href="{$value}"><xsl:value-of select="$dname"/></a> <br/> </xsl:if>
<xsl:if test="self::FIELD/attribute::Type='RADIO'"> <strong><xsl:value-of select="$lname"/></strong> <select name="{$name}" multiple="false"> <xsl:for-each select="VALUES"> <xsl:variable name="dname"> <xsl:value-of select="DISPLAY-NAME"/> </xsl:variable> <xsl:variable name="cvalue"> <xsl:value-of select="VALUE"/> </xsl:variable> <option value="{$cvalue}"><xsl:value-of select="$dname"/></option> </xsl:for-each> </select> <br/> </xsl:if>
<xsl:if test="self::FIELD/attribute::Type='SUBMIT'">
<xsl:variable name="formname"> <xsl:value-of select="parent::FORM/attribute::Name"/> </xsl:variable>
<xsl:variable name="formtarget"> <xsl:value-of select="parent::FORM/attribute::Action"/> </xsl:variable>
<xsl:variable name="formmethod"> <xsl:value-of select="parent::FORM/attribute::Method"/> </xsl:variable>
<do label="{$lname}" type="ACCEPT" name="{$name}"> <go accept-charset="UTF-8" href="{$formtarget}" method="post"> <xsl:for-each select="parent::FORM/FIELD">
<xsl:variable name="fname"> <xsl:value-of select="self::FIELD/attribute::Name" /> </xsl:variable>
<xsl:if test="self::FIELD/attribute::Type='TEXT'"> <postfield value="${$fname}" name="{$fname}" /> </xsl:if>
<xsl:if test="self::FIELD/attribute::Type='HIDDEN'"> <xsl:variable name="fvalue"> <xsl:value-of select="self::FIELD/VALUE"/> </xsl:variable> <postfield value="{$fvalue}" name="{$fname}" /> </xsl:if> <xsl:if test="self::FIELD/attribute::Type='PASSWORD'"> <postfield value="${$fname}" name="{$fname}" /> </xsl:if> <xsl:if test="self::FIELD/attribute::Type='RADIO'"> <postfield value="${$fname}" name="{$fname}" /> </xsl:if> </xsl:for-each> </go> </do> <br/> </xsl:if>
<xsl:if test="self::FIELD/attribute::Type='RESET'">
<xsl:variable name="formname"> <xsl:value-of select="parent::FORM/attribute::Name"/> </xsl:variable>
<xsl:variable name="formtarget"> <xsl:value-of select="parent::FORM/attribute::Action"/> </xsl:variable>
<xsl:variable name="formmethod"> <xsl:value-of select="parent::FORM/attribute::Method"/> </xsl:variable>
<do label="{$lname}" type="ACCEPT" name="{$name}"> <refresh> <xsl:for-each select="parent::FORM/FIELD"> <xsl:variable name="fname"> <xsl:value-of select="self::FIELD/attribute::Name" /> </xsl:variable>
<xsl:if test="self::FIELD/attribute::Type='TEXT'"> <setvar value="" name="{$fname}" /> </xsl:if> <xsl:if test="self::FIELD/attribute::Type='PASSWORD'"> <setvar value="" name="{$fname}" /> </xsl:if> </xsl:for-each> </refresh> </do> <br/> </xsl:if> </xsl:template> </xsl:stylesheet> | |
Sun公司的应用程序接口在例程中被大量使用。 请访问Sun的Java XML下载页(http://java.sun.com/xml/download.html),下载API和技术文档。 这样你就能更加清楚的分析示例程序代码,有助于你了解转化是怎样发生的。
XSL/XSLT变换技术的细节超出本文讨论的范围,具体细节请大家查询相应的资料。
使用资源包
示例应用程序使用资源包来提供I18N支持。 象前面提到的ArticlesGUI_ja_JP.properties文件,资源包文件包含了基于客户端的语言和请求者的设备应答的特定的值。举例来说,应用程序的初始的选择页面基于用户设备显示不同的标题,分别用于Web、WAP和iMode客户端。所以,选择页面资源包文件包含三个不同的" _Options_Page_Heading "属性-分别用于Web、WAP和iMode用户设备。 这里是ArticlesGUI_ja_JP.properties文件的一个节选。
// 选择页面
Web_Options_Page_Heading=/u65e5/u672c/Wayne's Demo
Wap_Options_Page_Heading=/u65e5/u672c/Demo
WAP IMode_Options_Page_Heading=/u65e5/u672c/Demo -- iMode | |
下面的代码段通过添加一个前缀到定义在JSP文件中的pagetype变量值,来取得用于给定用户设备相应的页标题。 记住,JSP页面设置pagetype变量的值为"Wap"、"Web"或者"iMode"然后把这个变量传入XML生成程序类。
rb.getString(pageType+"_Options_Page_Heading"); 这个方案让你产生包含适合于目标用户设备的值的XML页面。 产生的XML文件是普通的、公用的,可用于所用的请求,然后在XSL转换期间被转化成为用户设备的特定格式。 使用这种方式来分离页面产生代码可以给你提供用于不同的用户设备的不同的值的灵活性。
为额外的用户设备和语言添加支持
正如你所看到的,这个应用程序结构使为其它用户设备和语言添加支持变得很方便。 下面就是要扩展这个应用程序以便支持其它的语言或者用户设备的步骤。
为其他的用户设备添加支持
· 修改JSP文件,检查新用户设备。
· 为pageType变量创建一个新的值来识别新用户设备,然后在JSP文件中设置值。 比如,如果你想添加对于VoiceXML浏览器的支持,那么pagetype变量的值可以是"VOICE"。
· 创建一个用于新用户设备的XSL样式表
· 在新用户设备对应的资源包文件中添加新关键字值条目。
为其他的语言添加支持
创建一个对应于目标语言和国家的新的资源包文件。 例如,为了提供韩语支持,你将创建一个名为ArticlesGUI_ko_KO.properties的文件,然后使用Unicode格式为所有的关键值编写相应的条目。 用于访问使用的韩语的应用程序的话,那么URL的起始字符就是:
http://<machine name>:<port>/Options.jsp?language=ko&country=KO
处理图像和日期
你甚至可以使用资源包提供语言和用户设备特定的图像。 例如:
//使用资源包定位用户设备特定的图像格式
Web_Welcome_Image=web.gif
Wap_Welcome_Image=wap.wbmp
Imode_Welcome_Image=imode.jpg |
|
注意,你使用同样的pagetype变量和地区对象取得适当的图像。 对于国际化日期、数字和货币都是使用java.text程序包。 下面的程序代码示范如何检索一个地区特定的日期。
//对于日文和日本的日期
Locale locale = new Locale("ja","JP");
Date today = new Date();
DateFormat dateFormatter; /*按照地区创建日期*/
dateFormatter = DateFormat.getDateInstance(DateFormat.FULL,locale);
str+=dateFormatter.format(today); |
|
在上面我们已经看到了用于处理和显示国际化的、未知平台的内容的一些强有力的技术,使用这些技术,我们可以使用J2EE、XML和XLST设计应用程序以支持不同类型和语言的客户端设备,而且是你的应用程序不仅可以真正的实现全球化,而且可以针对未知的客户端类型做到可扩展和可修改。 你甚至可以编写一个智能化更加高的Java类来操作showPage()方法的处理。 那么可能性将是无尽的! 
说明:本教程来源互联网或网友上传或出版商,仅为学习研究或媒体推广,wanshiok.com不保证资料的完整性。
2/2 首页 上一页 1 2 |