构建合用差异客户端的J2EE网络应用措施
副标题#e#
引言:进修如何利用结构不只支持欣赏器并且还支持WAP、IMODE及其他客户端设备的国际化网络应用措施。
在本日竞争日趋剧烈的世界上,很多贸易行为变得越来越全球化,以便到达最大的收益。 这就成了一个问题,因为由那些贸易机构开拓的应用措施必需合用于很多国度里利用差异语言的消费者。 使工作变得越来越巨大的是,以前成果有限的应用措施客户端—台式电脑和欣赏器—也在快速的成长。新的客户端范例包罗便携计较机、手提电话和其它小型设备。所以,国际策划机构有须要增加开拓和设计本钱合算、可进级并可维护的具有把内容是用多种语言发送到多种设备上的办理方案–换句话说,就是在全球经济圈中把应用措施发送到差异的客户端上。
本文是一个个案研究,设计而且开拓一个基于J2EE的可扩充的、可进级的而且经济合算的应用措施以满意差异客户端的需要。样品应用措施的方针不只是小我私家计较机用户并且可以是WAP移动式电话和iMode电话,并且它利用可针对各个地域需要定制和可当地化的国际化技能来迎合国际社会。
图1:一个典范的应用措施方案,利用差异的运行于一个民众处事器的基于国际互联网络的应用措施的用户设备。
利用按照客户端语言与设备的多种名目和语言应答的需要意味着必需执行两个主要任务的处事器应用措施:
1. 为提出请求的设备确定适当的输格外式,举例来说:
· 假如请求是从Web上发出的,那么输出HTML名目。
· 假如请求是从一个iMode设备上发出的,那么输出CHTML名目。
· 假如请求是从一个WAP设备上发出的,那么输出WML名目。
2. 支持I18N(国际化)。 那意味着输出将利用适当的语言,并且日期和数字名目也应该与客户端地址的地域匹配。
名为“网关(gateway)”的专用处事器软件模块把客户端的请求翻译成为HTTP请求。 举例来说,一个WAP网关认真把WSP请求转换成为HTTP请求(反之亦然)以及阐明息争释应答。 同样地,利用一个VoiceXML请求,由一个Voice欣赏器构成的网关认真识别语言和DTMF输入,把它转换成为一种尺度请求名目,而且把VoiceXML应答转换成为语音。
一些大概存在的问题
表格1给了一些差异的客户应用措施的上会呈现的问题以及大概的办理方案。
需要思量的问题 | 参考谜底 |
奈何为多用户客户端提供支持? | 为所有的用户客户端利用民众的处事器端代码。
利用XML和Xslt。 XML文件包括为所有的客户端所共用的数据。XSLT执行把XML改酿成为适合于各个用户端的名目标转化请求。 配置的生成的应答依靠合用于请求的设备的MIME范例。举例来说,为了响应一个WML请求,MIME范例必需被配置为text/vnd.wap.wml。
|
在处事器照旧在客户端执行XSLT转化? | 老是利用处事器端转化。并不是所有的客户端都支持客户端转换。 |
奈何为I18N客户端提供支持? | 必需利用UTF-8编码名目。
利用ResourceBundle和Message Bundle类以及java.text措施包。 |
应用措施可以利用cookies作为状态打点吗? | 不行以。 |
不利用cookies,奈何打点session数据? | 利用URL重写不支持cookies的客户端。 |
利用绝对URL照旧相对URL来引用处事器资源? | 利用绝对的URL,以制止不支持相对URL的客户端潜在的问题。 |
#p#副标题#e#
应用措施实例
在这个简朴的实例情景中,应用措施中的第一个JSP页面显示一个包括超链接的页面。 当用户点击一个毗连时,应用措施作出响应,毗连到一个非凡的页面。 为了接管选择,另一个页面将成为功效页。 正如你瞥见的,例程中的内容是极其地简朴,所以你可以专心于应用措施奈何发生适当的语言与针对设备的差异的响应。这个应用措施的完整的请求/响应部门是由四个主要组分构成的:
· 一个提供处理惩罚请求和驱动应答序列的代码逻辑的JSP页面。
· 一个XML生成措施,认真生成一个XML页面。
· 一个XSL样式表,针对提出请求的客户端有差异名目标应答。 XSLT用于处事器端转化。
· 一个Resource Bundle文件,提供I18N支持。
图3显示了顶级应用措施设置布局,并表明白组件之间的设置顺序和彼此干系。
JSP文件的布局和处理惩罚
在示例应用措施中,JSP页面认真:
· 识别客户端。
· 建设应答MIME配置。
· 确定页面中将生成什么样的语言。
· 发生一个请求来生成XML页面
· 应用适当的XSLT样式表来发生XML页面。
#p#分页标题#e#
好比,假定一个客户端对Options.jsp文件(示例应用措施的第一个页面)提出了一个请求。 客户端把所利用的语言和国度名作为一个参数(URL参数)传入处事器。 假如处事器上的JSP页面不能接管(可能不能识别)客户端的语言和国度配置,那么应用措施就利用美国英语来显示响应。 下面的措施代码段说明一个JSP页面奈何从请求中取得语言和国度信息。
/*查抄应答中将显示的语言 默认环境下,将利用美国英语来显示应答 */
if((language = request.getParameter("language"))==null) language="en";
if((country = request.getParameter("country"))==null) country="US";
country = country.toUpperCase();
基于客户端措施,JSP页面配置应答的MIME范例,识别用于发生的XML的XSLT样式表,而且配置适当的pageType值,XML生成措施利用这个值来在XML生成措施中找到适当的Resource Bundle文件。
别的,应用措施将足够智能化以识别相应的应答名目。 好比,下列代码片段查抄一个欣赏器客户端,假如发明的话,执行某些详细的处理惩罚进程。
String userAgent = request.getHeader("User-Agent");
/* 识别用户设备∶
1. 配置为发生XML的pageType变量。 在这个时候,应用措施随语言、国度和页面范例配置来从资源包中取得相应的条目。
2.配置contentType变量。 应用措施按照识此外用户设备来配置MIME头。
3. 配置xslName变量。 这是用于把XML转换为页面的XSLT文件的文件名。
*/
if(userAgent.startsWith("Mozilla"))
{
pageType="Web"; contentType="text/html;charset=UTF-8";
xslName="articles-html-form.xsl";
}
其他的用户设备发送差异的Header。譬喻,你可以利用下面的措施代码识别iMode用户设备(可以在 wapprofit.com模仿器中验证)∶
userAgent.startsWith("Microsoft URL")
并且你也可以利用下面的代码来识别WAP(Nokia东西包)用户设备:
userAgent.startsWith("Nokia")
你必需利用UTF-8字符集来支持I18N。
此时,应用措施已经识别用户设备和语言,所以应用措施可以发生一个XML页面。 为了初始化XML的生成,JSP挪用一个XML生成措施类要领,譬喻OptionsXML类的getOptionXML()要领,来按照请求返回一个包括数据的XML字符串。
/* 挪用JSP的一个私有要领来按照用户设备发生XML和应用一个XSL样式表来发生输出。 */
showPage(pageType, language, country, response, contentType, xslName);
showPage()要领按照pageType、语言和国度配置来发生XML页面。 它应用特定的XSLT样式表来生成XML然后把名目化了的应答发回用户设备。
try
{
response.setContentType(contentType);
response.getOutputStream().flush();
TransformerFactory tFactory = TransformerFactory.newInstance();
String str = OptionsXML.getOptionsXML(pageType, language, country,response);
StringReader sReader = new StringReader(str);
StreamSource xml = new StreamSource(sReader) ;
StreamSource xsl = new StreamSource(xslName) ;
Transformer transformer = tFactory.newTransformer(xsl);
StreamResult result = new StreamResult(response.getOutputStream()) ;
transformer.transform(xml, result);
}
catch(Exception e)
{}
Option.jsp 代码
<%@ page import="java.util.*" %>
<%@ page import="java.net.*" %>
<%@ page import="import org.xml.sax.*" %>
<%@ page import="javax.xml.transform.TransformerFactory" %>
<%@ page import="javax.xml.transform.Transformer" %>
<%@ page import="javax.xml.transform.stream.StreamSource" %>
<%@ page import="javax.xml.transform.stream.StreamResult" %>
<%@ page import="javax.xml.transform.TransformerException" %>
<%@ page import="javax.xml.transform.TransformerConfigurationException" %>
<%@ page import="wayne.articles.xmlgen.*"%>
<% String pageType="Web";
String userAgent = request.getHeader("User-Agent");
String contentType="text/html;charset=UTF-8";
String xslName="articles-html-form.xsl";
String language="en";
String country="US";
if((language = request.getParameter("language"))==null)
language="en";
if((country = request.getParameter("country"))==null)
country="US";
country = country.toUpperCase();
if(userAgent.startsWith("Mozilla")) {
pageType="Web";
contentType="text/html;charset=UTF-8";
xslName="articles-html-form.xsl";
}
else if(userAgent.startsWith("Microsoft URL")) {
pageType="IMode";
contentType="text/html;charset=UTF-8";
xslName="articles-imode-form.xsl";
}
else if(userAgent.startsWith("Nokia"))
{
pageType="Wap";
contentType="text/vnd.wap.wml";
xslName="articles-wml-form.xsl";
}
showPage(pageType,language,country, response, contentType, xslName);
%>
<%
private void showPage(String pageType, String language, String country, HttpServletResponse response,String contentType, String xslName)
{
try
{
response.setContentType(contentType);
response.getOutputStream().flush();
TransformerFactory tFactory = TransformerFactory.newInstance();
String str = OptionsXML.getOptionsXML(pageType, language, country,response);
StringReader sReader = new StringReader(str);
StreamSource xml = new StreamSource(sReader) ;
StreamSource xsl = new StreamSource(xslName) ;
Transformer transformer = tFactory.newTransformer(xsl);
StreamResult result = new StreamResult(response.getOutputStream()) ;
transformer.transform(xml, result);
}
catch(Exception e)
{}
}
%>
YourResponse.jsp 代码:
<%@ page import="java.util.*" %>
<%@ page import="java.net.*" %>
<%@ page import="import org.xml.sax.*" %>
<%@ page import="javax.xml.transform.TransformerFactory" %>
<%@ page import="javax.xml.transform.Transformer" %>
<%@ page import="javax.xml.transform.stream.StreamSource" %>
<%@ page import="javax.xml.transform.stream.StreamResult" %>
<%@ page import="javax.xml.transform.TransformerException" %>
<%@ page import="javax.xml.transform.TransformerConfigurationException" %>
<%@ page import="wayne.articles.xmlgen.*"%>
<%
String pageType="Web";
String userAgent = request.getHeader("User-Agent");
String contentType="text/html;charset=UTF-8";
String xslName="articles-html-form.xsl";
String language="en";
String country="US";
if((language = request.getParameter("language"))==null)
language="en";
if((country = request.getParameter("country"))==null)
country="US";
country = country.toUpperCase();
int optionid = 1;
try
{
optionid = Integer.parseInt(request.getParameter("optionType"));
}
catch(Exception e)
{
optionid = 1;
}
System.out.println("user Agent = " + userAgent);
if(userAgent.startsWith("Mozilla"))
{
pageType="Web";
contentType="text/html;charset=UTF-8";
xslName="articles-html-form.xsl";
}
else if(userAgent.startsWith("Microsoft URL"))
{
System.out.println("entered");
pageType="IMode";
contentType="text/html;charset=UTF-8";
xslName="articles-imode-form.xsl";
}
else if(userAgent.startsWith("Nokia"))
{
pageType="Wap";
contentType="text/vnd.wap.wml";
xslName="articles-wml-form.xsl";
}
showPage(pageType,language,country, response, optionid, contentType, xslName);
%>
<%
private void showPage(String pageType,String language,String country, HttpServletResponse response, int optionid,String contentType, String xslName)
{
try
{
response.setContentType(contentType);
response.getOutputStream().flush();
TransformerFactory tFactory = TransformerFactory.newInstance();
String str = YourResponseXML.getYourResponseXML(pageType,language,country,response, optionid);
StringReader sReader = new StringReader(str);
StreamSource xml = new StreamSource(sReader) ;
StreamSource xsl = new StreamSource(xslName) ;
Transformer transformer = tFactory.newTransformer(xsl);
StreamResult result = new StreamResult(response.getOutputStream()) ;
transformer.transform(xml, result); } catch(Exception e){}
}
%>
发生XML的组件
#p#分页标题#e#
XML生成措施是一个由一套按照应答发生相应的XML页面的类构成的组件。 譬喻,OptionsXML.java类有一个getOptionsXML()静态要领,用来利用指定的语言和请求设备所需要的内容来发生Options.jsp文件。
#p#分页标题#e#
要领参数是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>
#p#分页标题#e#
Sun公司的应用措施接口在例程中被大量利用。 请会见Sun的Java XML下载页(http://java.sun.com/xml/download.html),下载API和技能文档。 这样你就能越发清楚的阐昭示例措施代码,有助于你相识转化是奈何产生的。
XSL/XSLT调动技能的细节超出本文接头的范畴,详细细节请各人查询相应的资料。
利用资源包
#p#分页标题#e#
示例应用措施利用资源包来提供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
#p#分页标题#e#
留意,你利用同样的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()要领的处理惩罚。 那么大概性将是无尽的!