程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 構建適用不同客戶端的J2EE網絡應用程序

構建適用不同客戶端的J2EE網絡應用程序

編輯:關於JAVA

引言:學習如何使用構造不僅支持浏覽器而且還支持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的客戶端潛在的問題。

應用程序實例

在這個簡單的實例情景中,應用程序中的第一個JSP頁面顯示一個包含超鏈接的頁面。 當用戶點擊一個連接時,應用程序作出響應,連接到一個特殊的頁面。 為了接受選擇,另一個頁面將成為結果頁。 正如你看見的,例程中的內容是極其地簡單,所以你可以專心於應用程序怎樣產生適當的語言與針對設備的不同的響應。這個應用程序的完整的請求/響應部分是由四個主要組分組成的:

· 一個提供處理請求和驅動應答序列的代碼邏輯的JSP頁面。

· 一個XML生成程序,負責生成一個XML頁面。

· 一個XSL樣式表,針對提出請求的客戶端有不同格式的應答。 XSLT用於服務器端轉化。

· 一個Resource Bundle文件,提供I18N支持。

圖3顯示了頂級應用程序配置結構,並解釋了組件之間的配置順序和相互關系。

JSP文件的結構和處理

在示例應用程序中,JSP頁面負責:

· 識別客戶端。

· 創建應答MIME設置。

· 確定頁面中將生成什麼樣的語言。

· 產生一個請求來生成XML頁面

· 應用適當的XSLT樣式表來產生XML頁面。

比如,假定一個客戶端對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的組件

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()方法的處理。 那麼可能性將是無盡的!

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved