AutoCAD 3DMAX C语言 Pro/E UG JAVA编程 PHP编程 Maya动画 Matlab应用 Android
Photoshop Word Excel flash VB编程 VC编程 Coreldraw SolidWorks A Designer Unity3D
 首页 > JAVA编程

构建适用不同客户端的J2EE网络应用程序

51自学网 2015-09-03 http://www.51zixue.net
  引言:学习如何使用构造不仅支持浏览器而且还支持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){}

}

%>

 

<

 

 

 
说明
:本教程来源互联网或网友上传或出版商,仅为学习研究或媒体推广,51zixue.net不保证资料的完整性。
 
上一篇:用Java绘制K线图  下一篇:设计模式在EJB中的应用