⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 l3.html

📁 写给JSP初级程序员的书
💻 HTML
📖 第 1 页 / 共 2 页
字号:
<br> 
 &nbsp;<br>
<img border="0" src="f5thumb.gif" width="201" height="127"></p>
<p>图 5. Class Diagram<br> 
<br> 
<br> 
<br> 
<br> 
让我们仔细看一下HotelController 。HotelController是session-scoped, 每一个客户的session都有自己独立的实例。 HotelController接受了命令(在客户的请求中作为 HTTP参数进行了编码), 并以这样的方式存取模型:执行命令,然后判断哪一个文档应该回复给客户端。如果客户端请求的是城市数据,HotelController根本不必存取模型。它只要简单地将cities.xml传递给客户端,这只是一个静态的文件(参见图6)。如果请求的是酒店数据,HotelController将从数据层加载酒店数据(这里,仅仅是hotels.txt) 并将它载入酒店JavaBean的一个Vector变量中。然后HotelController 将这个Vector放入session域中,这样hotels-xml.jsp 就可以对它进行处理了。最后,它将页面设为hotels-xml.jsp,该页面可以将动态生成的XML传递到客户端(见图7)。<br> 
<br> 
 &nbsp;<br>
<br>
<img border="0" src="f6thumb.gif" width="201" height="103"></p>
<p>图6. Sequence Diagram (Cities)&nbsp;<br>
&nbsp;<br>
<br>
<br>
<br>
实现互操作性的关键是HotelController可以假设客户端能够处理XML。在目前的各种浏览器中,只有IE5能处理基于XSLT的XML。但基于XML的通信的发展是非常快的。同时,还有一个较好的方法,那就是发展在服务器端检测客户浏览器类型的技术,检测以后,可以根据不同的客户端,要么由servlet或JSP直接生成,要么由服务器端的 XSLT生成HTML或者XML。这样可以保证我们的 application能够和不同的浏览器互操作。<br> 
<br> 
这里,我们只是比较简单地提供了XML,并且假定客户端可以对它进行处理。这一讨论似乎加剧了只能使用IE5和我们所提倡的互操作性之间的分歧。不过,可以使用XML并不意味着不能使用HTML。&nbsp;<br>
 &nbsp;<br>
<br>
基于Applet的表示(Presentation)<br>
第二张页面中的地图是用叫做 CityMapApplet 的Java applet实现的,它显示了大约900个城市,大部分定位都是准确的。(这是由学生在课程中进行编制的,海拔和经纬度等方面还有一些错误)。applet 从服务器上读取城市数据然后加以提交。 城市下方是一个世界地图(使用GNU Generic Mapping Tools生成)。通过选择城市来查找酒店的功能实现是很简单的:如前所述,用户具有查找一个酒店的兴趣,application为用户提供选择城市的界面,拥护选择了一个城市,application返回该城市中的酒店的列表(如图3)。&nbsp;<br>
<br>
实际上,使用applet并不是实现选择城市的唯一解决之道, 并不是所有人都会在浏览器中安装Java Plug-in,尽管任何人都可以下载它,但使用HTML来替代似乎更有竞争力。但在另一方面,从某种人-机交互的观点来看,applet在提供多表单交互作用等方面表现很好,所以各种不同的用户,要求各种不同的性能和功能,需要各种不同的设计来达到各种不同的可用性。Applets提供了保证持续可用性的可能。因此applet依然是开发客户端界面的方法之一。 尽管你一直使用HTML来代替applets,有时你也需要保持使用applets的可能性。&nbsp;<br>
<br>
让我们看一下CityMapApplet是如何取得数据的。CityMapApplet使用了一个CityDao数据存取对象来得到一个城市的Vector变量。CityDao.read()产生了一个DOM树(也就是一个org.w3c.dom.Document) XML文档表示,位于applet指定的cities.xml文件的URI:&nbsp;<br>
<br>
// uri points at cities.xml Document document = XmlDocument.createXmlDocument(uri);&nbsp;<br>
<br>
然后它沿着DOM树取出城市数据,放入一个Vector变量。最后,它返回Vector变量。&nbsp;<br>
<br>
注意,CityMapApplet从静态的cities.xml中读取XML数据。 如果一个客户请求了城市数据,它总是取得所有的数据,而不是城市数据的一个子集。&nbsp;<br>
<br>
一旦applet从CityDao.read()得到了城市数据的Vector,它即已做好了接受客户输入的准备。当用户选择了一个城市以后,applet将提示浏览器转向一个具有城市参数的URL,并且以XML形式返回该城市的酒店列表:<br>
<br>
 url = new URL(getCodeBase(), "../?cmd-get-hotels=1&amp;ctry-name=" + ctryName + "&amp;city-name=" + cityName);<br> 
 getAppletContext().showDocument(url);&nbsp;<br>
<br>
applet的AppletContext成员是applet所在的操作环境即浏览器的一个Java表示。 Java对浏览器的权限有着严格的限制(尤其是同JavaScript相比),但它确实拥有象要求浏览器转向一个新的URL这样的权限。 这就是showDocument()方法所做的。这样,在上述的代码中,applet并不关心实际的 application要做什么,它是可重用的。&nbsp;<br>
<br>
我们还要简单提一下 hotels-xml.jsp 。在前面Web-tier的讨论中,该JSP 动态地生成了一个代表 酒店提供商的 XML,它通过 HotelController放置到session中。由于该XML包含了纯数据(也就是说,它不包含与页面表达有关的信息),我们仍要有一个办法为XML加入表示信息,我们把下面这行加入到了 XML中:<br> 
<br> 
&lt;?xml:stylesheet type="text/xsl" href="hotels.xsl"?><br> 
<br> 
该行告诉XML客户端,hotels.xsl样式表将用来表示 XML数据。在我们的案例中,该XSL翻译结果 (XSLT)将是一个定义良好的HTML文档(图 8),例外的只是开始和结尾处的标记需要符合XML标准。将XML转换为HTML 似乎是目前XSLT最常用的功能。但别忘了还有别的功能,例如将 XML翻译为Wireless Markup Language (WML), Scalable Vector Graphics (SVG), MathML, 或者任何其它的基于 XML的标记语言。这样,如果要支持无线用户,只需要一个XSL样式表就可以将XML数据转换到WML了。这可是在互操作性方面的巨大收获!<br> 
<br> 
<img border="0" src="f7thumb.gif" width="201" height="101"></p>
<p>图7. Sequence Diagram for XML Broswer<br> 
<br> 
<br> 
<br> 
<br> 
要应用 Extensible Stylesheet Language (XSL) 样式来处理 XML,客户端必须具有一个 XSL处理器。当前,IE5是唯一可用的XSL处理器。虽然讨论XSL有些超出了本文讨论的范畴,我们还是要给出一些关于它的工作原理的内容。&nbsp;<br>
<br>
 XSL是用 XML定义的一种标记语言,它有一些带有一定格式的符号的标记,还有一些XML转换的标记。由于我们正进行 XML到HTML的转换,所以我们不使用 XSL的格式对象,而关注于 XSLT。<br> 
<br> 
 XSL样式的根元素是 &lt;xsl:stylesheet>。我们将 XSL namespace (在 www.w3.org/TR/WD-xsl)绑定到xsl: prefix,这通过xmlns:xsl 属性来实现,如下所示:<br> 
<br> 
<br> 
&lt;xsl:stylesheet xmlns:xsl=<br> 
   "http://www.w3.org/TR/WD-xsl"><br> 
<br> 
<br> 
XSLT是基于模板的设想的。你可以用它来定义模板的规则,这些规则可以将XML的结点映射到和表示有关的模板上。例如,在hotels.xsl中的一个模板规则为&lt;hotel>元素定义了一个HTML模板。它在定义时使用了 &lt;xsl:template>元素。下文的match元素的值表示这是的 XML 源文件的&lt;hotel>元素的模板规则。<br> 
<br> 
<br> 
&lt;xsl:template match="hotel"><br> 
&lt;tr><br> 
&lt;td>&lt;xsl:value-of select="@id"/>&lt;/td><br> 
&lt;td>&lt;xsl:value-of<br> 
   select="name"/>&lt;/td><br> 
&lt;td>&lt;xsl:value-of<br> 
   select="address/street"/>&lt;/td><br> 
&lt;td>&lt;xsl:value-of<br> 
   select="address/city"/>&lt;/td><br> 
&lt;td>&lt;xsl:value-of<br> 
   select="address/zip"/>&lt;/td><br> 
&lt;td>&lt;xsl:value-of<br> 
   select="address/country"/>&lt;/td><br> 
&lt;/tr><br> 
&lt;/xsl:template><br> 
<br> 
<br> 
<br> 
模板可以包含任意的HTML,只要它们不破坏XML的定义良好的性质。模板通常也包含XSL元素来执行转换工作。这里我们可以看到,当这个模板应用到&lt;hotel>元素时,它产生了一个HTML表的行,并且有6个列,第一列是 &lt;hotel>的id,第二列是&lt;name>子元素,第三列是&lt;hotel>元素的&lt;street>孙元素 ( &lt;address>的子元素),等等。这足以表明XSL转换的含义:我们使用了一个 XSL样式将XML文档转换到一个新的XML文档(在这里,是一个遵循XML规则的HTML文档)。 XSLT是相当灵活的 (但也并不是无限制的):它允许你重新排列元素、忽略部分元素,以及将它们映射到整个模板。<br> 
<br> 
hotel的模板规则告诉 XSL处理器当&lt;hotel>被选中的时候该做什么。但并不提示哪一个&lt;hotel>元素被选择了。要做到这一点,可以看一下源文档的根结点模板规则:&nbsp;<br>
&lt;xsl:template match="/"><br> 
<br> 
这是XSL处理器要执行的第一个模板规则,因为根结点是XSL处理器首先遇到的。 hotels.xsl中的根结点的模板包含了大量的HTML,甚至包含了和CSS的一个样式 (这是完全允许的)。我们再看一下模板中间的行:<br> 
<br> 
&lt;!-- Spacer --><br> 
&lt;tr>&lt;td colspan="4" height="6">&lt;/td>&lt;/tr><br> 
&lt;!-- Content --><br> 
&lt;xsl:apply-templates select="hotels"/><br> 
&lt;!-- Footer --> [etc.]<br> 
<br> 
<br> 
<br> 
&lt;xsl:apply-templates>元素表示在该点上XSL处理器必须开始执行&lt;hotels>模板规则(小心:和&lt;hotel>模板规则不同)。该点是值得重申的:模板规则可以援引其它的模板规则。其中的select属性允许XSL处理器探究是哪一个子结点引发了模板规则。由于select属性的值是"hotels",当前上下文的所有&lt;hotels>子结点都将被选中。这里,当前上下文结点是文档的根结点,这是因为与当前所选的模板匹配的是文档的根结点。我们的XML 数据只包含一个这样的子结点,即&lt;hotels>元素。如果我们看一下出现在根结点后面的&lt;hotels>模板规则,可以发现它构成了一个HTML表,而且在适当的位置为&lt;hotel>元素执行了模板规则:<br> 
<br> 
 &nbsp;<br>
&lt;table border="1"><br> 
   &lt;tr><br> 
      &lt;th>ID&lt;/th><br> 
      &lt;th>Name&lt;/th><br> 
      &lt;th>Street&lt;/th><br> 
      &lt;th>City&lt;/th><br> 
      &lt;th>Zip&lt;/th><br> 
      &lt;th>Country&lt;/th><br> 
   &lt;/tr><br> 
   &lt;xsl:apply-templates<br> 
         select="hotel"/><br> 
&lt;/table><br> 
<br> 
<br> 
<br> 
这引发了&lt;hotel>模板规则(就是产生一个表行&lt;hotel>元素的),并应用于当前上下文结点的每一个&lt;hotel>子结点,即&lt;hotels>元素,因为当前所选的模板是与&lt;hotels> 元素相匹配的。<br> 
<br> 
所有这些的结果是HTML文档,它以XSL样式所定义的外观将XML文档中的数据进行了表示。一旦浏览器的XSL处理器完成了转换工作,HTML文档即在客户端显示出来了。<br> 
<br> 
总结<br> 
<br> 
在本文中我们探讨了如何使用JSP来处理动态内容,使用XML来代替HTML是符合互操作性的一种方式,这样,我们可以为各种各样的的客户类型提供服务。<br> 
<br> 
<br> 
<img border="0" src="f8thumb.gif" width="201" height="229"><br>
图8. XSLT in Action</p> 
 
</body> 
 
</html> 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -