📄 l3.html
字号:
<html>
<head><title>csdn_Serving XML with JSP</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<meta name="GENERATOR" content="Microsoft FrontPage 4.0">
<meta name="ProgId" content="FrontPage.Editor.Document">
<title>Serving XML with JSP</title>
</head>
<body>
<p>Serving XML with JSP </p>
<p><br>
作者:原著:Duan Yunjian /Willie Wheeler <br>
<br>
<br>
Blueski.xlt 为您编译<br>
<br>
<br>
<br>
<a href="jp0008.zip"> Download</a> 本案例全部内容(427K) <a href="jp0008ww.zip"> Download</a> 程序及附加文档(250K) <br>
<br>
<br>
对于每一个成功的电子商务站点,都应该满足二个主要的要求: 1 具有实际可用性;2 在不同的计算环境下的互操作性。<br>
<br>
从可用性来看,各种Web应用,例如电子商务站点,看上去应该和基于桌面的应用有所区别。现在我们可以很遗憾地看到,桌面应用中充斥着很多平庸的甚至更糟糕的内容,并没有很好的可用性,这也许是因为客户的钱在发现问题之前已经支付出去了。但是在 Web应用中,平庸的产品在支付以前就已经是一目了然的了,而其它的站点随时会加入到竞争行列中来。<br>
另一方面,电子商务系统必须能和其它系统一起协同工作。这些系统分布在各种各样的软硬件平台上。包括那些带有大大小小显示器的桌面电脑,PDA,蜂窝电话,等等。在这个商业竞争高度激烈的行业里,没有一家公司愿意去冒因为“不兼容”而失去客户或潜在商业伙伴的风险。<br>
除了上述2个方面外,电子商务站点应该提供动态内容,因为商业数据显然是动态的。如何将这些要求组合起来,已成为一种真正的挑战。例如,表示动态内容的标准方式是在服务器上动态地生成HTML,然后发送到客户端,我们假设那里是浏览器。这可能会违反可用性,因为HTML在开发用户界面时没有提供所需要的足够丰富的操作控制。同样这也违反互操作性,因为客户可能不用浏览器而使用其它设备。<br>
<br>
在这篇文章中,我们将探索一条同时满足可用性、互操作性以及动态内容要求,从而可以满足所有电子商务开发项目要求的途径。我们的途径就是使用JavaServer Pages (JSP)来服务于XML (serving XML with JSP)。我们将通过一个简单的e-travel旅游服务站点来演示这些概念。我们将使用JSP来生成动态内容,用XML来帮助完成可用性和互操作性的实现。 <br>
<br>
要运行这些代码,你要跟着做很多事情,不过所有的都是免费的。<br>
<br>
首先,你需要一个带 JSP引擎的Web服务器,我们推荐Apache的Tomcat3.1 <br>
(http://jakarta.apache.org/tomcat)<br>
<br>
他有Windows, Solaris和Linux版本。(如果你用了Tomcat,记得设置JAVA_HOME环境变量,使它指向JDK所在路径,然后在配置文件server.xml中加入我们的名为dw-travel的应用的路径。)<br>
<br>
其次,你需要一个支持XSL(XSLT)的浏览器,目前只有一个选择:Microsoft Internet Explorer 5 (www.microsoft.com/windows/ie)。对于 Netscape ( 即使是Netscape 6 预览版1)都不行。(不过这并不违反我们关于互操作性的申明,请继续往下看好了)<br>
<br>
第三,你需要Java Plug-in (www.java.sun.com/products/plugin),因为我们的应用包含了一个基于Java 1.2的applet。<br>
<br>
第四,代码要求使用 Sun的Project X XML parser(www.java.sun.com/products/xml)。 (任何W3C兼容的DOM parser都可以工作,但需要在CityDao.java中对代码做少许修改,因为你用了不同的parser。)<br>
<br>
最后,当然地,你要下载这些<a href="jp0008ww.zip">代码</a>。<br>
<br>
<br>
<img border="0" src="f1thumb.gif" width="201" height="157"></p>
<p>图 1 Welcome to D&W Travel<br>
<br>
<br>
<br>
<br>
对D&W Travel站点的介绍<br>
<br>
D&W旅游服务是一个虚拟的e-travel服务,她的目标是帮助来自全球的游客可以方便的规划他们的行程。 <br>
<br>
<br>
如果是一个很成熟的版本,那么她将通过一些图形界面使游客得到一个完善的旅游计划。 而本文的目的是,只要能提供足够的功能开发,满足用户查找旅馆就可以了。<br>
当某个用户来访,她看到的是一张友好的页面,其中可以允许登录或注册一个新的帐号,查找酒店,或者看看用户使用规则(参见图1)。<br>
<br>
<br>
实际上我们只提供了"Find Hotels"的功能。其它的功能只是一个样子而已。如果你点击了,得到的结果是返回主页面,或者返回连接错误的一个提示。 <br>
<br>
<br>
<img border="0" src="f2thumb.gif" width="201" height="225"></p>
<p>图2. Choose a City<br>
<br>
<br>
<br>
<br>
<br>
当用户选择 "Find Hotels" ,她会被带入到第二页(图2所示)。<br>
她可以从地图上选择一个城市。如果她点击的地方没有城市,则什么也不会发生,如果点击的正好是一个城市,那么就选择了该城市,而如果她点击的地方是一个有很多城市的地区,那么会有一个对话框出现,并要求你选择一个确切的城市。<br>
<br>
<br>
<img border="0" src="f3thumb.gif" width="201" height="157"></p>
<p>图3. Here Are Your Hotels <br>
<br>
<br>
<br>
<br>
一旦用户选了一个城市,她可以看到第三页,该页列出了城市中的所有酒店(参见图3)。在我们的站点里,总共只设了3个城市中的酒店:Los Angeles, San Diego和Pittsburgh。如果你选了别的城市,酒店列表将是空的。.<br>
<br>
<br>
<img border="0" src="f4thumb.gif" width="201" height="75"></p>
<p>图 4. Choose a City<br>
<br>
<br>
<br>
<br>
application的框架结构<br>
<br>
我们的application(译注:以下不再翻译为‘应用’)使用了标准的3-tier结构(参见图4)。各层是逻辑的,而不是实际的物理上的。第一层是表示层,让用户看到application数据。中间层由商业对象和application逻辑组成,它提供了定义良好的接口,表示层可以方便地存取,从而适应于商业服务中的各种请求。第三层是数据层,它保持了商业对象的持久性(business object persistence)。 通常数据层是一个或多个数据库,不过在我们的示例中文本文件已经足够了。3层模型比传统的 client/server结构更灵活,可伸缩,所以这也是我们使用它的原因了。<br>
<br>
在我们的application中,第一层包括了浏览器、Java applets和对应的application (有些是基于Java的,有些不是)。在本文中,我们选择IE5和CityMapApplet地图。<br>
<br>
在第二层中我们有基于Java的Web application,使用了Model-View-Controller (MVC)型式,我们将在下一节阐述。<br>
<br>
在第三层中我们只使用了一个文件,其中包含了酒店数据。(我们的application也包括了一个XML文件,它包含了城市数据,不过我们也可以把它视为一个Web文档,因为它存在于Web app文档的根目录,客户可以通过简单地指向它而直接获得)。<br>
<br>
表示层向中间层发送消息,(通过HTTP请求),中间层用XML回复,或者是静态生成的(由XML文件提供),或者是动态生成的(由JSP提供)。我们可以看到,使用XML代替HTML,意味着我们可以得到动态的内容而不必牺牲可用性和互操作性。(图5 是D&W Travel站点的类图)<br>
<br>
Web表示层 <br>
<br>
application将为用户产生二种类型的数据。一是城市数据,包括名称和相关数据。这是静态的,如果客户发出城市数据的请求,我们不必选择哪些数据要发送,我们将发出全部的数据。所以,我们将数据直接放在一个文件中。 二是酒店数据,包括名称、地址(有时还包括城市名)和电话号码。这是动态的数据因为客户请求不同城市将得到不同的酒店列表。所以我们要采用不同的策略,需要一个服务器端的机制来读取酒店数据,决定哪些是需要发出的,然后发出它们。虽然,我们也可以分别为每个城市定义一个静态文件,但如果以后查询条件改变,修改程序或处理将很困难。<br>
OK.现在我们来解释为客户数据请求所提供服务的服务器端的机制。在标准的MVC型的基于Java的Web application中, JavaBean与模型的后端(可能是database,也可能是Enterprise JavaBeans) 建立连接。HTML页和JSP页面是视图(view)。servlet或JSP 前端组件组成了连接器controller。(更具体的说明可参考JavaPro 2000/4:
"<a href="http://www.devx.com/premier/mgznarch/javapro/2000/04apr00/ww0004/ww0004.asp">Divide and Conquer Your Workflow with
JSP</a>")正如我们在一开始所指出的那样,这种方式还是为可用性和可操作性带来了一定的困难,客户端必须是HTML,这就限制了可用性和可操作性。我们不使用这种方式,因为D&W Travel站点有一个applet (不具备通常的HTML-parsing性能),它需要从Web app得到城市数据。展望未来,很显然serrving HTML 无法满足我们所提到的互操作性的要求,而新的客户电子设备将越来越多。<br>
解决之道是把数据作为未做格式处理的 XML,而不用已格式化了的HTML。如果数据是静态的,(例如我们的城市数据),我们可以直接使用 XML文件。如果数据是动态的 (就象是我们的酒店数据),则可以使用JSP来动态生成XML。这正是D&W Travel站点所做的。<br>
下面让我们详细地看一下Web层:<br>
所有和酒店有关的客户端请求来自于hotel/index.jsp这一前端组件:<br>
<br>
<jsp:useBean id="ctrl" class=<br>
"dw_travel.hotel.HotelController" scope="session"><br>
<% ctrl.init(application, session); %><br>
</jsp:useBean><br>
<br>
<% ctrl.service(request); %><br>
<jsp:forward page= "<%= ctrl.getNextPage() %>"/><br>
<br>
<jsp:useBean>元件为client端创建并初始化了一个session-scope的 HotelController 实例(如果原来不存在的话)。然后就可以用HotelController来处理客户端的请求了。最后,通过HotelController得到下一个页面是什么,然后把请求导向到该页。我们已经提过,页面包含了XML内容,而该页面究竟是静态XML文档或者动态生成的XML 将取决于请求的内容是静态的还是动态的。<br>
<br>
顺便提一下,我们选择了index.jsp作为前端组件的名字,因为Tomcat缺省地把index.jsp作为 welcome文件。亦即Tomcat把URL路径 /dw-travel/hotel/ 指向到/dw-travel/hotel/index.jsp。这样 /dw-travel/hotel/就是hotel模块的入口了。如果你不使用Tomcat,那么你的servlet引擎有可能不把index.jsp作为welcome 文件。这时你最好稍加弥补,例如:<br>
<web-app><br>
<welcome-file-list><br>
<welcome-file><br>
index.html<br>
</welcome-file><br>
<welcome-file><br>
index.jsp<br>
</welcome-file><br>
</welcome-file-list><br>
</web-app><br>
<br>
(实际上,在我们的在线代码中,我们已经为你做了这些,所以是比较独立的。)<br>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -