﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-Velocity空间-文章分类-Velocity</title><link>http://www.blogjava.net/kingwee/category/35136.html</link><description>快速构建JAVA应用</description><language>zh-cn</language><lastBuildDate>Wed, 29 Oct 2008 16:34:40 GMT</lastBuildDate><pubDate>Wed, 29 Oct 2008 16:34:40 GMT</pubDate><ttl>60</ttl><item><title>CHAPTER 14 在Turbine里使用Velocity</title><link>http://www.blogjava.net/kingwee/articles/237335.html</link><dc:creator>KINGWEE</dc:creator><author>KINGWEE</author><pubDate>Wed, 29 Oct 2008 03:12:00 GMT</pubDate><guid>http://www.blogjava.net/kingwee/articles/237335.html</guid><wfw:comment>http://www.blogjava.net/kingwee/comments/237335.html</wfw:comment><comments>http://www.blogjava.net/kingwee/articles/237335.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kingwee/comments/commentRss/237335.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kingwee/services/trackbacks/237335.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;如果你从事Web应用程序开发已经很久了，那么你可能已经意识到你正花费大量的时间在重新发明轮子。典型的任务包括数据库连接池、构建控件Servlets、书写导航菜单和设计众多的页面。重复使用在哪里？组件？还是框架？幸运的是，许多人已经认真思考过这个问题，并创建了一些Web开发者需要的工具。在这一章里，我们将介绍Turbine，它是一个试图把Web开发带入和传统软件开...&nbsp;&nbsp;<a href='http://www.blogjava.net/kingwee/articles/237335.html'>阅读全文</a><img src ="http://www.blogjava.net/kingwee/aggbug/237335.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kingwee/" target="_blank">KINGWEE</a> 2008-10-29 11:12 <a href="http://www.blogjava.net/kingwee/articles/237335.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>CHAPTER 13 Velocity和国际化</title><link>http://www.blogjava.net/kingwee/articles/236934.html</link><dc:creator>KINGWEE</dc:creator><author>KINGWEE</author><pubDate>Mon, 27 Oct 2008 10:46:00 GMT</pubDate><guid>http://www.blogjava.net/kingwee/articles/236934.html</guid><wfw:comment>http://www.blogjava.net/kingwee/comments/236934.html</wfw:comment><comments>http://www.blogjava.net/kingwee/articles/236934.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kingwee/comments/commentRss/236934.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kingwee/services/trackbacks/236934.html</trackback:ping><description><![CDATA[<div style="layout-grid:  15.6pt none">
<p style="text-align: left" align="left"><span style="font-family: 宋体">如果你正在构建一个世界级的</span><span style="font-family: Century-Book">Web</span><span style="font-family: 宋体">站点，你是否想过只支持美语或英语？当然不！世界上众多的站点都支持多种语言，当单击对应语言的链接时，直接进入该语言版本的站点。幸运的是，</span><span style="font-family: Century-Book">Java</span><span style="font-family: 宋体">自身的一些组件也提供了一些让站点支持国际化功能的方法。在这里，我们使用</span><span style="font-family: Century-Book">Velocity</span><span style="font-family: 宋体">的组件来轻松构建国际化站点。在这一章里，我们只简要介绍</span><span style="font-family: Century-Book">Java</span><span style="font-family: 宋体">组件，之后重点介绍</span><span style="font-family: Century-Book">chapter 12</span><span style="font-family: 宋体">里</span><span style="font-family: Century-Book">CD</span><span style="font-family: 宋体">收藏管理示例的</span><span style="font-family: Century-Book">Velocity</span><span style="font-family: 宋体">应用程序版本。</span></p>
<p style="text-align: left" align="left"><strong><span style="font-size: 15pt; font-family: Formata-Medium">Java</span></strong><strong><span style="font-size: 15pt; font-family: 宋体">国际化组件</span></strong></p>
<p style="text-align: left" align="left"><span style="font-family: 宋体">在这一章里，我们将调试一些可用于国际化的</span><span style="font-family: Century-Book">Java</span><span style="font-family: 宋体">组件。为了充分理解这个处理过程，请参考</span><span style="font-family: Century-Book"><a href="http://java.sun.com/docs/books/tutorial/i18n/">http://java.sun.com/docs/books/tutorial/i18n/</a></span><span style="font-family: 宋体">的</span><span style="font-family: Century-Book">Java</span><span style="font-family: 宋体">入门教程。在我们正式开始之前，让我们把注意力集中于构建一个可以使用英语和德语阅读的</span><span style="font-family: Century-Book">Web</span><span style="font-family: 宋体">应用。</span></p>
<p style="text-align: left" align="left"><span style="font-family: 宋体">或许最简便的方法就是为这两种语言构建两张页面。假定你已经有了一个名叫</span><span style="font-family: Century-Book">index.html</span><span style="font-family: 宋体">的原始的</span><span style="font-family: Century-Book">Web</span><span style="font-family: 宋体">页面。对于英语版本的，对应的位置为</span><span style="font-family: Century-Book">/en/index.html</span><span style="font-family: 宋体">下，在相同目录的德语版本为</span><span style="font-family: Century-Book">indexgerman.html</span><span style="font-family: 宋体">，当然，也可以为他们建立不同的目录，比如：英语版为</span><span style="font-family: Century-Book">/en/index.html</span><span style="font-family: 宋体">，德语版为</span><span style="font-family: Century-Book">/de/index.html</span><span style="font-family: 宋体">。</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">当然，构建两张或</span><span style="color: black; font-family: Century-Book">20</span><span style="color: black; font-family: 宋体">张页面来完全这两个语言版本的页面不是太难，只是浪费了一些时间而已。但如果是若干页面，同时有些页面需要进行改动该怎么办？现在有一种好方法来为这两种语言版本构建页面，那就是使用</span><span style="color: black; font-family: Century-Book">Java</span><span style="color: black; font-family: 宋体">、</span><span style="color: black; font-family: Century-Book">Servlets</span><span style="color: black; font-family: 宋体">以及</span><span style="color: black; font-family: Century-Book">Velocity</span><span style="color: black; font-family: 宋体">，这是最好的解决方案。</span></p>
<p style="text-align: left" align="left"><strong><span style="font-size: 13.5pt; color: black; font-family: Formata-Medium">Java</span></strong><strong><span style="font-size: 13.5pt; color: black; font-family: 宋体">本地类</span></strong></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: Century-Book">Java</span><span style="color: black; font-family: 宋体">本地（</span><span style="color: black; font-family: Century-Book">Locale</span><span style="color: black; font-family: 宋体">）类用于包罗其他的</span><span style="color: black; font-family: Century-Book">Java</span><span style="color: black; font-family: 宋体">类。这个本地（</span><span style="color: black; font-family: Century-Book">Locale</span><span style="color: black; font-family: 宋体">）对象被传递给一个类，这个类知道如何处理世界上不同的地理位置。通过传递两个参数来创建一个本地对象，这两个参数是：你想使用的语言和国家。这两个参数都使用只有</span><span style="color: black; font-family: Century-Book">2</span><span style="color: black; font-family: 宋体">个字符的缩写，比如：英语用</span><span style="color: black; font-family: Century-Book">en</span><span style="color: black; font-family: 宋体">，德语用</span><span style="color: black; font-family: Century-Book">de</span><span style="color: black; font-family: 宋体">。美国用</span><span style="color: black; font-family: Century-Book">US</span><span style="color: black; font-family: 宋体">，德国用</span><span style="color: black; font-family: Century-Book">DE</span><span style="color: black; font-family: 宋体">。</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">好，你现在可以用下面的代码来创建一个本地对象：</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">Locale location = new Locale('en', 'US');</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">你可以在</span><span style="color: black; font-family: Century-Book"><a href="http://www.ics.uci.edu/pub/ietf/http/related/iso639.txt">www.ics.uci.edu/pub/ietf/http/related/iso639.txt</a></span><span style="color: black; font-family: 宋体">里查询语言代码的完整列表。国家代码可以在</span><span style="color: black; font-family: Century-Book"><a href="http://www.chemie.fuberlin.de/diverse/doc/ISO_3166.html">www.chemie.fuberlin.de/diverse/doc/ISO_3166.html</a></span><span style="color: black; font-family: 宋体">里查询。</span></p>
<p style="text-align: left" align="left"><strong><span style="font-size: 13.5pt; color: black; font-family: 宋体">资源绑定（</span></strong><strong><span style="font-size: 13.5pt; color: black; font-family: Formata-Medium">Bundles</span></strong><strong><span style="font-size: 13.5pt; color: black; font-family: 宋体">）</span></strong></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">对</span><span style="color: black; font-family: Century-Book">Java</span><span style="color: black; font-family: 宋体">国际化来说，大量工作都集中在</span><span style="color: black; font-family: Century-Book">ResourceBundle</span><span style="color: black; font-family: 宋体">对象里。这个对象扮演了一个巨大的多维地图，让你提供一个关键字字符串和一个从</span><span style="color: black; font-family: Century-Book">Locale</span><span style="color: black; font-family: 宋体">对象返回的值给</span><span style="color: black; font-family: Century-Book">bundle</span><span style="color: black; font-family: 宋体">。</span><span style="color: black; font-family: Century-Book">ResourceBundle</span><span style="color: black; font-family: 宋体">对象依靠</span><em><span style="color: black; font-family: Century-BookItalic">properties files</span></em><em><span style="color: black; font-family: 宋体">（属性文件）</span></em><span style="color: black; font-family: 宋体">，该文件是一个文本文件，在其中定义了关键字和其关键值。在这里总是有一个名叫</span><span style="color: black; font-family: Century-Book">MessagesBundle.properties</span><span style="color: black; font-family: 宋体">的</span><span style="color: black; font-family: 宋体">默认属性文件。如果</span><span style="color: black; font-family: Century-Book">ResourceBundle</span><span style="color: black; font-family: 宋体">对象不能找到其他和所提供位置匹配的属性文件，那么，这个默认的属性文件（</span><span style="color: black; font-family: Century-Book">bundle</span><span style="color: black; font-family: 宋体">）将被使用。让我们首先来看一下，如何创建一个</span><span style="color: black; font-family: Century-Book">ResourceBundle</span><span style="color: black; font-family: 宋体">对象。</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">message = ResourceBundle.getBundle("MessagesBundle", location);</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: Century-Book">The statement instantiates a ResourceBundle object based on the property filename of MessagesBundle and the provided Locale object. If you are planning to code a Web application for English/U.S. and German/Germany locations, you need two additional properties files:</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">语句初始化一个基于</span><span style="color: black; font-family: Century-Book">MessagesBundle</span><span style="color: black; font-family: 宋体">的属性文件名和所提供的本地对象的</span><span style="color: black; font-family: Century-Book">ResourceBundle</span><span style="color: black; font-family: 宋体">对象，如果你计划用</span><span style="color: black; font-family: Century-Book">English/U.S.</span><span style="color: black; font-family: 宋体">和</span><span style="color: black; font-family: Century-Book">German/Germany</span><span style="color: black; font-family: 宋体">编写一个</span><span style="color: black; font-family: Century-Book">Web</span><span style="color: black; font-family: 宋体">应用，那么你需要两个附加的属性文件：</span></p>
<p style="text-align: left" align="left"><span style="font-size: 6pt; color: black; font-family: ZapfDingbats">■ </span><span style="color: black; font-family: Century-Book">MessagesBundle_en_US.properties</span></p>
<p style="text-align: left" align="left"><span style="font-size: 6pt; color: black; font-family: ZapfDingbats">■ </span><span style="color: black; font-family: Century-Book">MessagesBundle_de_DE.properties</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: Century-Book">ResourceBundle</span><span style="color: black; font-family: 宋体">对象主要负责选择属性文件。正如我们曾提及的一样，每一个属性文件包含了关键字和值对。比如：为了显示一个对用户的祝贺，你将在属性文件里包含如下的实体：</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">Greet = Hello</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">当然，你需要为默认情况包含适当的实体，即</span><span style="color: black; font-family: Century-Book">U.S.</span><span style="color: black; font-family: 宋体">和德语文件。之后，在当前</span><span style="color: black; font-family: Century-Book">Locale</span><span style="color: black; font-family: 宋体">对象中查询</span><span style="color: black; font-family: Century-Book">ResourceBundle</span><span style="color: black; font-family: 宋体">对象以返回关键字</span><span style="color: black; font-family: Century-Book">&#8220;Greet&#8221;</span><span style="color: black; font-family: 宋体">的值，比如：</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">String hello = messages.getString("Greet");</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">在这个代码里，适当的祝贺词被呈现给用户。现在，让我们看一如如何使用这些知识来构建一个国际化</span><span style="color: black; font-family: Century-Book">Web</span><span style="color: black; font-family: 宋体">站点。</span></p>
<p style="text-align: left" align="left"><strong><span style="font-size: 15pt; color: black; font-family: 宋体">一个国际化</span></strong><strong><span style="font-size: 15pt; color: black; font-family: Formata-Medium">CD Web</span></strong><strong><span style="font-size: 15pt; color: black; font-family: 宋体">应用</span></strong></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">在之间的章节里，我们创建了一个应用，以用于存储和找回</span><span style="color: black; font-family: Century-Book">CD</span><span style="color: black; font-family: 宋体">，以及他们的歌曲。和你回想的一样，应用显示了一个主</span><span style="color: black; font-family: Century-Book">Web</span><span style="color: black; font-family: 宋体">页面以用于输入</span><span style="color: black; font-family: Century-Book">CD</span><span style="color: black; font-family: 宋体">和歌曲，同时显示其对应的信息。这个程序使用的语言是英语。现在，我们准备对这个程序进行国际化修改。</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">现在让我们开始为这个主页面创建一个允许用户选择语言和国家的操作，见</span><span style="color: black; font-family: Century-Book">Listing 13.1</span><span style="color: black; font-family: 宋体">。显示结果见</span><span style="color: black; font-family: Century-Book">Figure 13.1</span><span style="color: black; font-family: 宋体">。</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">&lt;HTML&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">&lt;BODY&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">&lt;form action="http://localhost:8080/cd/cdIndex"&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">&lt;select name="country"&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">&lt;option value="US"&gt;US&lt;/option&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">&lt;option value="DE"&gt;DE&lt;/option&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">&lt;/select&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">&lt;BR&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">&lt;select name="language"&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">&lt;option value="en"&gt;us&lt;/option&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">&lt;option value="de"&gt;de&lt;/option&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">&lt;/select&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">&lt;input type="submit" value="submit"&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">&lt;/form&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">&lt;/BODY&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">&lt;/HTML&gt;</span></p>
<p><strong><span style="font-size: 9pt; color: black; font-family: Formata-Bold">Listing 13.1 </span></strong><span style="font-size: 9pt; color: black; font-family: Formata-Regular">The international.html file.</span></p>
<p style="text-align: left" align="left"><strong><span style="font-size: 9pt; font-family: Formata-Bold"><img height="178" alt="" src="http://www.blogjava.net/images/blogjava_net/kingwee/13-1.gif" width="343" border="0" /><br />
Figure 13.1 </span></strong><span style="font-size: 9pt; font-family: Formata-Regular">The language/country select page.</span></p>
<p style="text-align: left" align="left"><span style="font-family: 宋体">在</span><span style="font-family: Century-Book">Listing 13.1</span><span style="font-family: 宋体">里有两个重要的操作，第一在</span><span style="font-family: Century-Book">&lt;form&gt;</span><span style="font-family: 宋体">标记里。当用户单击</span><span style="font-family: Century-Book">submit</span><span style="font-family: 宋体">按钮里，他们将发送给一个名叫</span><span style="font-family: Century-Book">cdIindex</span><span style="font-family: 宋体">的新</span><span style="font-family: Century-Book">Servlets</span><span style="font-family: 宋体">。这个</span><span style="font-family: Century-Book">Servlets</span><span style="font-family: 宋体">主要负责为请求的语言获取用于显示的文本。同时也要注意国家和语言选择框。这个输入窗体被传递给</span><span style="font-family: Century-Book">cdIndex servlet</span><span style="font-family: 宋体">，以便让</span><span style="font-family: Century-Book">Servlets</span><span style="font-family: 宋体">知道当前需要的是哪个属性文件（即需要是什么语言版本）。</span></p>
<p style="text-align: left" align="left"><span style="font-family: 宋体">从</span><span style="font-family: Century-Book">cdIndex servlet</span><span style="font-family: 宋体">里输出的是一个用于显示输入信息和显示</span><span style="font-family: Century-Book">CD</span><span style="font-family: 宋体">的</span><span style="font-family: Century-Book">Velocity</span><span style="font-family: 宋体">模板。</span><span style="font-family: Century-Book">Listing 13.2</span><span style="font-family: 宋体">显示了这个模板的代码。</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; font-family: Courier">&lt;HTML&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; font-family: Courier">&lt;HEAD&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; font-family: Courier">&lt;TITLE&gt;&lt;/TITLE&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; font-family: Courier">&lt;link rel="stylesheet" type="text/css" href="default.css"&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; font-family: Courier">&lt;/HEAD&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; font-family: Courier">&lt;BODY BGCOLOR="#3A6BA5" link="ffffff" alink="999999" vlink="ffffff"&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; font-family: Courier">&lt;table border="1" &gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; font-family: Courier">&lt;tr&gt;&lt;td&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; font-family: Courier">$createstring&lt;BR&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; font-family: Courier">&lt;form action="http://localhost:8080/cd/cdVelocityHandler"</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; font-family: Courier">method="post"&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; font-family: Courier">&lt;table&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; font-family: Courier">&lt;tr&gt;&lt;td&gt;$title&lt;/td&gt;&lt;td&gt;&lt;input name="title"&gt;&lt;/td&gt;&lt;/tr&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; font-family: Courier">&lt;tr&gt;&lt;td&gt;$artist&lt;/td&gt;&lt;td&gt;&lt;input name="artist"&gt;&lt;/td&gt;&lt;/tr&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; font-family: Courier">&lt;tr&gt;&lt;td&gt;$tracks&lt;/td&gt;&lt;td&gt;&lt;input name="tracks"&gt;&lt;/td&gt;&lt;/tr&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; font-family: Courier">&lt;/table&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; font-family: Courier">&lt;input type="submit" name="submit" value="new"&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; font-family: Courier">&lt;/form&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; font-family: Courier">&lt;/td&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; font-family: Courier">&lt;td valign="top"&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; font-family: Courier">$displaystring&lt;BR&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; font-family: Courier">&lt;form action="http://localhost:8080/cd/cdVelocityHandler" <span style="color: black">method="post"&gt;</span></span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">&lt;table&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">&lt;tr&gt;&lt;td&gt;$artist&lt;/td&gt;&lt;td&gt;&lt;input name="artist"&gt;&lt;/td&gt;&lt;/tr&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">&lt;/table&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">&lt;input type="submit" name="submit" value="obtain"&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">&lt;/form&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">&lt;/td&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">&lt;/tr&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">&lt;tr&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">&lt;td valign="top"&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">$viewstring&lt;BR&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">&lt;form action="http://localhost:8080/cd/cdVelocityHandler" method="post"&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">&lt;table&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">&lt;tr&gt;&lt;td&gt;$ID&lt;/td&gt;&lt;td&gt;&lt;input name="id"&gt;&lt;/td&gt;&lt;/tr&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">&lt;/table&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">&lt;input type="submit" name="submit" value="tracks"&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">&lt;/form&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">&lt;/td&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">&lt;td valign="top"&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">$addstring&lt;BR&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">&lt;form action="http://localhost:8080/cd/cdVelocityHandler"</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">method="post"&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">&lt;table&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">&lt;tr&gt;&lt;td&gt;$ID&lt;/td&gt;&lt;td&gt;&lt;input name="id"&gt;&lt;/td&gt;&lt;/tr&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">&lt;tr&gt;&lt;td&gt;$name&lt;/td&gt;&lt;td&gt;&lt;input name="name"&gt;&lt;/td&gt;&lt;/tr&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">&lt;tr&gt;&lt;td&gt;$length&lt;/td&gt;&lt;td&gt;&lt;input name="length"&gt;&lt;/td&gt;&lt;/tr&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">&lt;/table&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">&lt;input type="submit" name="submit" value="addtrack"&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">&lt;/form&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">&lt;/td&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">&lt;/tr&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">&lt;/table&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">&lt;/BODY&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">&lt;/HTML&gt;</span></p>
<p style="text-align: left" align="left"><strong><span style="font-size: 9pt; color: black; font-family: Formata-Bold">Listing 13.2 </span></strong><span style="font-size: 9pt; color: black; font-family: Formata-Regular">The index.vm Velocity template. </span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">这个显示页面被划分为四个任务。每一个任务显示一个指示和几个字段。所有在页面上的文本显示被转换到</span><span style="color: black; font-family: Century-Book">Velocity</span><span style="color: black; font-family: 宋体">引用。这些</span><span style="color: black; font-family: Century-Book">Velocity</span><span style="color: black; font-family: 宋体">引用被</span><span style="color: black; font-family: Century-Book">cdIndex servlet</span><span style="color: black; font-family: 宋体">进行填充，见</span><span style="color: black; font-family: Century-Book">Listing 13.3</span><span style="color: black; font-family: 宋体">。</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">import java.io.*;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">import java.util.*;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">import javax.servlet.*;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">import javax.servlet.http.*;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">import org.apache.velocity.Template;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">import org.apache.velocity.context.Context;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">import org.apache.velocity.servlet.VelocityServlet;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">import org.apache.velocity.exception.*;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">import javax.naming.*;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">import javax.ejb.*;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">import cd.*;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">import org.apache.velocity.app.Velocity;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">public class cdIndex extends VelocityServlet {</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">protected Properties loadConfiguration(ServletConfig config )</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">throws IOException, FileNotFoundException</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">{</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">Properties p = new Properties();</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">String path = config.getServletContext().getRealPath("/");</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">if (path == null) {</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">System.out.println(</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">" SampleServlet.loadConfiguration() : unable to "</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">+ "get the current webapp root. Using '/'. Please fix.");</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">path = "/";</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">}</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">p.setProperty( Velocity.FILE_RESOURCE_LOADER_PATH, path );</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">return p;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">}</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">public Template handleRequest( HttpServletRequest req,</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">HttpServletResponse res, Context context ) {</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">Template template = null;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">String country = req.getParameter("country");</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">String language = req.getParameter("language");</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">Locale currentLocale = new Locale(language, country);</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">ResourceBundle messages =</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">ResourceBundle.getBundle("MessagesBundle", currentLocale);</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">context.put("title", messages.getString("title"));</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">context.put("artist", messages.getString("artist"));</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">context.put("ID", messages.getString("ID"));</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">context.put("name", messages.getString("name"));</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">context.put("length", messages.getString("length"));</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">context.put("tracks", messages.getString("tracks"));</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">context.put("createstring", messages.getString("createstring"));</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">context.put("displaystring", messages.getString("displaystring"));</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">context.put("viewstring", messages.getString("viewstring"));</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">context.put("addstring", messages.getString("addstring"));</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">try {</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">template = getTemplate("index.vm");</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">} catch( Exception e ) {</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">e.printStackTrace();</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">}</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">return template;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">}</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">}</span></p>
<p style="text-align: left" align="left"><strong><span style="font-size: 9pt; color: black; font-family: Formata-Bold">Listing 13.3 </span></strong><span style="font-size: 9pt; color: black; font-family: Formata-Regular">cdIndex.java. </span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: Century-Book">cdIndex servlet</span><span style="color: black; font-family: 宋体">有两个任务：第一，当被用户调用时，用于从</span><span style="color: black; font-family: Century-Book">&lt;form&gt;</span><span style="color: black; font-family: 宋体">获取语言和国家信息，同时利用这些信息来构建一个</span><span style="color: black; font-family: Century-Book">Locale</span><span style="color: black; font-family: 宋体">对象。这个</span><span style="color: black; font-family: Century-Book">Locale</span><span style="color: black; font-family: 宋体">对象被用于获取一个</span><span style="color: black; font-family: Century-Book">ResourceBundle</span><span style="color: black; font-family: 宋体">对象。依靠语言和国家的选择，这个</span><span style="color: black; font-family: Century-Book">ResourceBundle</span><span style="color: black; font-family: 宋体">要么选择默认的属性文件（</span><span style="color: black; font-family: Century-Book">U.S.</span><span style="color: black; font-family: 宋体">文件，见</span><span style="color: black; font-family: Century-Book">Listings 13.4</span><span style="color: black; font-family: 宋体">），要么选择德语（</span><span style="color: black; font-family: Century-Book">German</span><span style="color: black; font-family: 宋体">）文件（</span><span style="color: black; font-family: Century-Book">Listings 13. 6</span><span style="color: black; font-family: 宋体">）。这些文件都拥有相同的目录。</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">第二个任务对</span><span style="color: black; font-family: Century-Book">Servlets</span><span style="color: black; font-family: 宋体">来说或许是最为重要的任务，它主要负责向上下文中填充适当的应用或他们的值。你可以在代码看到，每一个引用连同其对应的值（通过使用</span><span style="color: black; font-family: Century-Book">messages.getString(String)</span><span style="color: black; font-family: 宋体">方法调用）一起被加入到上下文中。最后的结果是所有</span><span style="color: black; font-family: Century-Book">cdIndex &nbsp;Velocity</span><span style="color: black; font-family: 宋体">模板需要引用被填充到上下文中。</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">当用户选择</span><span style="color: black; font-family: Century-Book">US</span><span style="color: black; font-family: 宋体">时，显示结果见</span><span style="color: black; font-family: Century-Book">Figure 13.2</span><span style="color: black; font-family: 宋体">。如果选择的是</span><span style="color: black; font-family: Century-Book">German</span><span style="color: black; font-family: 宋体">，显示结果见</span><span style="color: black; font-family: Century-Book">Figure 13.3</span><span style="color: black; font-family: 宋体">。正如你所见的一样，为你的应用增加国际化支持是一件非常轻松的事。比如，现在需要增加西班牙语支持，只需在</span><span style="color: black; font-family: Century-Book">HTML</span><span style="color: black; font-family: 宋体">选择里包含适当的标识符，并创建适当的属性文件即可。</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">title = Title:</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">artist = Artist:</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">ID = ID:</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">name = Name:</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">length = Length:</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">tracks = Tracks:</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">createstring = To Create a New CD:</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">displaystring = To display CDs for an Artist</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">viewstring = To see all Tracks for a CD</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">addstring = To add a new track</span></p>
<p><strong><span style="font-size: 9pt; color: black; font-family: Formata-Bold">Listing 13.4 </span></strong><span style="font-size: 9pt; color: black; font-family: Formata-Regular">MessagesBundle.properties.</span></p>
<p style="text-align: left" align="left"><strong><span style="font-size: 9pt; font-family: Formata-Bold"><img height="362" alt="" src="http://www.blogjava.net/images/blogjava_net/kingwee/13-2.gif" width="335" border="0" /><br />
Figure 13.2 </span></strong><span style="font-size: 9pt; font-family: Formata-Regular">The U.S. display page.</span></p>
<p><strong><span style="font-size: 9pt; font-family: Formata-Bold"><img height="365" alt="" src="http://www.blogjava.net/images/blogjava_net/kingwee/13-3.gif" width="459" border="0" /><br />
Figure 13.3 </span></strong><span style="font-size: 9pt; font-family: Formata-Regular">The German display page.</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; font-family: Courier">title = Title:</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; font-family: Courier">artist = Artist:</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; font-family: Courier">ID = ID:</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; font-family: Courier">name = Name:</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; font-family: Courier">length = Length:</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; font-family: Courier">tracks = Tracks:</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; font-family: Courier">createstring = To Create a New CD:</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; font-family: Courier">displaystring = To display CDs for an Artist</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; font-family: Courier">viewstring = To see all Tracks for a CD</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; font-family: Courier">addstring = To add a new track</span></p>
<p style="text-align: left" align="left"><strong><span style="font-size: 9pt; font-family: Formata-Bold">Listing 13.5 </span></strong><span style="font-size: 9pt; font-family: Formata-Regular">MessagesBundle_en_US.properties.</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; font-family: Courier">title = Titel</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; font-family: Courier">artist = K&#244;nstler</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; font-family: Courier">ID = IDENTIFIZIERUNG</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; font-family: Courier">name = Name</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; font-family: Courier">length = L?nge</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; font-family: Courier">tracks = Spuren</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; font-family: Courier">createstring = Um eine neue CD zu schaffen</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; font-family: Courier">displaystring = Um CDS f&#244;r einen K&#244;nstler darzustellen</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; font-family: Courier">viewstring = Um CD Spuren anzusehen</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; font-family: Courier">addstring = Um Spuren hinzuzuf&#244;gen</span></p>
<p style="text-align: left" align="left"><strong><span style="font-size: 9pt; font-family: Formata-Bold">Listing 13.6 </span></strong><span style="font-size: 9pt; font-family: Formata-Regular">MessagesBundle_de_DE.properties.</span></p>
<p style="text-align: left" align="left"><strong><span style="font-size: 15pt; font-family: 宋体">本章小结和下章介绍</span></strong></p>
<p style="text-align: left" align="left"><span style="font-family: 宋体">在这一章里，我们显示了如何在</span><span style="font-family: Century-Book">Velocity</span><span style="font-family: 宋体">中联合</span><span style="font-family: Century-Book">Java</span><span style="font-family: 宋体">的国际化特性来构建一个世界级的</span><span style="font-family: Century-Book">Web</span><span style="font-family: 宋体">站点，让你的用户能够获得多种语言的支持。在下一章里，我们将研究在</span><span style="font-family: Century-Book">Turbine</span><span style="font-family: 宋体">里使用</span><span style="font-family: Century-Book">Velocity</span><span style="font-family: 宋体">，</span><span style="font-family: Century-Book">Turbine</span><span style="font-family: 宋体">是一个应用程序框架，它提供了一个让你构建企业级应用的工具。</span></p>
</div>
<img src ="http://www.blogjava.net/kingwee/aggbug/236934.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kingwee/" target="_blank">KINGWEE</a> 2008-10-27 18:46 <a href="http://www.blogjava.net/kingwee/articles/236934.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>CHATPER 12 在Servlets里使用 Velocity </title><link>http://www.blogjava.net/kingwee/articles/236440.html</link><dc:creator>KINGWEE</dc:creator><author>KINGWEE</author><pubDate>Fri, 24 Oct 2008 08:35:00 GMT</pubDate><guid>http://www.blogjava.net/kingwee/articles/236440.html</guid><wfw:comment>http://www.blogjava.net/kingwee/comments/236440.html</wfw:comment><comments>http://www.blogjava.net/kingwee/articles/236440.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kingwee/comments/commentRss/236440.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kingwee/services/trackbacks/236440.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;通过前面章节的学习，我们了解到Velocity主要用作MVC框架View组件的脚本语言。Servlets是Java下MVC框架里用得最多的编程方式。通过把Servlets用作控制器（controller），Velocity用作显示层（View），把Servlets或JavaBeans作用模型（model），这样就创建了一个理想的Web开发全面解决方案。在这一章里，我们将学习如何在S...&nbsp;&nbsp;<a href='http://www.blogjava.net/kingwee/articles/236440.html'>阅读全文</a><img src ="http://www.blogjava.net/kingwee/aggbug/236440.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kingwee/" target="_blank">KINGWEE</a> 2008-10-24 16:35 <a href="http://www.blogjava.net/kingwee/articles/236440.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>CHAPTER 11 Velocity、XML和 Anakia</title><link>http://www.blogjava.net/kingwee/articles/235995.html</link><dc:creator>KINGWEE</dc:creator><author>KINGWEE</author><pubDate>Wed, 22 Oct 2008 09:53:00 GMT</pubDate><guid>http://www.blogjava.net/kingwee/articles/235995.html</guid><wfw:comment>http://www.blogjava.net/kingwee/comments/235995.html</wfw:comment><comments>http://www.blogjava.net/kingwee/articles/235995.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kingwee/comments/commentRss/235995.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kingwee/services/trackbacks/235995.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 可扩展标记语言（XML）是过去几年里谈论得最多的技术。刚开始的时候，这个技术的潜能可能被夸大了。但不要怀疑它基于文本格式来表现数据的能力。在这一章里，我们将着眼于两个XML主题，以及考虑这两个主题是如何涉及到Velocity的：从Velocity模板里的DOM对象访问XML数据和使用Anakia来处理XML数据转换。在Velocity模板里访问XML你大概知道，Sun正努力为Java开发者...&nbsp;&nbsp;<a href='http://www.blogjava.net/kingwee/articles/235995.html'>阅读全文</a><img src ="http://www.blogjava.net/kingwee/aggbug/235995.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kingwee/" target="_blank">KINGWEE</a> 2008-10-22 17:53 <a href="http://www.blogjava.net/kingwee/articles/235995.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>CHAPTER 10 Velocity的控制讨论</title><link>http://www.blogjava.net/kingwee/articles/235622.html</link><dc:creator>KINGWEE</dc:creator><author>KINGWEE</author><pubDate>Tue, 21 Oct 2008 03:37:00 GMT</pubDate><guid>http://www.blogjava.net/kingwee/articles/235622.html</guid><wfw:comment>http://www.blogjava.net/kingwee/comments/235622.html</wfw:comment><comments>http://www.blogjava.net/kingwee/articles/235622.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kingwee/comments/commentRss/235622.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kingwee/services/trackbacks/235622.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 在之前的章节里，我们讨论了Velocity模板语言的核心组件和Velocity上下文在模板处理中扮演的角色。这些章节提供了设计需要的相关信息和基于模板的应用程序实现。许多附加的Velocity特性让你真正能够获得模板处理的控制权。在这一章里，我们将介绍这些特性，包含运行时配置、事件、空白符（whitespace）管理和上下文链（chaining）。初始化运行时配置在Chapter 9讨论V...&nbsp;&nbsp;<a href='http://www.blogjava.net/kingwee/articles/235622.html'>阅读全文</a><img src ="http://www.blogjava.net/kingwee/aggbug/235622.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kingwee/" target="_blank">KINGWEE</a> 2008-10-21 11:37 <a href="http://www.blogjava.net/kingwee/articles/235622.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>CHAPTER 9 Velocimacros</title><link>http://www.blogjava.net/kingwee/articles/235339.html</link><dc:creator>KINGWEE</dc:creator><author>KINGWEE</author><pubDate>Sun, 19 Oct 2008 13:28:00 GMT</pubDate><guid>http://www.blogjava.net/kingwee/articles/235339.html</guid><wfw:comment>http://www.blogjava.net/kingwee/comments/235339.html</wfw:comment><comments>http://www.blogjava.net/kingwee/articles/235339.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kingwee/comments/commentRss/235339.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kingwee/services/trackbacks/235339.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;在之前的章节里，我们讨论了所有Velocity的指令，包括#macro指令。然而，我们只是简要介绍了#macro指令。在这里，我们将重新讨论#macro指令（也可以称为Velocimacros）。我们将讨论参数传递、宏库、运行时配置和其他与Velocimacros相关的主题。参数传递Argument Passing当我们在Chapter 8里介绍#macro指令时，我们展示...&nbsp;&nbsp;<a href='http://www.blogjava.net/kingwee/articles/235339.html'>阅读全文</a><img src ="http://www.blogjava.net/kingwee/aggbug/235339.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kingwee/" target="_blank">KINGWEE</a> 2008-10-19 21:28 <a href="http://www.blogjava.net/kingwee/articles/235339.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>CHAPTER 8 使用指令</title><link>http://www.blogjava.net/kingwee/articles/235249.html</link><dc:creator>KINGWEE</dc:creator><author>KINGWEE</author><pubDate>Sat, 18 Oct 2008 15:54:00 GMT</pubDate><guid>http://www.blogjava.net/kingwee/articles/235249.html</guid><wfw:comment>http://www.blogjava.net/kingwee/comments/235249.html</wfw:comment><comments>http://www.blogjava.net/kingwee/articles/235249.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kingwee/comments/commentRss/235249.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kingwee/services/trackbacks/235249.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 在前面的章节里，我们明确了引用在Velocity模板里的角色。除了讨论如何直接通过变量和属性引用获取值之外，我们也介绍了方法引用，方法引用允许模板设计者通过定制的Java方法引用上下文对象操作和访问数据。方法引用提供在窗体里返回字符串的能力。虽然这些功能能够充分支持任何模板处理需要做的事情，但Velocity仍然为大家带来了模板语言，模板语言为许多通用任务提供了捷径。这就是Velocity指令表演...&nbsp;&nbsp;<a href='http://www.blogjava.net/kingwee/articles/235249.html'>阅读全文</a><img src ="http://www.blogjava.net/kingwee/aggbug/235249.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kingwee/" target="_blank">KINGWEE</a> 2008-10-18 23:54 <a href="http://www.blogjava.net/kingwee/articles/235249.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>CHAPTER 7 References引用探索</title><link>http://www.blogjava.net/kingwee/articles/234830.html</link><dc:creator>KINGWEE</dc:creator><author>KINGWEE</author><pubDate>Fri, 17 Oct 2008 02:12:00 GMT</pubDate><guid>http://www.blogjava.net/kingwee/articles/234830.html</guid><wfw:comment>http://www.blogjava.net/kingwee/comments/234830.html</wfw:comment><comments>http://www.blogjava.net/kingwee/articles/234830.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kingwee/comments/commentRss/234830.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kingwee/services/trackbacks/234830.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;在之前的章节里，我们对Velocity引用进行了简要的介绍，甚至在示例里使用了部分引用。然而，再三延缓讨论引用的目的是为了让学习曲线更平缓、易学。既然你已经了解Velocity是什么和了解一个基本的应用程序是如何工作的，那么就让我们开始仔细学习Velocity引用吧！只有相当熟悉地掌握了Velocity引用，才能为你学习和掌握Velocity提供强大的动力!引用类型正如我们...&nbsp;&nbsp;<a href='http://www.blogjava.net/kingwee/articles/234830.html'>阅读全文</a><img src ="http://www.blogjava.net/kingwee/aggbug/234830.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kingwee/" target="_blank">KINGWEE</a> 2008-10-17 10:12 <a href="http://www.blogjava.net/kingwee/articles/234830.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>CHAPTER 6 理解模板和上下文</title><link>http://www.blogjava.net/kingwee/articles/234140.html</link><dc:creator>KINGWEE</dc:creator><author>KINGWEE</author><pubDate>Tue, 14 Oct 2008 00:52:00 GMT</pubDate><guid>http://www.blogjava.net/kingwee/articles/234140.html</guid><wfw:comment>http://www.blogjava.net/kingwee/comments/234140.html</wfw:comment><comments>http://www.blogjava.net/kingwee/articles/234140.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kingwee/comments/commentRss/234140.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kingwee/services/trackbacks/234140.html</trackback:ping><description><![CDATA[<div style="layout-grid:  15.6pt none"><span style="color: black; font-family: 宋体">
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">在之前的章节里，我们介绍了</span><span style="color: black; font-family: Century-Book">Velocity</span><span style="color: black; font-family: 宋体">和</span><span style="color: black; font-family: Century-Book">Hello World </span><span style="color: black; font-family: 宋体">示例，并从中看到了</span><span style="color: black; font-family: Century-Book">Velocity</span><span style="color: black; font-family: 宋体">的一些简单应用，是时候学习</span><span style="color: black; font-family: Century-Book">Velocity</span><span style="color: black; font-family: 宋体">核心组件了。本章将深入学习模板和上下文。后续章节将在本章知识的基础上，详细讨论</span><span style="color: black; font-family: Century-Book">Velocity</span><span style="color: black; font-family: 宋体">的引用、指令和宏。</span></p>
<p style="text-align: left" align="left"><strong><span style="font-size: 15pt; color: black; font-family: 宋体">使用模板</span></strong></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: Century-Book">Velocity</span><span style="color: black; font-family: 宋体">是一个模板引擎，使用</span><span style="color: black; font-family: Century-Book">Velocity</span><span style="color: black; font-family: 宋体">进行开发将是一件非常愉快的事。但是如何来制作模板呢？</span><span style="color: black; font-family: Century-Book">Velocity</span><span style="color: black; font-family: 宋体">的模板定义和许多领域使用的模板概念相似，比如许多文本处理包为通用文档提供了文档处理的预定义包，如</span><span style="color: black; font-family: Century-Book">office</span><span style="color: black; font-family: 宋体">备忘录等，这些都与</span><span style="color: black; font-family: Century-Book">Velocity</span><span style="color: black; font-family: 宋体">模板的概念相当接近。</span><span style="color: black; font-family: Century-Book">Velocity</span><span style="color: black; font-family: 宋体">俱乐部应用程序窗体（详见</span><span style="color: black; font-family: Century-Book">Figure 6.1</span><span style="color: black; font-family: 宋体">）是常规模板的另一个例子。</span></p>
<p style="text-align: left" align="left"><strong><span style="font-size: 9pt; font-family: Formata-Bold"><img height="336" alt="" src="http://www.blogjava.net/images/blogjava_net/kingwee/61.gif" width="553" border="0" /><br />
Figure 6.1 </span></strong><span style="font-size: 9pt; font-family: Formata-Regular">An example of a general template.</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: Century-Book">Velocity</span><span style="color: black; font-family: 宋体">俱乐部应用程序的内容包含了两个部分的内容：静态内容和动态内容。静态内容由标题、标签（如：</span><span style="color: black; font-family: Century-Book">First Name:</span><span style="color: black; font-family: 宋体">，</span><span style="color: black; font-family: Century-Book"> Last Name: </span><span style="color: black; font-family: 宋体">等）、问题和全部的布局等组成；动态内容就是表单中的下划线部分，用于申请人填写个人信息。</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">普通模板定义（如</span><span style="color: black; font-family: Century-Book">Velocity</span><span style="color: black; font-family: 宋体">俱乐部应用程序的模板）和真实的</span><span style="color: black; font-family: Century-Book">Velocity</span><span style="color: black; font-family: 宋体">模板最大的不同之处在于，</span><span style="color: black; font-family: Century-Book">Velocity</span><span style="color: black; font-family: 宋体">的动态内容是指定的。当应用程序窗体依赖于插入空白部分的动态内容时，</span><span style="color: black; font-family: Century-Book">Velocity</span><span style="color: black; font-family: 宋体">使用了引用的概念。现在，你可以简单想一下，</span><span style="color: black; font-family: Century-Book">Velocity</span><span style="color: black; font-family: 宋体">引用就好比某种实体引用了一个存储在别处的值。比如，基于</span><span style="color: black; font-family: Century-Book">Velocity</span><span style="color: black; font-family: 宋体">引用的基本语法，一个模板或许包含了一个名叫</span><span style="color: black; font-family: Century-Book">$name</span><span style="color: black; font-family: 宋体">的实体和字符串&#8220;</span><span style="color: black; font-family: Century-Book">John Doe</span><span style="color: black; font-family: 宋体">&#8221;对应，该字符串一般存储在模板外的某个地方（如数据库）。如果你对这个含糊的定义有些困惑的话，请不要太担心，我们将在下章详细讨论引用的细节，重要的是要紧记</span><span style="color: black; font-family: Century-Book">Velocity</span><span style="color: black; font-family: 宋体">引用从本质上来讲是作为模板中动态内容的占位符。如果你想把这个俱乐部应用程序转换成</span><span style="color: black; font-family: Century-Book">Velocity</span><span style="color: black; font-family: 宋体">模板，只需要把那些空白部分替换成适当的</span><span style="color: black; font-family: Century-Book">Velocity</span><span style="color: black; font-family: 宋体">引用就行。如何制定一个适当的</span><span style="color: black; font-family: Century-Book">Velocity</span><span style="color: black; font-family: 宋体">引用定义？首先定义要符合</span><span style="color: black; font-family: Century-Book">Velocity</span><span style="color: black; font-family: 宋体">引用语法，其次是设计者和编程人员要对模板引用的名称进行约定。一种可能的模式实现详见</span><span style="color: black; font-family: Century-Book">Listing 6.1</span><span style="color: black; font-family: 宋体">。</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; font-family: Courier">CLUB VELOCITY APPLICATION</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; font-family: Courier">First Name: $firstName</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; font-family: Courier">Last Name: $lastName</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; font-family: Courier">Address: $streetAddress</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; font-family: Courier">City: $city State: $state Zip: $zip</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; font-family: Courier">Phone Number: $phoneNumber</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; font-family: Courier">Email Address: $emailAddress</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; font-family: Courier">Occupation: $occupation</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; font-family: Courier">Other Interests: $otherInterests</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; font-family: Courier">Is this a new membership request or a renewal? $appType</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; font-family: Courier">How long have you been using Velocity? $useTime</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; font-family: Courier">Do you use Velocity for work or play? $useType</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; font-family: Courier">Do you want to receive our newsletter? $wantNewsletter</span></p>
<p style="text-align: left" align="left"><strong><span style="font-size: 9pt; color: black; font-family: Formata-Bold">Listing 6.1 </span></strong><span style="font-size: 9pt; color: black; font-family: Formata-Regular">The club application form after conversion to a Velocity template.</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">正如你所看见的一样，</span><span style="color: black; font-family: Century-Book">Velocity</span><span style="color: black; font-family: 宋体">模板从本质上讲，和应用程序原来的窗体是相同的，除了空白地方被</span><span style="color: black; font-family: Century-Book">Velocity</span><span style="color: black; font-family: 宋体">引用替换外。下面我们先假定引用的值分别如下：</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">$firstName =&gt; "John"</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">$lastName =&gt; "Doe"</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">$streetAddress =&gt; "123 Jane Ave. "</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">$city =&gt; "Azusa"</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">$state =&gt; "CA"</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">$zip =&gt; "91702"</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">$phoneNumber =&gt; "626-555-1234"</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">$emailAddress =&gt; "john@nodom.com"</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">$occupation =&gt; "Web Developer"</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">$otherInterests =&gt; "Hiking,Biking"</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">$appType =&gt; "New"</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">$useTime =&gt; "6 months"</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">$useType =&gt; "Work"</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">$wantNewsletter =&gt; "Yes"</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">那么输出结果为（</span><span style="color: black; font-family: Century-Book">Listing 6.2</span><span style="color: black; font-family: 宋体">）：</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; font-family: Courier">CLUB VELOCITY APPLICATION</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; font-family: Courier">First Name: John</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; font-family: Courier">Last Name: Doe</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; font-family: Courier">Address: 123 Jane Ave.</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; font-family: Courier">City: Azusa State: CA Zip: 91702</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; font-family: Courier">Phone Number: 626-555-1234</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; font-family: Courier">Email Address: john@nodom.com</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; font-family: Courier">Occupation: Web Developer</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; font-family: Courier">Other Interests: Hiking,Biking</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; font-family: Courier">Is this a new membership request or a renewal? New</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; font-family: Courier">How long have you been using Velocity? 6 months</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; font-family: Courier">Do you use Velocity for work or play? Work</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; font-family: Courier">Do you want to receive our newsletter? Yes</span></p>
<p style="text-align: left" align="left"><strong><span style="font-size: 9pt; color: black; font-family: Formata-Bold">Listing 6.2 </span></strong><span style="font-size: 9pt; color: black; font-family: Formata-Regular">Sample output for the Velocity template version of the club application form.</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">现在，你已经明白了如何从模板输出内容，让我们快速考虑一下在处理过程中如何防止模板的部分内容被输出。具有这样的处理能力不仅对你有用，对你的同事也有使用，一句注解或几句模板代码的说明能让你在阅读代码时更易理解你当时设计代码的意图。另外，也具有在调试</span><span style="color: black; font-family: Century-Book">session</span><span style="color: black; font-family: 宋体">期间选择性地让部分模板内容停止输出的能力，有时还需要明确地停止</span><span style="color: black; font-family: Century-Book">Velocity</span><span style="color: black; font-family: 宋体">的默认处理行为。</span><span style="color: black; font-family: Century-Book">Velocity</span><span style="color: black; font-family: 宋体">支持模板注释机制提供了这种能力，它包括块注释和单行注释。块注释由</span><span style="color: black; font-family: Century-Book">#*</span><span style="color: black; font-family: 宋体">开始，到</span><span style="color: black; font-family: Century-Book"> *#</span><span style="color: black; font-family: 宋体">结束，所有在它们之间的内容将被模板引擎丢弃。单行注释由两个</span><span style="color: black; font-family: Century-Book">##</span><span style="color: black; font-family: 宋体">开始的。</span><span style="color: black; font-family: Century-Book">Listing 6.3</span><span style="color: black; font-family: 宋体">提供了一些模板注释示例。</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">之前的内容描述了</span><span style="color: black; font-family: Century-Book">Velocity</span><span style="color: black; font-family: 宋体">的概貌，但我们忽视了几个重要的主题。首先，这将意味着</span><span style="color: black; font-family: Century-Book">Velocity</span><span style="color: black; font-family: 宋体">引用比我们目前透露的还要多。此外，</span><span style="color: black; font-family: Century-Book">Velocity</span><span style="color: black; font-family: 宋体">还提供了许多可直接控制模板内容的指令和宏。指令提供了流控制、文件包含和引用处理功能；宏为模板代码提供了一个强大的可再使用机制。我们将在随后的章节里讨论这些主题。</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">#*</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">This is a block comment. It is being used to point out</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">that this listing is intended to demonstrate the use of</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">comments in Velocity templates.</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">*#</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">##This line is not rendered.</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">This part is rendered,## but this part is not.</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">If only the #*middle*# bit needs to be commented out, a</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">block comment will do the job.</span></p>
<p style="text-align: left" align="left"><strong><span style="font-size: 9pt; color: black; font-family: Formata-Bold">Listing 6.3 </span></strong><span style="font-size: 9pt; color: black; font-family: Formata-Regular">Velocity comment examples.</span></p>
<p style="text-align: left" align="left"><strong><span style="font-size: 15pt; color: black; font-family: 宋体">上下文</span></strong></p>
<p style="margin-left: 5.25pt; text-indent: -5.25pt; text-align: left" align="left"><span style="color: black; font-family: 宋体">在前面的部分，我们为应用程序模板里的引用指定了字符串。然而，我们曾经提到过把</span><span style="color: black; font-family: Century-Book">Velocity</span><span style="color: black; font-family: 宋体">引用和字符串值绑定在一起的机制，这就是</span><span style="color: black; font-family: Century-Book">Velocity</span><span style="color: black; font-family: 宋体">上下文的概念。上下文在应用程序端表现为通过在</span><span style="color: black; font-family: Century-Book">org.apache.velocity.context</span><span style="color: black; font-family: 宋体">中定义的上下文接口。上下文通过关键字映射存储的对象。上下文只存储</span><span style="color: black; font-family: Century-Book">java.lang.Object</span><span style="color: black; font-family: 宋体">类型的对象，该对象的关键字类型为</span><span style="color: black; font-family: Century-Book">java.lang.String</span><span style="color: black; font-family: 宋体">。</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">引用除了具有</span><span style="color: black; font-family: Century-Book">$</span><span style="color: black; font-family: 宋体">前缀外，用于关键字的字符串值和用于引用名称的值必须相同。例如，字符串值</span><span style="color: black; font-family: Century-Book">"John"</span><span style="color: black; font-family: 宋体">在上下文里对应关键字</span><span style="color: black; font-family: Century-Book">firstName</span><span style="color: black; font-family: 宋体">，模板将通过引用</span><span style="color: black; font-family: Century-Book">$firstName</span><span style="color: black; font-family: 宋体">访问字符串值</span><span style="color: black; font-family: Century-Book">"John"</span><span style="color: black; font-family: 宋体">。大体上，模板的动态内容通过关键字在上下文中查找内容来指定。</span><span style="color: black; font-family: Century-Book">$</span><span style="color: black; font-family: 宋体">前缀让模板引擎知道</span><span style="color: black; font-family: Century-Book">$</span><span style="color: black; font-family: 宋体">后的文本就是上下文中关键字的名称。</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: Century-Book">Velocity</span><span style="color: black; font-family: 宋体">上下文和对象进行组装有三条途径。首先，</span><span style="color: black; font-family: Century-Book">Velocity</span><span style="color: black; font-family: 宋体">自身可以向上下文中插入有效的值，比如使用</span><span style="color: black; font-family: Century-Book">#foreach</span><span style="color: black; font-family: 宋体">指令进行反复计算。第二，</span><span style="color: black; font-family: Century-Book">#set</span><span style="color: black; font-family: 宋体">指令允许模板向上下文中直接插入值。最后，更为重要的是，</span><span style="color: black; font-family: Century-Book">Velocity</span><span style="color: black; font-family: 宋体">上下文接口允许编程人员使用双方约定的关键字名称，利用设计人员需要的数据来组装上下文。</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">我们只讲解最后一种情况。</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">在一个典型的应用程序里，上下文表现为一个</span><span style="color: black; font-family: Century-Book">org.apache.velocity.VelocityContext</span><span style="color: black; font-family: 宋体">的实例，它实现了上下文接口。上下文实例存储了对象</span><span style="color: black; font-family: Century-Book">"John" </span><span style="color: black; font-family: 宋体">和</span><span style="color: black; font-family: Century-Book"> "Doe"</span><span style="color: black; font-family: 宋体">，对应关键字分别为</span><span style="color: black; font-family: Century-Book">"first-Name" </span><span style="color: black; font-family: 宋体">和</span><span style="color: black; font-family: Century-Book"> "lastName"</span><span style="color: black; font-family: 宋体">，代码如下：</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">VelocityContext context = new VelocityContext();</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">context.put( "firstName", "John" );</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">context.put( "lastName", "Doe" );</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">创建好后，模板就可以使用引用</span><span style="color: black; font-family: Century-Book">$firstName </span><span style="color: black; font-family: 宋体">和</span><span style="color: black; font-family: Century-Book"> $lastName</span><span style="color: black; font-family: 宋体">来访问对象</span><span style="color: black; font-family: Century-Book">"John"</span><span style="color: black; font-family: 宋体">和</span><span style="color: black; font-family: Century-Book">"Doe"</span><span style="color: black; font-family: 宋体">。在这种情况下，虽然上下文中的对象已经是</span><span style="color: black; font-family: Century-Book">JAVA</span><span style="color: black; font-family: 宋体">字符串类型，但是它比其他的</span><span style="color: black; font-family: Century-Book">JAVA</span><span style="color: black; font-family: 宋体">类型（比如</span><span style="color: black; font-family: Century-Book">Integer </span><span style="color: black; font-family: 宋体">或</span><span style="color: black; font-family: Century-Book"> Float</span><span style="color: black; font-family: 宋体">）更容易接受的。在其他情况下，</span><span style="color: black; font-family: Century-Book">Velocity</span><span style="color: black; font-family: 宋体">使用对象的</span><span style="color: black; font-family: Century-Book">toString()</span><span style="color: black; font-family: 宋体">方法来生成一个字符串，以用于显示输出。当然，它也可能是比简单值更复杂的一个对象，这通常发生在模板的需求包含了高级功能的情况下，这时只能通过对象的方法存储在上下文中。最后一种情况的细节将在</span><span style="color: black; font-family: Century-Book">Chapter 7</span><span style="color: black; font-family: 宋体">讨论（</span><span style="color: black; font-family: Century-Book">Velocity</span><span style="color: black; font-family: 宋体">引用）。</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">除了组装上下文外，上下文接口还允许编程人员对上下文进行查询和更深入的操作，提供的附加方法如下：</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">boolean containsKey( java.lang.Object key )</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">java.lang.Object[] getKeys()</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">java.lang.Object remove( java.lang.Object key )</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">java.lang.Object get( java.lang.String key )</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: Century-Book">containsKey()</span><span style="color: black; font-family: 宋体">方法允许通过关键字检索上下文，返回</span><span style="color: black; font-family: Century-Book">true</span><span style="color: black; font-family: 宋体">（表示找到了和关键字对应的对象）和</span><span style="color: black; font-family: Century-Book">false</span><span style="color: black; font-family: 宋体">。</span><span style="color: black; font-family: Century-Book">getKeys()</span><span style="color: black; font-family: 宋体">方法返回所有关键字的列表，要注意的是返回的类型为对象数组，而不是字符串数组。</span><span style="color: black; font-family: Century-Book">remove()</span><span style="color: black; font-family: 宋体">方法用于移除关键字对应的对象，同时也将移除关键字，返回值为被移除对象的值。</span><span style="color: black; font-family: Century-Book">get()</span><span style="color: black; font-family: 宋体">方法允许编程人员通过关键字访问对象。</span></p>
<p style="text-align: left" align="left"><strong><span style="font-size: 15pt; color: black; font-family: Formata-Medium">Putting the Pieces Together</span></strong><strong><span style="font-size: 15pt; color: black; font-family: 宋体">放置组合体？</span></strong></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">既然你已经对模板和上下文在</span><span style="color: black; font-family: Century-Book">Velocity</span><span style="color: black; font-family: 宋体">中扮演的角色有了大概了解，那就让我们把组合体放到应用程序的窗体里，对</span><span style="color: black; font-family: Century-Book"> Velocity</span><span style="color: black; font-family: 宋体">模板进行处理，以显示俱乐部</span><span style="color: black; font-family: Century-Book">Velocity</span><span style="color: black; font-family: 宋体">成员应用程序的窗体。既然本应用示例的真实意图是用于阐明</span><span style="color: black; font-family: Century-Book">Velocity</span><span style="color: black; font-family: 宋体">应用的基础结构，那我们就让它的逻辑尽量简单。特别的，本示例中，动态组件的最终内容是来自硬编码的字符串，在现实的应用程序中，这些动态内容更多来自数据库或产生于别的途径。</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">在查看应用程序代码之前，先来了解大概的顺序。把</span><span style="color: black; font-family: Century-Book">Listing 6.1</span><span style="color: black; font-family: 宋体">定义的模板作为起点，开发一个处理模板的应用程序，用</span><span style="color: black; font-family: Century-Book">Velocity</span><span style="color: black; font-family: 宋体">上下文中适当的文本替换所有的引用，最终内容（包含直接取自模板的静态内容和取自上下文的动态内容）将被应用程序输出，结果详见</span><span style="color: black; font-family: Century-Book">Listing 6.2</span><span style="color: black; font-family: 宋体">。</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">符合这个目标的应用程序源代码详见</span><span style="color: black; font-family: Century-Book">Listing 6.4</span><span style="color: black; font-family: 宋体">。这些代码是比较典型的通用代码，适用于多数</span><span style="color: black; font-family: Century-Book"> Velocity</span><span style="color: black; font-family: 宋体">应用程序，它有完善的注释。它共有六个步骤：模板引擎初始化，模板包含，上下文创建，上下文组装，模板和上下文合并和内容表示。要注意的是，这仅仅是一个通用模式，它还有一些弹性，可以进行进一步扩展。但是，如果你牢牢记住了这个模式，就会少犯错误。</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">import java.io.StringWriter;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">import org.apache.velocity.Template;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">import org.apache.velocity.VelocityContext;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">import org.apache.velocity.app.Velocity;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">import org.apache.velocity.exception.*;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">public class ClubApp</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">{</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">public static void main( String[] args )</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">{</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">// Initialize template engine</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">try</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">{</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">Velocity.init();</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">}</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">catch( Exception x )</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">{</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">System.err.println( "Failed to initialize Velocity: " + x );</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">System.exit( 1 );</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">}</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">// </span><span style="font-size: 8pt; color: black; font-family: 宋体">获取模板</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">Template clubTemplate = null;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">try</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">{</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">clubTemplate = Velocity.getTemplate( "ClubApp.vm" );</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">}</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">catch( ResourceNotFoundException rnfX )</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">{</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">System.err.println( "Template not found: " + rnfX );</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">System.exit( 1 );</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">}</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">catch( ParseErrorException peX )</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">{</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">System.err.println( "Failed to parse template: " + peX );</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">System.exit( 1 );</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">}</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">catch( Exception x )</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">{</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">System.err.println( "Failed to initialize template: " + x );</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">System.exit( 1 );</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">}</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">// </span><span style="font-size: 8pt; color: black; font-family: 宋体">创建上下文</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">VelocityContext context = new VelocityContext();</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">// Populate context</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">context.put( "firstName", "John" );</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">context.put( "lastName", "Doe" );</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">context.put( "streetAddress", "123 Jane Ave." );</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">context.put( "city", "Azusa" );</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">context.put( "state", "CA" );</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">context.put( "zip", "91702" );</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">context.put( "phoneNumber", "626-555-1234" );</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">context.put( "emailAddress", "john@nodom.com" );</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">context.put( "occupation", "Web Developer" );</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">context.put( "otherInterests", "Hiking,Biking" );</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">context.put( "appType", "New" );</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">context.put( "useTime", "6 months" );</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">context.put( "useType", "Work" );</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">context.put( "wantNewsletter", "Yes" );</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">// Merge template and context</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">StringWriter writer = new StringWriter();</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">try</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">{</span><span style="font-size: 8pt; font-family: Courier">clubTemplate.merge( context, writer );}</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; font-family: Courier">catch( ResourceNotFoundException rnfX )</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; font-family: Courier">{</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; font-family: Courier">System.err.println( "Template not found on merge: " + rnfX );</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; font-family: Courier">System.exit( 1 );</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; font-family: Courier">}</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; font-family: Courier">catch( ParseErrorException peX )</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; font-family: Courier">{</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; font-family: Courier">System.err.println( "Failed to parse template on merge: " + peX );</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; font-family: Courier">System.exit( 1 );</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; font-family: Courier">}</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; font-family: Courier">catch( MethodInvocationException miX )</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; font-family: Courier">{</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; font-family: Courier">System.err.println( "Application method exception: " + miX );</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; font-family: Courier">System.exit( 1 );</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; font-family: Courier">}</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; font-family: Courier">catch( Exception x )</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; font-family: Courier">{</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; font-family: Courier">System.err.println( "Failed to merge template: " + x );</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; font-family: Courier">System.exit( 1 );</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; font-family: Courier">}</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; font-family: Courier">// Render merged content</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; font-family: Courier">System.out.println( writer.toString() );</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; font-family: Courier">}</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; font-family: Courier">}</span></p>
<p style="text-align: left" align="left"><strong><span style="font-size: 9pt; color: black; font-family: Formata-Bold">Listing 6.4 </span></strong><span style="font-size: 9pt; color: black; font-family: Formata-Regular">An application for processing the club membership form.</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">我们现在来讨论一下这个示例，可以说是把它放到放大镜下进行观察。代码开始于</span><span style="color: black; font-family: Century-Book">import</span><span style="color: black; font-family: 宋体">语句，你可以看到</span><span style="color: black; font-family: Century-Book">java.io.StringWriter</span><span style="color: black; font-family: 宋体">被导入到程序中，虽然</span><span style="color: black; font-family: Century-Book">StringWriter</span><span style="color: black; font-family: 宋体">类并非必须，但一般情况下，导入</span><span style="color: black; font-family: Century-Book">StringWriter</span><span style="color: black; font-family: 宋体">类是适当的，因为模板和上下文的合并处理通常需要一个</span><span style="color: black; font-family: Century-Book">java.io.Writer</span><span style="color: black; font-family: 宋体">的衍生对象或衍生类。导入的第一个</span><span style="color: black; font-family: Century-Book">Velocity</span><span style="color: black; font-family: 宋体">包是</span><span style="color: black; font-family: Century-Book">org.apache.velocity.Template</span><span style="color: black; font-family: 宋体">，其相应的模板类提供了一个由应用程序使用的、常驻内存的模板。接着导入的是</span><span style="color: black; font-family: Century-Book">org.apache.velocity.VelocityContext</span><span style="color: black; font-family: 宋体">类，用于处理</span><span style="color: black; font-family: Century-Book">Velocity</span><span style="color: black; font-family: 宋体">上下文。之后，应用程序导入了</span><span style="color: black; font-family: Century-Book">org.apache.velocity.app.Velocity</span><span style="color: black; font-family: 宋体">类，它提供了独立模式的</span><span style="color: black; font-family: Century-Book">Velocity</span><span style="color: black; font-family: 宋体">模板引擎。通过</span><span style="color: black; font-family: Century-Book">org.apache.velocity.app.VelocityEngine</span><span style="color: black; font-family: 宋体">类（将在</span><span style="color: black; font-family: Century-Book">Chapter 10</span><span style="color: black; font-family: 宋体">讨论）可实现非独立模式</span><span style="color: black; font-family: Century-Book">Velocity</span><span style="color: black; font-family: 宋体">模板引擎（</span><span style="color: black; font-family: Century-Book">non-Singleton implementation</span><span style="color: black; font-family: 宋体">）。最后导入的是</span><span style="color: black; font-family: Century-Book">org.apache.velocity.exception.*</span><span style="color: black; font-family: 宋体">，它提供了一个访问各种</span><span style="color: black; font-family: Century-Book">Velocity</span><span style="color: black; font-family: 宋体">异常类的能力。</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: Century-Book">Import</span><span style="color: black; font-family: 宋体">语句之后，将进入模板处理的执行代码。正如前面提及的，紧随其后的是</span><span style="color: black; font-family: Century-Book">Velocity</span><span style="color: black; font-family: 宋体">应用的通用代码。第一个元素是初始化模板引擎，使用的是独立模式，初始化操作非常容易，仅仅调用静态方法</span><span style="color: black; font-family: Century-Book">Velocity.init()</span><span style="color: black; font-family: 宋体">即可，如果因其他原因造成初始化失败，将抛出一个</span><span style="color: black; font-family: Century-Book">java.lang.Exception</span><span style="color: black; font-family: 宋体">类型的通用异常；如果使用的是非独立模式，你需要创建</span><span style="color: black; font-family: Century-Book">VelocityEngine</span><span style="color: black; font-family: 宋体">的实例来代替它，并调用该实例的</span><span style="color: black; font-family: Century-Book">init()</span><span style="color: black; font-family: 宋体">方法，而不是直接调用</span><span style="color: black; font-family: Century-Book">Velocity</span><span style="color: black; font-family: 宋体">的静态方法</span><span style="color: black; font-family: Century-Book">Velocity.init()</span><span style="color: black; font-family: 宋体">。</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">初始化模板引擎之后，应用程序下一步将获取一个常驻内存的模板。随着模板引擎的初始化，这一步完成时创建的</span><span style="color: black; font-family: Century-Book">manner</span><span style="color: black; font-family: 宋体">（依赖于独立或非独立模式）就可以使用了。在独立模式下，通过调用</span><span style="color: black; font-family: Century-Book">Velocity</span><span style="color: black; font-family: 宋体">类的静态方法</span><span style="color: black; font-family: Century-Book">getTemplate()</span><span style="color: black; font-family: 宋体">，将返回一个模板的实例。这个方法通过模板名称参数获得并加载了一个模板文件，本例中是</span><span style="color: black; font-family: Century-Book">ClubApp.vm</span><span style="color: black; font-family: 宋体">。注意，虽然</span><span style="color: black; font-family: Century-Book">VM</span><span style="color: black; font-family: 宋体">是公认的</span><span style="color: black; font-family: Century-Book">Velocity</span><span style="color: black; font-family: 宋体">模板文件标准后缀，你也不必遵守这个约定，你可以将其改成其他的后缀，比如：</span><span style="color: black; font-family: Century-Book">XXX</span><span style="color: black; font-family: 宋体">。</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">如果一个非独立模式被替换用于模板获取，剩余的处理必须相同。关键差别在于调用</span><span style="color: black; font-family: Century-Book">getTemplate()</span><span style="color: black; font-family: 宋体">方法，非独立模式只能用</span><span style="color: black; font-family: Century-Book">VelocityEngine</span><span style="color: black; font-family: 宋体">创建的实例来调用，不能采用调用</span><span style="color: black; font-family: Century-Book">Velocity</span><span style="color: black; font-family: 宋体">静态方法的方式来调用。不管采用哪种模式，都必须增加相同的异常处理集，包括</span><span style="color: black; font-family: Century-Book">ResourceNotFoundException</span><span style="color: black; font-family: 宋体">、</span><span style="color: black; font-family: Century-Book"> ParseErrorException</span><span style="color: black; font-family: 宋体">和</span><span style="color: black; font-family: Century-Book">Exception</span><span style="color: black; font-family: 宋体">。前两个</span><span style="color: black; font-family: Century-Book">Velocity</span><span style="color: black; font-family: 宋体">异常在</span><span style="color: black; font-family: Century-Book">org.apache.velocity.exception</span><span style="color: black; font-family: 宋体">包里指定，最后一个是标准的</span><span style="color: black; font-family: Century-Book">java.lang. Exception</span><span style="color: black; font-family: 宋体">包。</span><span style="color: black; font-family: Century-Book">ResourceNotFoundException</span><span style="color: black; font-family: 宋体">异常在</span><span style="color: black; font-family: Century-Book">Velocity</span><span style="color: black; font-family: 宋体">不能定位指定模板文件时抛出；</span><span style="color: black; font-family: Century-Book">ParseErrorException</span><span style="color: black; font-family: 宋体">异常在</span><span style="color: black; font-family: Century-Book">Velocity</span><span style="color: black; font-family: 宋体">不能解析模板时抛出；最后，</span><span style="color: black; font-family: Century-Book">Exception</span><span style="color: black; font-family: 宋体">异常在模板获取期间，发生任何其他问题时抛出。</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">在正确获取模板之后，你就可以创建和组装上下文了。首先要创建一个</span><span style="color: black; font-family: Century-Book">VelocityContext</span><span style="color: black; font-family: 宋体">实例。上下文的组装通过实例调用</span><span style="color: black; font-family: Century-Book">VelocityContext</span><span style="color: black; font-family: 宋体">的</span><span style="color: black; font-family: Century-Book">put()</span><span style="color: black; font-family: 宋体">方法来完成，每一个关键字对应一个</span><span style="color: black; font-family: Century-Book">JAVA</span><span style="color: black; font-family: 宋体">对象。在一个典型的</span><span style="color: black; font-family: Century-Book">Velocity</span><span style="color: black; font-family: 宋体">应用中，很多处理都将围绕上下文组装这个操作，这里是生成让模板设计者可用的动态内容的地方，所有的数据中转和处理都将在这里完成。</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">现在你手里已经有了模板和上下文，下一步就是合并他们。这一步的作用是用从上下文中获取的数据替换模板中的引用，该合并操作是通过调用模板实例（之前创建的）的</span><span style="color: black; font-family: Century-Book">merge()</span><span style="color: black; font-family: 宋体">方法完成的。模板的</span><span style="color: black; font-family: Century-Book">merge()</span><span style="color: black; font-family: 宋体">方法需要两个参数，第一个是上下文（实现了上下文接口的任何对象），这里，你需要传递一个</span><span style="color: black; font-family: Century-Book">Velocity-Context</span><span style="color: black; font-family: 宋体">的实例；第二个是</span><span style="color: black; font-family: Century-Book">java.io.Writer</span><span style="color: black; font-family: 宋体">类型的对象，或其他</span><span style="color: black; font-family: Century-Book">Writer</span><span style="color: black; font-family: 宋体">的衍生类型对象。</span><span style="color: black; font-family: Century-Book">Writer</span><span style="color: black; font-family: 宋体">对象用于保存模板处理的结果。</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">最后，将输出最后的处理结果。一旦你把</span><span style="color: black; font-family: Century-Book">StringWriter</span><span style="color: black; font-family: 宋体">用于合并操作，</span><span style="color: black; font-family: Century-Book">render</span><span style="color: black; font-family: 宋体">操作将不再调用</span><span style="color: black; font-family: Century-Book">Writer</span><span style="color: black; font-family: 宋体">的</span><span style="color: black; font-family: Century-Book">toString()</span><span style="color: black; font-family: 宋体">方法，而是直接输出到适当的位置，比如浏览器。输出结果见</span><span style="color: black; font-family: Century-Book">Listing 6.2</span><span style="color: black; font-family: 宋体">。</span></p>
<p style="text-align: left" align="left"><strong><span style="font-size: 15pt; color: black; font-family: 宋体">本章小节和下章介绍</span></strong></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">这一章全面介绍了</span><span style="color: black; font-family: Century-Book">Velocity</span><span style="color: black; font-family: 宋体">模板和上下文基础，我们通过一个示例应用示范了如何使用模板和上下文，并且对他们进行了详细的讨论。通过这些内容的学习，你应该可以设计一些基本的模板或开发简单的模板处理应用程序了。然而，在使用</span><span style="color: black; font-family: Century-Book">Velocity</span><span style="color: black; font-family: 宋体">进行更多高级模板处理任务时，仍有许多障碍，要清除这些障碍，我们首先需要对</span><span style="color: black; font-family: Century-Book">Velocity</span><span style="color: black; font-family: 宋体">引用进行更广泛的研究，这就是我们下一章将要学习的内容。</span></p>
</span></div>
<img src ="http://www.blogjava.net/kingwee/aggbug/234140.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kingwee/" target="_blank">KINGWEE</a> 2008-10-14 08:52 <a href="http://www.blogjava.net/kingwee/articles/234140.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>CHAPTER 5 构建Hello World示例</title><link>http://www.blogjava.net/kingwee/articles/233924.html</link><dc:creator>KINGWEE</dc:creator><author>KINGWEE</author><pubDate>Sun, 12 Oct 2008 16:42:00 GMT</pubDate><guid>http://www.blogjava.net/kingwee/articles/233924.html</guid><wfw:comment>http://www.blogjava.net/kingwee/comments/233924.html</wfw:comment><comments>http://www.blogjava.net/kingwee/articles/233924.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kingwee/comments/commentRss/233924.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kingwee/services/trackbacks/233924.html</trackback:ping><description><![CDATA[<div style="layout-grid:  15.6pt none">
<p><strong></strong>&nbsp;</p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">目前，你已经对</span><span style="color: black; font-family: Century-Book">Velocity</span><span style="color: black; font-family: 宋体">有了一个很好的理解，并且理解了</span><span style="color: black; font-family: Century-Book">MVC</span><span style="color: black; font-family: 宋体">是如何工作的，同时也搭建一个</span><span style="color: black; font-family: Century-Book">Velocity</span><span style="color: black; font-family: 宋体">的工作环境，是时候开始学习如何</span><span style="color: black; font-family: Century-Book">Velocity</span><span style="color: black; font-family: 宋体">了。正如你所期望的一样，第一个示例就是</span><span style="color: black; font-family: Century-Book">Hello World</span><span style="color: black; font-family: 宋体">。</span></p>
<p style="text-align: left" align="left"><strong><span style="font-size: 15pt; color: black; font-family: Formata-Medium">Hello World!</span></strong></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">首先，你需要确定</span><span style="color: black; font-family: Century-Book">HTML</span><span style="color: black; font-family: 宋体">页面的</span><span style="color: black; font-family: Century-Book">Hello World</span><span style="color: black; font-family: 宋体">模板和在页面上显示些什么信息。如果我们仅仅简单的输出&#8220;</span><span style="color: black; font-family: Century-Book">Hello World</span><span style="color: black; font-family: 宋体">&#8221;，这就不能很好体现</span><span style="color: black; font-family: Century-Book">Velocity</span><span style="color: black; font-family: 宋体">的特性。因此，我们准备生成一个模板，输出内容为：</span><span style="color: black; font-family: Century-Book">&#8220;Hello World, Sam is Here&#8221;</span><span style="color: black; font-family: 宋体">，在这里，</span><span style="color: black; font-family: Century-Book">&#8220;Sam&#8221;</span><span style="color: black; font-family: 宋体">用的是引用值。</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">现在，你已经知道了页面需要输出的内容，接下来，你需要和</span><span style="color: black; font-family: Century-Book">JAVA</span><span style="color: black; font-family: 宋体">开发者一起讨论并确定页面所需要引用对象的名称（此处的引用对象是&#8220;</span><span style="color: black; font-family: Century-Book">Sam</span><span style="color: black; font-family: 宋体">&#8221;），在这里我们将这个引用对象的名称约定为&#8220;</span><span style="color: black; font-family: Century-Book">name</span><span style="color: black; font-family: 宋体">&#8221;。在构建</span><span style="color: black; font-family: Century-Book">Hello World</span><span style="color: black; font-family: 宋体">示例时，你需要考虑以下三个版本：</span></p>
<p style="text-align: left" align="left"><span style="font-size: 6pt; color: black; font-family: ZapfDingbats">■ </span><span style="color: black; font-family: 宋体">不使用上下文的</span><span style="color: black; font-family: Century-Book">Velocity</span><span style="color: black; font-family: 宋体">模板</span></p>
<p style="text-align: left" align="left"><span style="font-size: 6pt; color: black; font-family: ZapfDingbats">■ </span><span style="color: black; font-family: 宋体">使用上下文的</span><span style="color: black; font-family: Century-Book">Velocity</span><span style="color: black; font-family: 宋体">模板</span></p>
<p style="text-align: left" align="left"><span style="font-size: 6pt; color: black; font-family: ZapfDingbats">■ </span><span style="color: black; font-family: 宋体">使用</span><span style="color: black; font-family: Century-Book">WEB</span><span style="color: black; font-family: 宋体">的</span><span style="color: black; font-family: Century-Book">Velocity</span><span style="color: black; font-family: 宋体">模板</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">如果你已经非常熟悉服务器端语言，比如</span><span style="color: black; font-family: Century-Book">PHP</span><span style="color: black; font-family: 宋体">，你或许会非常惊奇，在</span><span style="color: black; font-family: Century-Book">Velocity</span><span style="color: black; font-family: 宋体">模板被浏览时，我们为什么不讨论</span><span style="color: black; font-family: Century-Book">WEB</span><span style="color: black; font-family: 宋体">服务器的解释程序。这是因为</span><span style="color: black; font-family: Century-Book">Velocity</span><span style="color: black; font-family: 宋体">并不含解释程序，它是纯</span><span style="color: black; font-family: Century-Book">JAVA</span><span style="color: black; font-family: 宋体">语言，属性编译运行方式，而非解释运行方式。所有在模板和上下文之间的合并处理都是通过</span><span style="color: black; font-family: Century-Book">JAVA</span><span style="color: black; font-family: 宋体">代码来完成的。这些</span><span style="color: black; font-family: Century-Book">JAVA</span><span style="color: black; font-family: 宋体">代码可能存在于</span><span style="color: black; font-family: Century-Book">Servlet</span><span style="color: black; font-family: 宋体">中，也可嵌入</span><span style="color: black; font-family: Century-Book">JSP</span><span style="color: black; font-family: 宋体">或应用程序中。</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">在</span><span style="color: black; font-family: Century-Book">WEB</span><span style="color: black; font-family: 宋体">中使用</span><span style="color: black; font-family: Century-Book">Velocity</span><span style="color: black; font-family: 宋体">时，很多情况下是使用</span><span style="color: black; font-family: Century-Book">Servlet</span><span style="color: black; font-family: 宋体">来处理模板转换工作的。</span></p>
<p style="text-align: left" align="left"><strong><span style="font-size: 13.5pt; color: black; font-family: 宋体">不使用上下文的</span></strong><strong><span style="font-size: 13.5pt; color: black; font-family: Formata-Medium">Velocity</span></strong><strong><span style="font-size: 13.5pt; color: black; font-family: 宋体">模板</span></strong></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: Century-Book">Hello World</span><span style="color: black; font-family: 宋体">示例代码见</span><span style="color: black; font-family: Century-Book">Listing 5.1</span><span style="color: black; font-family: 宋体">，它使用</span><span style="color: black; font-family: Century-Book">Velocity</span><span style="color: black; font-family: 宋体">指令语句</span><span style="color: black; font-family: Century-Book">#set</span><span style="color: black; font-family: 宋体">来为模板中引用指定一个值（在模板中使用），同时使用嵌入</span><span style="color: black; font-family: Century-Book">Hello World</span><span style="color: black; font-family: 宋体">文本的</span><span style="color: black; font-family: Century-Book">$name</span><span style="color: black; font-family: 宋体">指令来引用</span><span style="color: black; font-family: Century-Book">#set</span><span style="color: black; font-family: 宋体">指定的值。</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">这个示例比较容易理解，在</span><span style="color: black; font-family: Century-Book">Velocity</span><span style="color: black; font-family: 宋体">对模板进行解析时，如果是普通的文本，则忽略，直接输出；当遇到</span><span style="color: black; font-family: Century-Book">#set</span><span style="color: black; font-family: 宋体">指令时，它就创建一个名叫</span><span style="color: black; font-family: Century-Book">$name</span><span style="color: black; font-family: 宋体">的内部变量（在模板文件中指定的），并赋值为</span><span style="color: black; font-family: Century-Book">"Sam"</span><span style="color: black; font-family: 宋体">（在模板文件中指定的）；接着，程序将直接输出</span><span style="color: black; font-family: Century-Book">&#8220;Hello World&#8221;</span><span style="color: black; font-family: 宋体">文本；在系统处理到</span><span style="color: black; font-family: Century-Book">$name</span><span style="color: black; font-family: 宋体">引用时，系统将尝试在上下文中查找一个名叫</span><span style="color: black; font-family: Century-Book">$name</span><span style="color: black; font-family: 宋体">的对象，如果在上下文中没有匹配的对象，系统将尝试匹配之前用</span><span style="color: black; font-family: Century-Book">#set</span><span style="color: black; font-family: 宋体">创建的引用。</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">#set( $name = "Sam" )</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">Hello World, $name is Here</span></p>
<p style="text-align: left" align="left"><strong><span style="font-size: 9pt; color: black; font-family: Formata-Bold">Listing 5.1 </span></strong><span style="font-size: 9pt; color: black; font-family: Formata-Regular">The Velocity Hello World template.</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">当然，仅仅拥有一个模板是不能工作的，你还需要一个把模板和上下文合并，并输出给用户的途径。</span><span style="color: black; font-family: Century-Book">Listing 5.2</span><span style="color: black; font-family: 宋体">显示了一个独立应用需要用到的相关代码。</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">import org.apache.velocity.app.Velocity;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">import org.apache.velocity.VelocityContext;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">import org.apache.velocity.Template;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">import org.apache.velocity.exception.ParseErrorException;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">import org.apache.velocity.exception.ResourceNotFoundException;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">import java.io.*;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">import java.util.ArrayList;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">public class Example {</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">//</span><span style="font-size: 8pt; color: black; font-family: 宋体">从命令行参数获取模板文件，并进行初始化操作</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">public Example(String templateFile) {</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">try {</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">Velocity.init();</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">VelocityContext context = new VelocityContext();</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">Template template = null;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">try {</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">template = Velocity.getTemplate(templateFile);</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">} catch(ResourceNotFoundException e2 ) {</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">System.out.println(</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">"cannot find template " + templateFile );</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">} catch(ParseErrorException e ) {</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">System.out.println(</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">"Syntax error in template : " + e);</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">}</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">BufferedWriter writer = new BufferedWriter(</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">new OutputStreamWriter(System.out));</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">if ( template != null)</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">template.merge(context, writer);</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">writer.flush();</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">writer.close();</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">} catch( Exception e ) {</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">System.out.println(e);</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">}</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">}</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">public static void main(String[] args) {</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">Example t = new Example(args[0]);</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">}</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">}</span></p>
<p style="text-align: left" align="left"><strong><span style="font-size: 9pt; color: black; font-family: Formata-Bold">Listing 5.2 </span></strong><span style="font-size: 9pt; color: black; font-family: Formata-Regular">The Velocity application without context. (continued)</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">和许多的</span><span style="color: black; font-family: Century-Book">JAVA</span><span style="color: black; font-family: 宋体">应用程序一样，这个示例需要导入一些</span><span style="color: black; font-family: Century-Book">JAVA</span><span style="color: black; font-family: 宋体">包，前面</span><span style="color: black; font-family: Century-Book">5</span><span style="color: black; font-family: 宋体">个导入了运行</span><span style="color: black; font-family: Century-Book">Velocity</span><span style="color: black; font-family: 宋体">需要的类。当第一次运行这个示例时，需要在命令行提供模板文件名这个参数。如：</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">java Example example.vm</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">回头查看</span><span style="color: black; font-family: Century-Book">Listing 5.2</span><span style="color: black; font-family: 宋体">的模板示例我们可以看到，模板文件的名称被放置到命令行上，并传递给新创建的示例对象。在这里，首先需要完成</span><span style="color: black; font-family: Century-Book">Velocity</span><span style="color: black; font-family: 宋体">引擎的初始化操作，示例利用一个独立模式关联应用程序和</span><span style="color: black; font-family: Century-Book">Velocity</span><span style="color: black; font-family: 宋体">引擎，这就意味着仅有一个静态引擎是可用的。记住这个事实很重要，因为你肯定不希望再看到示例中还有其他任何初始化引擎的代码。</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">一旦引擎被初始化，就将从本地磁盘上加载模板。模板是通过</span><span style="color: black; font-family: Century-Book">Velocity</span><span style="color: black; font-family: 宋体">引擎对象的</span><span style="color: black; font-family: Century-Book">getTemplate(String)</span><span style="color: black; font-family: 宋体">方法进行加载的，该方法的结果是调用了一个模板对象；另外，如果没有找到，就会抛出异常。很重要的一点是，当找不到模板文件或把模板文件解析成模板对象出错时，异常将通过</span><span style="color: black; font-family: Century-Book">ResourceNotFoundException</span><span style="color: black; font-family: 宋体">进行抛出。当读取模板并进行解析时出错，也会抛出</span><span style="color: black; font-family: Century-Book">ParseErrorException</span><span style="color: black; font-family: 宋体">异常。</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">当模板被读入到系统之后，你就可以开始处理输出了。此处要注意的是，除了输出到控制台的方式外，还可以输出为一个文件、一个套接字</span><span style="color: black; font-family: Century-Book">socket</span><span style="color: black; font-family: 宋体">或其他的输出。</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">在这个示例里，你已经在应用程序里使用了几个不同的内容：</span></p>
<p style="text-align: left" align="left"><span style="font-size: 6pt; color: black; font-family: ZapfDingbats">■ </span><strong><span style="color: black; font-family: Century-Bold">Velocity</span></strong><span style="color: black; font-family: Century-Book">—</span><span style="color: black; font-family: 宋体">一个静态对象，表现为</span><span style="color: black; font-family: Century-Book">Velocity</span><span style="color: black; font-family: 宋体">引擎</span></p>
<p style="text-align: left" align="left"><span style="font-size: 6pt; color: black; font-family: ZapfDingbats">■ </span><strong><span style="color: black; font-family: Century-Bold">Context</span></strong><span style="color: black; font-family: Century-Book">—</span><span style="color: black; font-family: 宋体">一个上下文对象</span></p>
<p style="text-align: left" align="left"><span style="font-size: 6pt; color: black; font-family: ZapfDingbats">■ </span><strong><span style="color: black; font-family: Century-Bold">Template</span></strong><span style="color: black; font-family: Century-Book">—</span><span style="color: black; font-family: 宋体">一个模板对象，在从本地磁盘读入</span><span style="color: black; font-family: Century-Book">Velocity</span><span style="color: black; font-family: 宋体">模板文件时创建</span></p>
<p style="text-align: left" align="left"><span style="font-size: 6pt; color: black; font-family: ZapfDingbats">■ </span><strong><span style="color: black; font-family: Century-Bold">Writer</span></strong><span style="color: black; font-family: Century-Book">—</span><span style="color: black; font-family: 宋体">一个</span><span style="color: black; font-family: Century-Book">BufferedWriter</span><span style="color: black; font-family: 宋体">对象，用于向控制台直接输出（通过</span><span style="color: black; font-family: Century-Book">System.out</span><span style="color: black; font-family: 宋体">流）。在输出前，要核实</span><span style="color: black; font-family: Century-Book">BufferedWriter</span><span style="color: black; font-family: 宋体">已经正确进行了初始化。之后，</span><span style="color: black; font-family: Century-Book">Velocity</span><span style="color: black; font-family: 宋体">引擎通过使用模板对象的</span><span style="color: black; font-family: Century-Book">merge()</span><span style="color: black; font-family: 宋体">方法（带有两参数：一个上下文对象和一个</span><span style="color: black; font-family: Century-Book">BufferedWriter</span><span style="color: black; font-family: 宋体">对象）来完成内容合并。</span><span style="color: black; font-family: Century-Book">merge()</span><span style="color: black; font-family: 宋体">方法带有两参数：一个上下文对象和一个</span><span style="color: black; font-family: Century-Book">BufferedWriter</span><span style="color: black; font-family: 宋体">对象，当模板对象执行</span><span style="color: black; font-family: Century-Book">merge()</span><span style="color: black; font-family: 宋体">方法时，上下文被合并到模板文件中，同时用上下文中对应的值替换模板中的脚本元素，完成输出创建工作。</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">最后，冲洗（</span><span style="color: black; font-family: Century-Book">flush</span><span style="color: black; font-family: 宋体">）和关闭输出流。</span><span style="color: black; font-family: Century-Book">Figure 5.1 </span><span style="color: black; font-family: 宋体">显示了输出结果。</span></p>
<p style="text-align: left" align="left"><strong><span style="font-size: 9pt; color: black; font-family: Formata-Bold"><img height="134" alt="" src="http://www.blogjava.net/images/blogjava_net/kingwee/51.gif" width="554" border="0" /><br />
Figure 5.1 </span></strong><span style="font-size: 9pt; color: black; font-family: Formata-Regular">Output from the Hello World example.</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">在这个示例里，我们将</span><span style="color: black; font-family: Century-Book">Listing 5.1</span><span style="color: black; font-family: 宋体">中的模板内容保存为一个文件，命名为</span><span style="color: black; font-family: Century-Book">helloworld.vm</span><span style="color: black; font-family: 宋体">。在这里，扩展名不限于</span><span style="color: black; font-family: Century-Book">VM</span><span style="color: black; font-family: 宋体">，也可以是其他的扩展名，目的是与其他文件进行区别，比如：</span><span style="color: black; font-family: Century-Book">HTML</span><span style="color: black; font-family: 宋体">或</span><span style="color: black; font-family: Century-Book">JSP</span><span style="color: black; font-family: 宋体">，当然，也完全可以是定义的，比如</span><span style="color: black; font-family: Century-Book">XX</span><span style="color: black; font-family: 宋体">。另外，我们把</span><span style="color: black; font-family: Century-Book">Listing 5.2</span><span style="color: black; font-family: 宋体">的内容保存到一个名叫</span><span style="color: black; font-family: Century-Book">Example.java</span><span style="color: black; font-family: 宋体">的文件中，并将其编译成</span><span style="color: black; font-family: Century-Book">class</span><span style="color: black; font-family: 宋体">文件。</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">javac Example.java</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">执行示例的命令为</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">java Example helloworld.vm</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">如果</span><span style="color: black; font-family: Century-Book">Velocity</span><span style="color: black; font-family: 宋体">引擎不能定位模板文件位置，将产生一个错误。</span></p>
<p style="text-align: left" align="left"><strong><span style="font-size: 13.5pt; color: black; font-family: 宋体">使用上下文的</span></strong><strong><span style="font-size: 13.5pt; color: black; font-family: Formata-Medium">Velocity</span></strong><strong><span style="font-size: 13.5pt; color: black; font-family: 宋体">模板</span></strong></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">在上一个示例里，我们通过</span><span style="color: black; font-family: Century-Book">#set</span><span style="color: black; font-family: 宋体">指令来给</span><span style="color: black; font-family: Century-Book">$name</span><span style="color: black; font-family: 宋体">引用指定值。但这样做将限制</span><span style="color: black; font-family: Century-Book">Velocity</span><span style="color: black; font-family: 宋体">的动态处理能力，比如，如果需要动态的更改用户名称，就成为一个不可能完成的任务。要想获得这个能力，需要使用上下文对象，在第二个示例里，我们使用和</span><span style="color: black; font-family: Century-Book">Listing 5.1</span><span style="color: black; font-family: 宋体">相同的模板，但删除了</span><span style="color: black; font-family: Century-Book">#set</span><span style="color: black; font-family: 宋体">指令这一行，只保留现在这一行：</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">Hello World, $name is Here</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">在</span><span style="color: black; font-family: Century-Book">JAVA</span><span style="color: black; font-family: 宋体">代码中找到下面这行代码</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">VelocityContext context = new VelocityContext();</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">在其之后加上下面这行代码：</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">context.put("name", "New Sam");</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">存储这个文件，编译和执行它。你就将看到这样的输出&#8220;</span><span style="color: black; font-family: Century-Book">Hello World, New Sam is Here.&#8221;</span><span style="color: black; font-family: 宋体">。现在让我们试一试其他，打开这个应用程序代码，改变</span><span style="color: black; font-family: Century-Book">context.put</span><span style="color: black; font-family: 宋体">的参数内容。</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">context.put("names", "New Sam");</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">重新编辑并执行。输出结果为</span><span style="color: black; font-family: Century-Book">&#8220;Hello World, $name is here&#8221;</span><span style="color: black; font-family: 宋体">，为什么会得到这个输出？好，让我们再仔细看一下</span><span style="color: black; font-family: Century-Book">context.put()</span><span style="color: black; font-family: 宋体">语句。正如你在前面章节学到的一样，</span><span style="color: black; font-family: Century-Book">Velocity</span><span style="color: black; font-family: 宋体">像变魔法一样把模板和上下文合并到一起，所有在模板的引用，比如</span><span style="color: black; font-family: Century-Book">$name</span><span style="color: black; font-family: 宋体">必须和上下文对象中的关键字相匹配。因此，</span><span style="color: black; font-family: Century-Book">Velocity</span><span style="color: black; font-family: 宋体">将尝试在上下文对象中查找关键字</span><span style="color: black; font-family: Century-Book">&#8220;name&#8221;</span><span style="color: black; font-family: 宋体">来与模板引用</span><span style="color: black; font-family: Century-Book">$name</span><span style="color: black; font-family: 宋体">相匹配。如果匹配上了，则将上下文中关键字</span><span style="color: black; font-family: Century-Book">&#8220;name&#8221;</span><span style="color: black; font-family: 宋体">中保存的值</span><span style="color: black; font-family: Century-Book">&#8220;New Sam&#8221;</span><span style="color: black; font-family: 宋体">合并入模板并返回给用户；如果在上下文中没有找到对应的关键字，引擎将直接把</span><span style="color: black; font-family: Century-Book">&#8220;$name&#8221;</span><span style="color: black; font-family: 宋体">作为字符串返回，不进行任何合并操作。</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">在这里，之所有输出为</span><span style="color: black; font-family: Century-Book">&#8220;Hello World, $name is here&#8221;</span><span style="color: black; font-family: 宋体">，是因为我们把</span><span style="color: black; font-family: Century-Book">context.put()</span><span style="color: black; font-family: 宋体">的关键字改成了</span><span style="color: black; font-family: Century-Book">&#8220;names&#8221;</span><span style="color: black; font-family: 宋体">，也就是说在上下文中保存的是</span><span style="color: black; font-family: Century-Book">&#8220;names&#8221;</span><span style="color: black; font-family: 宋体">关键字的值，</span><span style="color: black; font-family: Century-Book">Velocity</span><span style="color: black; font-family: 宋体">引擎也就不能匹配模板的</span><span style="color: black; font-family: Century-Book">$name</span><span style="color: black; font-family: 宋体">引用，所以</span><span style="color: black; font-family: Century-Book">Velocity</span><span style="color: black; font-family: 宋体">引擎直接返回</span><span style="color: black; font-family: Century-Book">$name</span><span style="color: black; font-family: 宋体">字符串。</span></p>
<p style="text-align: left" align="left"><strong><span style="font-size: 13.5pt; color: black; font-family: 宋体">使用</span></strong><strong><span style="font-size: 13.5pt; color: black; font-family: Formata-Medium">WEB</span></strong><strong><span style="font-size: 13.5pt; color: black; font-family: 宋体">的</span></strong><strong><span style="font-size: 13.5pt; color: black; font-family: Formata-Medium">Velocity</span></strong><strong><span style="font-size: 13.5pt; color: black; font-family: 宋体">模板</span></strong></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">迄今为此，我们所做的两个示例都是用于独立的</span><span style="color: black; font-family: Century-Book">JAVA</span><span style="color: black; font-family: 宋体">应用程序。然而，当把</span><span style="color: black; font-family: Century-Book">Velocity</span><span style="color: black; font-family: 宋体">用于替代</span><span style="color: black; font-family: Century-Book">jSP</span><span style="color: black; font-family: 宋体">时，你可能最期待的就是把</span><span style="color: black; font-family: Century-Book">Velocity</span><span style="color: black; font-family: 宋体">用于</span><span style="color: black; font-family: Century-Book">WEB</span><span style="color: black; font-family: 宋体">应用程序。在这一节里，我们将看一看如何在</span><span style="color: black; font-family: Century-Book">Servlets</span><span style="color: black; font-family: 宋体">里使用</span><span style="color: black; font-family: Century-Book">Velocity</span><span style="color: black; font-family: 宋体">。关于这个主题的更多信息，详见</span><span style="color: black; font-family: Century-Book">Chapter 12</span><span style="color: black; font-family: 宋体">&#8220;在</span><span style="color: black; font-family: Century-Book">Servlets</span><span style="color: black; font-family: 宋体">里使用</span><span style="color: black; font-family: Century-Book">Velocity</span><span style="color: black; font-family: 宋体">&#8221;，</span><span style="color: black; font-family: Century-Book">Listing 5.3</span><span style="color: black; font-family: 宋体">展示了一个用于在浏览器里显示一个</span><span style="color: black; font-family: Century-Book">XML</span><span style="color: black; font-family: 宋体">文档的新模板。正如你所看到的一样，这个模板有一些小的功能。</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">在之后的章节里，我们将检验更多的模板语句。目前，你首先需要关注的第一个在</span><span style="color: black; font-family: Century-Book">#foreach</span><span style="color: black; font-family: 宋体">和</span><span style="color: black; font-family: Century-Book">#next</span><span style="color: black; font-family: 宋体">指令之间的语句。这些指令允许你创建一个基于某些引用（此处为</span><span style="font-size: 8pt; color: black; font-family: Courier">$value</span><span style="color: black; font-family: 宋体">）的循环。</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">&lt;?xml version="1.0" encoding="ISO-8859-1" ?&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">&lt;list&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">#foreach( $value in $list )</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">&lt;number&gt;$value&lt;/number&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">#end</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">&lt;/list&gt;</span></p>
<p style="text-align: left" align="left"><strong><span style="font-size: 9pt; color: black; font-family: Formata-Bold">Listing 5.3 </span></strong><span style="font-size: 9pt; color: black; font-family: Formata-Regular">The servlet example template.</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: Century-Book">Listing 5.4 </span><span style="color: black; font-family: 宋体">向你展示了用于产生</span><span style="color: black; font-family: Century-Book">XML</span><span style="color: black; font-family: 宋体">的</span><span style="color: black; font-family: Century-Book">servlet</span><span style="color: black; font-family: 宋体">代码。正如我们说及的一样，我们将在</span><span style="color: black; font-family: Century-Book">Chapter 12</span><span style="color: black; font-family: 宋体">详细讨论</span><span style="color: black; font-family: Century-Book">Servlets</span><span style="color: black; font-family: 宋体">，这里我们只关注</span><span style="color: black; font-family: Century-Book">Velocity</span><span style="color: black; font-family: 宋体">对象的创建和三个增加到里面的值。用</span><span style="color: black; font-family: Century-Book">context.put("list", v)</span><span style="color: black; font-family: 宋体">语句把整个</span><span style="color: black; font-family: Century-Book">Vector</span><span style="color: black; font-family: 宋体">对象附属到上下文中。</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">import java.util.Vector;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">import javax.servlet.http.HttpServletRequest;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">import javax.servlet.http.HttpServletResponse;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">import org.apache.velocity.Template;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">import org.apache.velocity.context.Context;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">import org.apache.velocity.servlet.VelocityServlet;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">import org.apache.velocity.exception.ResourceNotFoundException;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">import org.apache.velocity.exception.ParseErrorException;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">public class VelocityServletExample extends VelocityServlet {</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">public Template handleRequest( HttpServletRequest request,</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">HttpServletResponse response,</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">Context context ) {</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">Vector v = new Vector();</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">v.add("one");</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">v.add("two");</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">v.add("three");</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">context.put("list", v);</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">Template template = null;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">try {</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">template = getTemplate("displaylist.vm");</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">} catch( Exception e ) {</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">System.out.println("Error " + e);</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">}</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">return template;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">}</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">}</span></p>
<p style="text-align: left" align="left"><strong><span style="font-size: 9pt; color: black; font-family: Formata-Bold">Listing 5.4 </span></strong><span style="font-size: 9pt; color: black; font-family: Formata-Regular">The servlet code for our example.</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">一旦</span><span style="color: black; font-family: Century-Book">vector</span><span style="color: black; font-family: 宋体">被放置到上下文对象中，就需要从本地磁盘上获取用于显示上下文信息的模板。现在不再使用模板对象的</span><span style="color: black; font-family: Century-Book">merge()</span><span style="color: black; font-family: 宋体">方法进行合并操作，而是简单的返回模板。这个模板实际上不会直接返回给用户，而是在后台对&#8220;被返回来的&#8221;模板和上下文进行合并处理，并返回给用户一个</span><span style="color: black; font-family: Century-Book">XML</span><span style="color: black; font-family: 宋体">的类型的内容。在</span><span style="color: black; font-family: Century-Book">Figure 5.2</span><span style="color: black; font-family: 宋体">里，你可以看到由</span><span style="color: black; font-family: Century-Book">Servlets</span><span style="color: black; font-family: 宋体">和模板创建的</span><span style="color: black; font-family: Century-Book">XML</span><span style="color: black; font-family: 宋体">输出。如果需要，你也可以使用</span><span style="color: black; font-family: Century-Book">Velocity</span><span style="color: black; font-family: 宋体">向用户的浏览器输出</span><span style="color: black; font-family: Century-Book">HTML</span><span style="color: black; font-family: 宋体">。</span></p>
<p style="text-align: left" align="left"><strong><span style="font-size: 9pt; color: black; font-family: Formata-Bold"><img height="306" alt="" src="http://www.blogjava.net/images/blogjava_net/kingwee/52.gif" width="554" border="0" /><br />
Figure 5.2 </span></strong><span style="font-size: 9pt; color: black; font-family: Formata-Regular">The servlet and template example output.</span></p>
<p style="text-align: left" align="left"><strong><span style="font-size: 15pt; color: black; font-family: 宋体">本章小节和下章介绍</span></strong></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">在这一章里，我们向你展示了如何用</span><span style="color: black; font-family: Century-Book">Velocity</span><span style="color: black; font-family: 宋体">来书写</span><span style="color: black; font-family: Century-Book">Hello World</span><span style="color: black; font-family: 宋体">独立应用程序。你可以使用</span><span style="color: black; font-family: Century-Book">Velocity</span><span style="color: black; font-family: 宋体">来开发独立应用程序和</span><span style="color: black; font-family: Century-Book">WEB</span><span style="color: black; font-family: 宋体">应用。在下一章里，我们将开始详细介绍</span><span style="color: black; font-family: Century-Book">Velocity</span><span style="color: black; font-family: 宋体">，并学习它与其他语言不一样的特性。</span></p>
</div>
<img src ="http://www.blogjava.net/kingwee/aggbug/233924.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kingwee/" target="_blank">KINGWEE</a> 2008-10-13 00:42 <a href="http://www.blogjava.net/kingwee/articles/233924.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>CHAPTER 4 安装Velocity</title><link>http://www.blogjava.net/kingwee/articles/233868.html</link><dc:creator>KINGWEE</dc:creator><author>KINGWEE</author><pubDate>Sun, 12 Oct 2008 07:49:00 GMT</pubDate><guid>http://www.blogjava.net/kingwee/articles/233868.html</guid><wfw:comment>http://www.blogjava.net/kingwee/comments/233868.html</wfw:comment><comments>http://www.blogjava.net/kingwee/articles/233868.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kingwee/comments/commentRss/233868.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kingwee/services/trackbacks/233868.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 读完之前的介绍性章节之后，你已经不再担忧开始使用Velocity来开发WEB页和独立应用程序了。在你开始钻研语言和应用示例之前，你必须完全设置和配置好开发环境。在这一章里，我们将介绍Velocity的首要条件，同时向你说明如何获取、安装和测试Velocity。我们也将介绍本书示例（依赖于Servlets的示例）将要用到的应用程序服务器的安装过程。如果你是一个开发者，不要担心，我们计划慢慢地对整个安...&nbsp;&nbsp;<a href='http://www.blogjava.net/kingwee/articles/233868.html'>阅读全文</a><img src ="http://www.blogjava.net/kingwee/aggbug/233868.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kingwee/" target="_blank">KINGWEE</a> 2008-10-12 15:49 <a href="http://www.blogjava.net/kingwee/articles/233868.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>CHAPTER 3 Velocity介绍</title><link>http://www.blogjava.net/kingwee/articles/233815.html</link><dc:creator>KINGWEE</dc:creator><author>KINGWEE</author><pubDate>Sat, 11 Oct 2008 16:23:00 GMT</pubDate><guid>http://www.blogjava.net/kingwee/articles/233815.html</guid><wfw:comment>http://www.blogjava.net/kingwee/comments/233815.html</wfw:comment><comments>http://www.blogjava.net/kingwee/articles/233815.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kingwee/comments/commentRss/233815.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kingwee/services/trackbacks/233815.html</trackback:ping><description><![CDATA[&nbsp; <span style="color: black; font-family: 宋体">在</span><span style="color: black; font-family: Century-Book">Chapter 2</span><span style="color: black; font-family: 宋体">里，你已经了解了</span><span style="color: black; font-family: Century-Book">WEB</span><span style="color: black; font-family: 宋体">开发者（负责界面设计）和</span><span style="color: black; font-family: Century-Book">WEB</span><span style="color: black; font-family: 宋体">设计者（负责商业逻辑设计）是如何在一起配合工作的，你也看到了</span><span style="color: black; font-family: Century-Book">ASP</span><span style="color: black; font-family: 宋体">、</span><span style="color: black; font-family: Century-Book">JSP</span><span style="color: black; font-family: 宋体">和</span><span style="color: black; font-family: Century-Book">PHP</span><span style="color: black; font-family: 宋体">语言是如何在后台操作数据的。在这一章里，我们将开始</span><span style="color: black; font-family: Century-Book">Velocity</span><span style="color: black; font-family: 宋体">的探索之旅，并了解它是如何工作的。</span>
<p style="text-align: left" align="left"><strong><span style="font-size: 15pt; color: black; font-family: Formata-Medium">Velocity</span></strong><strong><span style="font-size: 15pt; color: black; font-family: 宋体">是什么</span></strong><strong><span style="font-size: 15pt; color: black; font-family: Formata-Medium">?</span></strong></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: Century-Book">Velocity</span><span style="color: black; font-family: 宋体">是一种让</span><span style="color: black; font-family: Century-Book">WEB</span><span style="color: black; font-family: 宋体">设计者易于掌握和使用的模板语言，主要目的是简化</span><span style="color: black; font-family: Century-Book">WEB</span><span style="color: black; font-family: 宋体">动态页面的开发。为了获取这种语言的支持，你需要</span><span style="color: black; font-family: Century-Book">JAVA</span><span style="color: black; font-family: 宋体">基础类集合，才能在</span><span style="color: black; font-family: Century-Book">MVC</span><span style="color: black; font-family: 宋体">的</span><span style="color: black; font-family: Century-Book">MODEL</span><span style="color: black; font-family: 宋体">模型和</span><span style="color: black; font-family: Century-Book">VIEW</span><span style="color: black; font-family: 宋体">组件之间搭建一座桥梁。</span><span style="color: black; font-family: Century-Book">Velocity</span><span style="color: black; font-family: 宋体">最重要的一个特性就是它仅仅通过一组简单的语法（</span><span style="color: black; font-family: Century-Book">WEB</span><span style="color: black; font-family: 宋体">设计者用于显示内容的语法）就能清晰地把</span><span style="color: black; font-family: Century-Book">VIEW</span><span style="color: black; font-family: 宋体">和其他</span><span style="color: black; font-family: Century-Book">MVC</span><span style="color: black; font-family: 宋体">组件之间区别开了。同时，</span><span style="color: black; font-family: Century-Book">JAVA</span><span style="color: black; font-family: 宋体">编程人员只需集中精力关注应用的后台逻辑就行。</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: Century-Book">Velocity</span><span style="color: black; font-family: 宋体">不但可以用于开发</span><span style="color: black; font-family: Century-Book">WEB</span><span style="color: black; font-family: 宋体">页面，也可以用于开发独立运行的应用程序。它不仅能够输出</span><span style="color: black; font-family: Century-Book">HTML</span><span style="color: black; font-family: 宋体">，也能输出其他类型的内容，比如：源代码、</span><span style="color: black; font-family: Century-Book">SQL</span><span style="color: black; font-family: 宋体">或</span><span style="color: black; font-family: Century-Book">XML</span><span style="color: black; font-family: 宋体">。</span><span style="color: black; font-family: Century-Book">Velocity</span><span style="color: black; font-family: 宋体">的一些主要功能如下：</span></p>
<p style="text-align: left" align="left"><span style="font-size: 6pt; color: black; font-family: ZapfDingbats">■</span><span style="color: black; font-family: 宋体">包括用于操作页面内容的</span><span style="color: black; font-family: Century-Book">LOOP</span><span style="color: black; font-family: 宋体">、条件语句的模板语言</span></p>
<p style="text-align: left" align="left"><span style="font-size: 6pt; color: black; font-family: ZapfDingbats">■ </span><span style="color: black; font-family: 宋体">访问</span><span style="color: black; font-family: Century-Book">JAVA</span><span style="color: black; font-family: 宋体">对象方法</span></p>
<p style="text-align: left" align="left"><span style="font-size: 6pt; color: black; font-family: ZapfDingbats">■ </span><span style="color: black; font-family: 宋体">直接支持</span><span style="color: black; font-family: Century-Book">Turbine Web </span><span style="color: black; font-family: 宋体">应用框架</span></p>
<p style="text-align: left" align="left"><span style="font-size: 6pt; color: black; font-family: ZapfDingbats">■ </span><span style="color: black; font-family: 宋体">利用</span><span style="color: black; font-family: Century-Book">Anakia</span><span style="color: black; font-family: 宋体">转换</span><span style="color: black; font-family: Century-Book">XML</span><span style="color: black; font-family: 宋体">到其他格式的内容</span></p>
<p style="text-align: left" align="left"><span style="font-size: 6pt; color: black; font-family: ZapfDingbats">■ </span><span style="color: black; font-family: Century-Book">Texan</span></p>
<p style="text-align: left" align="left"><span style="font-size: 6pt; color: black; font-family: ZapfDingbats">■ </span><span style="color: black; font-family: 宋体">直接支持</span><span style="color: black; font-family: Century-Book">servlets </span></p>
<p style="text-align: left" align="left"><strong><span style="font-size: 15pt; color: black; font-family: 宋体">它是如何工作的？</span></strong></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">为了对</span><span style="color: black; font-family: Century-Book">Velocity</span><span style="color: black; font-family: 宋体">有所了解，让我们考虑一下这个应用，该应用允许用户显示他们的个人详细信息。让我们假定在这个示例中，用户已经登录到这个应用系统，这里，我们需要创建一个显示页面来显示用户的登录信息。</span></p>
<p style="text-align: left" align="left"><strong><span style="font-size: 13.5pt; color: black; font-family: 宋体">页面设计</span></strong></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">在</span><span style="color: black; font-family: Century-Book">MVC</span><span style="color: black; font-family: 宋体">架构里，</span><span style="color: black; font-family: Century-Book">WEB</span><span style="color: black; font-family: 宋体">设计者负责设计界面，</span><span style="color: black; font-family: Century-Book">WEB</span><span style="color: black; font-family: 宋体">开发者负责后台逻辑，并确保设计者所设计的页面能够正确显示所需要的数据。第一步就是由</span><span style="color: black; font-family: Century-Book">WEB</span><span style="color: black; font-family: 宋体">设计者完成可视化布局设计，设计者使用</span><span style="color: black; font-family: Century-Book">HTML</span><span style="color: black; font-family: 宋体">标记创建一个包含了全部所需图片和文本的页面，对于动态信息，比如用户的</span><span style="color: black; font-family: Century-Book">account</span><span style="color: black; font-family: 宋体">号和地址等，设计者使用占位符进行替代（比如：</span><span style="color: black; font-family: Century-Book">&lt;**user account name**&gt;</span><span style="color: black; font-family: 宋体">）。</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">&lt;HTML&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">&lt;HEAD&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">&lt;img src="header.jpg"&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">&lt;/HEAD&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">&lt;BODY&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">Hello, &lt;**user account name**&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">&lt;/BODY&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">&lt;/HTML&gt;</span></p>
<p style="text-align: left" align="left"><strong><span style="font-size: 9pt; color: black; font-family: Formata-Bold">Listing 3.1 </span></strong><span style="font-size: 9pt; color: black; font-family: Formata-Regular">The designer page example.</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">第二步，一旦完成页面可视化设计，设计者就应该和开发者召开一次会议，对动态内容（所使用的变量名称）进行讨论和确定，以保证页面能够正确显示。</span></p>
<p style="text-align: left" align="left"><strong><span style="font-size: 13.5pt; color: black; font-family: 宋体">获到正确的信息</span></strong></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">在设计者和开发者之间召开的会议必须明确页面中需要插入动态内容的变量名称。这些变量名称将决定最终页面能否正确显示。</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">由于我们是使用</span><span style="color: black; font-family: Century-Book">MVC</span><span style="color: black; font-family: 宋体">方式进行设计的，并且我们已经知道把</span><span style="color: black; font-family: Century-Book">JAVA</span><span style="color: black; font-family: 宋体">代码放入</span><span style="color: black; font-family: Century-Book">WEB</span><span style="color: black; font-family: 宋体">页面来获得内容不是正确的选择。</span><span style="color: black; font-family: Century-Book">Velocity</span><span style="color: black; font-family: 宋体">为</span><span style="color: black; font-family: Century-Book">WEB</span><span style="color: black; font-family: 宋体">设计者提供了一个脚本级的工作环境，它通过在</span><span style="color: black; font-family: Century-Book">HTML</span><span style="color: black; font-family: 宋体">代码里放置脚本元素来产生一个模板。这些脚本元素由逻辑语句和访问</span><span style="color: black; font-family: Century-Book">JAVA</span><span style="color: black; font-family: 宋体">对象的语法组成（比如</span><span style="color: black; font-family: Century-Book">loops</span><span style="color: black; font-family: 宋体">和条件语句）。我们不要指望从</span><span style="color: black; font-family: Century-Book">VIEW</span><span style="color: black; font-family: 宋体">组件里直接访问</span><span style="color: black; font-family: Century-Book">MODEL</span><span style="color: black; font-family: 宋体">模型组件，因此</span><span style="color: black; font-family: Century-Book">Velocity</span><span style="color: black; font-family: 宋体">需要一个可以在</span><span style="color: black; font-family: Century-Book">MVC</span><span style="color: black; font-family: 宋体">各层之间传递数据，并且名叫上下文（</span><em><span style="color: black; font-family: Century-Book">Context</span></em><span style="color: black; font-family: 宋体">）的集合。这个上下文对象内保存着控制器和模型组件，并提供给</span><span style="color: black; font-family: Century-Book">WEB</span><span style="color: black; font-family: 宋体">页模板。</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: Century-Book">Velocity</span><span style="color: black; font-family: 宋体">实现代码负责解析模板，并且用从上下文对象中获取的文本内容替换所有的</span><span style="color: black; font-family: Century-Book">Velocity</span><span style="color: black; font-family: 宋体">脚本元素。一旦</span><span style="color: black; font-family: Century-Book">WEB</span><span style="color: black; font-family: 宋体">设计者使用来自上下文的对象，这儿肯定需要一个设计者和开发者都理解的上下文对象名字约定。任何名字的不一致都将导致错误，这是因为</span><span style="color: black; font-family: Century-Book">Velocity</span><span style="color: black; font-family: 宋体">是通过引用网页模板中的对象名字来进行数据传递的。</span></p>
<p style="text-align: left" align="left"><strong><span style="font-size: 13.5pt; color: black; font-family: 宋体">对信息进行编码</span></strong><strong><span style="font-size: 13.5pt; color: black; font-family: Formata-Medium">Coding the Information</span></strong></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">在设计者和开发者进行会议结束后，双方都将回去完成</span><span style="color: black; font-family: Century-Book">WEB</span><span style="color: black; font-family: 宋体">开发最后的部分。在这一步中，</span><span style="color: black; font-family: Century-Book">MVC</span><span style="color: black; font-family: 宋体">框架的优势是很明显的，因为设计者只需在</span><span style="color: black; font-family: Century-Book">WEB</span><span style="color: black; font-family: 宋体">模板中增加脚本元素并加入双方约定的名称，而开发者则将开发焦点集中于如何返回约定名称的内容上。</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">对于开发者来讲，只有很少的工作需要去做，比如将新的页面集成到当前框架、确认当前用户的需要的信息（如：</span><span style="color: black; font-family: Century-Book">account number</span><span style="color: black; font-family: 宋体">）是正确可用的，同时把设计者需要的数据放入上下文中。要注意的是，我们不能放弃前两步工作而直接跳到第三步上。</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">在许多以</span><span style="color: black; font-family: Century-Book">JAVA</span><span style="color: black; font-family: 宋体">为基础的</span><span style="color: black; font-family: Century-Book">MVC</span><span style="color: black; font-family: 宋体">应用中，用户实际浏览的页面是基于</span><span style="color: black; font-family: Century-Book">Servlet</span><span style="color: black; font-family: 宋体">的。</span><span style="color: black; font-family: Century-Book">Servlet</span><span style="color: black; font-family: 宋体">担当了</span><span style="color: black; font-family: Century-Book">MVC</span><span style="color: black; font-family: 宋体">中的控制器角色。数据实体一般表现为模型，</span><span style="color: black; font-family: Century-Book">Session Bean</span><span style="color: black; font-family: 宋体">可能考虑为控制器。控制器或</span><span style="color: black; font-family: Century-Book">Servlet</span><span style="color: black; font-family: 宋体">负责把数据加入到上下文中。</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">一旦进行上下文和当前用户必须的动态数据的组装时（</span><span style="color: black; font-family: Century-Book">populate</span><span style="color: black; font-family: 宋体">），开发者需要确定当前用户所请求使用的模板，然后将上下文中的数据并入模板中，最后生成</span><span style="color: black; font-family: Century-Book">HTML</span><span style="color: black; font-family: 宋体">输出。</span><span style="color: black; font-family: Century-Book">Listing 3.2 </span><span style="color: black; font-family: 宋体">显示了开发者在编码中必须要创建的基本语句。</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">Velocity.init();</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">VelocityContext context = new VelocityContext();</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">context.put( "name", new String("Jane Doe") );</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">Template template = Velocity.getTemplate("account.vm");</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">StringWriter sw = new StringWriter();</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">template.merge( context, sw );</span></p>
<p style="text-align: left" align="left"><strong><span style="font-size: 9pt; color: black; font-family: Formata-Bold">Listing 3.2 </span></strong><span style="font-size: 9pt; color: black; font-family: Formata-Regular">Developer code for Velocity.</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">在</span><span style="color: black; font-family: Century-Book">Listing 3.2</span><span style="color: black; font-family: 宋体">里，开发者首先要进行</span><span style="color: black; font-family: Century-Book">Velocity</span><span style="color: black; font-family: 宋体">初始化工作，随后需要创建一个新的上下文。通过上下文的</span><span style="color: black; font-family: Century-Book">put()</span><span style="color: black; font-family: 宋体">方法将一个字符串对象指派给关键字</span><span style="color: black; font-family: Century-Book">&#8220;name&#8221;</span><span style="color: black; font-family: 宋体">，并且将字符串值</span><span style="color: black; font-family: Century-Book">"Jane Doe"</span><span style="color: black; font-family: 宋体">粘贴到上下文中（此处的关键字</span><span style="color: black; font-family: Century-Book">&#8220;name&#8221;</span><span style="color: black; font-family: 宋体">是先前设计者和开发者开会是约定的名称）。接着，使用</span><span style="color: black; font-family: Century-Book">getTemplate()</span><span style="color: black; font-family: 宋体">方法获得（设计者创建的）模板。然后，用</span><span style="color: black; font-family: Century-Book">StringWriter</span><span style="color: black; font-family: 宋体">来处理</span><span style="color: black; font-family: Century-Book">HTML</span><span style="color: black; font-family: 宋体">输出。最后，模板和上下文被</span><span style="color: black; font-family: Century-Book">merge()</span><span style="color: black; font-family: 宋体">方法合并到一起，并将最后的合并结果传送到</span><span style="color: black; font-family: Century-Book">StringWriter</span><span style="color: black; font-family: 宋体">对象中保存，用于最后输入。</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">在这个示例中，许多细节被忽略。在下一节里，我们将用图例的方式来说明开发者为提供模板所需要的动态信息必须要做的工作。这在个示例里，我们指派了一个简单的字符串对象给上下文，同时也介绍了复合对象和如何使用</span><span style="color: black; font-family: Century-Book">Velocity</span><span style="color: black; font-family: 宋体">来访问对象的属性和方法。</span></p>
<p style="text-align: left" align="left"><strong><span style="font-size: 13.5pt; color: black; font-family: 宋体">显示信息</span></strong><strong><span style="font-size: 13.5pt; color: black; font-family: Formata-Medium">Displaying the Information</span></strong></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">设计者或许可以很轻松的对已经设置好上下文和</span><span style="color: black; font-family: Century-Book">API</span><span style="color: black; font-family: 宋体">的页面进行处理。使用</span><span style="color: black; font-family: Century-Book">Velocity</span><span style="color: black; font-family: 宋体">模板语言（更广泛的讨论在</span><span style="color: black; font-family: Century-Book">Chapter 6</span><span style="color: black; font-family: 宋体">里），所有的动态信息占位符被</span><span style="color: black; font-family: Century-Book">Listing 3.3</span><span style="color: black; font-family: 宋体">所示的代码（</span><span style="font-size: 8pt; color: black; font-family: Courier">$name</span><span style="color: black; font-family: 宋体">）替换。</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">&lt;HTML&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">&lt;HEAD&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">&lt;img src="header.jpg"&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">&lt;/HEAD&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">&lt;BODY&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">Hello, $name</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">&lt;/BODY&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">&lt;/HTML&gt;</span></p>
<p style="text-align: left" align="left"><strong><span style="font-size: 9pt; color: black; font-family: Formata-Bold">Listing 3.3</span></strong><span style="font-size: 9pt; color: black; font-family: Formata-Regular"> Velocity Web</span><span style="font-size: 9pt; color: black; font-family: 宋体">页示例</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">在这里，用户名占位符被</span><span style="color: black; font-family: Century-Book">Velocity</span><span style="color: black; font-family: 宋体">语句</span><span style="color: black; font-family: Century-Book">$name</span><span style="color: black; font-family: 宋体">替换。当这个模板被上下文合并时，</span><span style="color: black; font-family: Century-Book">$name</span><span style="color: black; font-family: 宋体">将被上下文中的名叫</span><span style="color: black; font-family: Century-Book">$name</span><span style="color: black; font-family: 宋体">的对象的值替换。</span></p>
<p style="text-align: left" align="left"><strong><span style="font-size: 15pt; color: black; font-family: Formata-Medium">Velocity </span></strong><strong><span style="font-size: 15pt; color: black; font-family: 宋体">特性</span></strong></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">在这个示例里，我们看到了如何使用一个在</span><span style="color: black; font-family: Century-Book">Velocity</span><span style="color: black; font-family: 宋体">里定义的简单脚本元素和上下文来产生一个动态</span><span style="color: black; font-family: Century-Book">WEB</span><span style="color: black; font-family: 宋体">页面的过程，这些定义都在</span><span style="color: black; font-family: Century-Book">MVC</span><span style="color: black; font-family: 宋体">框架范围内。</span><span style="color: black; font-family: Century-Book">Velocity</span><span style="color: black; font-family: 宋体">包含了许多别的特性，在这里，我们将通过以下介绍来了解其大概情况：</span></p>
<p style="text-align: left" align="left"><strong><span style="color: black; font-family: Century-Bold">References</span></strong><span style="color: black; font-family: Century-Book">—Velocity</span><span style="color: black; font-family: 宋体">包含了三种类型的引用：变量、属性和方法。</span></p>
<p style="text-indent: 21pt; text-align: left" align="left"><em><span style="color: black; font-family: 宋体">变量</span></em><span style="color: black; font-family: 宋体">以</span><span style="color: black; font-family: Century-Book">$</span><span style="color: black; font-family: 宋体">符号开始，后紧跟英文符号或数字来进行定义。变量的值来自上下文同名的对象或直接量（</span><span style="color: black; font-family: Century-Book">Set idrective</span><span style="color: black; font-family: 宋体">）。</span></p>
<p style="text-indent: 21pt; text-align: left" align="left"><em><span style="color: black; font-family: 宋体">属性</span></em><span style="color: black; font-family: 宋体">以</span><span style="color: black; font-family: Century-Book">$</span><span style="color: black; font-family: 宋体">符号开始，后紧跟英文符号或数字，而后是一点</span><span style="color: black; font-family: Century-Book">&#8221;.&#8221;</span><span style="color: black; font-family: 宋体">，最后跟上别的定义。属性引用自上下文中</span><span style="color: black; font-family: Century-Book">JAVA</span><span style="color: black; font-family: 宋体">对象的属性或调用对象方法返回的值。方法的定义必须是</span><span style="color: black; font-family: Century-Book">get&lt;</span><span style="color: black; font-family: 宋体">定义</span><span style="color: black; font-family: Century-Book">&gt;</span><span style="color: black; font-family: 宋体">这种格式。</span></p>
<p style="text-indent: 21pt; text-align: left" align="left"><em><span style="color: black; font-family: 宋体">方法</span></em><span style="color: black; font-family: 宋体">以</span><span style="color: black; font-family: Century-Book">$</span><span style="color: black; font-family: 宋体">符号开始，后紧跟英文符号或数字，而后是一点</span><span style="color: black; font-family: Century-Book">&#8221;.&#8221;</span><span style="color: black; font-family: 宋体">，</span><span style="color: black; font-family: 宋体">最后跟上别的定义和方法体（比如</span><span style="color: black; font-family: Century-Book"> (&lt;parameter&gt;)</span><span style="color: black; font-family: 宋体">）。</span><span style="color: black; font-family: Century-Book">A call is made to the exact method identifier specified</span><span style="color: black; font-family: 宋体">（此句未译）。</span></p>
<p style="text-align: left" align="left"><strong><span style="color: black; font-family: Century-Bold">Directives</span></strong><strong><span style="color: black; font-family: 宋体">指令</span></strong><span style="color: black; font-family: Century-Book">—Velocity</span><span style="color: black; font-family: 宋体">指令允许</span><span style="color: black; font-family: Century-Book">WEB</span><span style="color: black; font-family: 宋体">设计者控制所有引用。脚本元素包括</span><span style="color: black; font-family: Century-Book">set(</span><span style="color: black; font-family: 宋体">为变量名指定值或叫直接量</span><span style="color: black; font-family: Century-Book">)</span><span style="color: black; font-family: 宋体">、</span><span style="color: black; font-family: Century-Book">loop</span><span style="color: black; font-family: 宋体">控制、条件和</span><span style="color: black; font-family: Century-Book">include</span><span style="color: black; font-family: 宋体">指令。</span></p>
<p style="text-align: left" align="left"><strong><span style="color: black; font-family: Century-Bold">Velocimacros Velocity</span></strong><strong><span style="color: black; font-family: 宋体">宏</span></strong><span style="color: black; font-family: Century-Book">—Velocimacro</span><span style="color: black; font-family: 宋体">允许设计者构建多次重复使用的</span><span style="color: black; font-family: Century-Book">HTML</span><span style="color: black; font-family: 宋体">和</span><span style="color: black; font-family: Century-Book">Velocity</span><span style="color: black; font-family: 宋体">脚本元素宏。</span></p>
<p style="text-align: left" align="left"><strong><span style="color: black; font-family: Century-Bold">Logging</span></strong><strong><span style="color: black; font-family: 宋体">日志</span></strong><span style="color: black; font-family: Century-Book">—Velocity</span><span style="color: black; font-family: 宋体">利用</span><span style="color: black; font-family: Century-Book">log4J</span><span style="color: black; font-family: 宋体">系统来产生日志。</span></p>
<p style="text-align: left" align="left"><strong>&nbsp;</strong></p>
<p style="text-align: left" align="left"><strong><span style="color: black; font-family: Century-Bold">Resource loaders</span></strong><strong><span style="color: black; font-family: 宋体">资源加载</span></strong><span style="color: black; font-family: Century-Book">—The resource loaders give you control over the templates used in the production of Web pages</span><span style="color: black; font-family: 宋体">（此句未译）</span><span style="color: black; font-family: Century-Book">.</span></p>
<p style="text-align: left" align="left"><strong><span style="color: black; font-family: Century-Bold">Anakia</span></strong><span style="color: black; font-family: Century-Book">—</span><span style="color: black; font-family: 宋体">这是一个示例应用，它允许使用</span><span style="color: black; font-family: Century-Book">Velocity</span><span style="color: black; font-family: 宋体">代替</span><span style="color: black; font-family: Century-Book">XSL </span><span style="color: black; font-family: 宋体">（</span><span style="color: black; font-family: Century-Book">Extensible Stylesheet Language</span><span style="color: black; font-family: 宋体">）来处理</span><span style="color: black; font-family: Century-Book">XML</span><span style="color: black; font-family: 宋体">。</span></p>
<p style="margin-left: 5.15pt; text-indent: -5.15pt; text-align: left" align="left"><strong><span style="color: black; font-family: Century-Bold">Application servers</span></strong><strong><span style="color: black; font-family: 宋体">应用服务器</span></strong><span style="color: black; font-family: Century-Book">—Velocity</span><span style="color: black; font-family: 宋体">支持所有主流的应用服务器和</span><span style="color: black; font-family: Century-Book">Servlet</span><span style="color: black; font-family: 宋体">，比如</span><span style="color: black; font-family: Century-Book">Resin, Tomcat, </span><span style="color: black; font-family: 宋体">和</span><span style="color: black; font-family: Century-Book"> BEA WebLogic</span><span style="color: black; font-family: 宋体">等。</span></p>
<p style="text-align: left" align="left"><strong><span style="font-size: 15pt; color: black; font-family: 宋体">本章小节和下章介绍</span></strong></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">在这一章里，我们提供了一个</span><span style="color: black; font-family: Century-Book">Velocity</span><span style="color: black; font-family: 宋体">系统的快速浏览，解释了设计者和开发者是如何使用</span><span style="color: black; font-family: Century-Book">Velocity</span><span style="color: black; font-family: 宋体">的。在下一章里，我们将开始学习</span><span style="color: black; font-family: Century-Book">Velocity</span><span style="color: black; font-family: 宋体">和相关软件的安装。</span></p>
<img src ="http://www.blogjava.net/kingwee/aggbug/233815.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kingwee/" target="_blank">KINGWEE</a> 2008-10-12 00:23 <a href="http://www.blogjava.net/kingwee/articles/233815.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>CHAPTER 2 MVC 基本原理</title><link>http://www.blogjava.net/kingwee/articles/233803.html</link><dc:creator>KINGWEE</dc:creator><author>KINGWEE</author><pubDate>Sat, 11 Oct 2008 14:51:00 GMT</pubDate><guid>http://www.blogjava.net/kingwee/articles/233803.html</guid><wfw:comment>http://www.blogjava.net/kingwee/comments/233803.html</wfw:comment><comments>http://www.blogjava.net/kingwee/articles/233803.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kingwee/comments/commentRss/233803.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kingwee/services/trackbacks/233803.html</trackback:ping><description><![CDATA[&nbsp;
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">如果你已经充分了解</span><span style="color: black; font-family: Century-Book">Internet</span><span style="color: black; font-family: 宋体">，你或许会像我一样，准备开始传统的软件开发。在此之前，我们最好先学一下方法学，以便为今后的开发节约更多的时间。</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">不同的开发人员（比如页面设计者和代码开发者）完成不同的开发任务，尽量避免交叉，这样做可以起到事半功倍的效果。</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">在这一节，我们将公正的深入讨论一下混杂式编程，同时介绍</span><span style="color: black; font-family: Century-Book">MVC</span><span style="color: black; font-family: 宋体">方法学，并介绍</span><span style="color: black; font-family: Century-Book">MVC</span><span style="color: black; font-family: 宋体">是如何解决混杂式编程问题的。</span></p>
<p style="text-align: left" align="left"><strong><span style="font-size: 15pt; color: black; font-family: 宋体">混合呈现和逻辑</span></strong></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">在此，我们创建了一个嵌入数据库调用脚本的</span><span style="color: black; font-family: Century-Book">WEB</span><span style="color: black; font-family: 宋体">页面，并对它进行分析。</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">&lt;%@ page language='java' import='java.sql.*' %&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">&lt;HTML&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">&lt;HEAD&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">&lt;TITLE&gt;Test&lt;/TITLE&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">&lt;/HEAD&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">&lt;%</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">ResultSet rs;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">try {</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">Class.forName("com.mysql.jdbc.Driver");</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">connection = DriverManager.getConnection(</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">"jdbc:mysql://localhost/products");</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">statement = connection.createStatement();</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">%&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">&lt;BODY&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">&lt;%</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">if (request.getParameter("submit") = "submit") {</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">rs = statement.executeQuery("SELECT username, password,</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">city, state FROM product where username = " +</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">request.getParameter("username"));</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">if (rs.next()) {</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">%&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">&lt;form action="test.jsp" method="post"&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">&lt;input type="text" name="username"</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">value="&lt;%= rs.getString("username") %&gt;"&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">&lt;input type="text" name="password"</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">value="&lt;%= rs.getString("password") %&gt;"&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">&lt;input type="text" name="city"</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">value="&lt;%= rs.getString("city") %&gt;"&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">&lt;input type="text" name="state"</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">value="&lt;%= rs.getString("state") %&gt;"&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">&lt;input type="submit" name="submit" value="Update"&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">&lt;/form&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">&lt;% } else { %&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">No Information</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">&lt;% }</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">}</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">%&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">else if (request.getParameter("submit") = "update") {</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">statement.executeUpdate("UPDATE product set password= '"</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">+ request.getParameter("password") + "'" +</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">", city = '" + request.getParameter("city") + "'" +</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">", state = '" + request.getParameter("state") + "'" +</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">"where username = '" +</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">request.getParameter("username"));</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">}</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">} catch(ClassNotFoundException e) {</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">out.println("Driver Error");</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">} catch(SQLException e) {</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">out.println("SQLException: " + e.getMessage());</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">}</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">%&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">&lt;form action="test.jsp" method="post"&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">&lt;input type="text" name="username"&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">&lt;input type="text" name="password"&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">&lt;input type="text" name="city"&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">&lt;input type="text" name="state"&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">&lt;input type="submit" name="submit" value="Submit"&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">&lt;/form&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">&lt;/BODY&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">&lt;/HTML&gt;</span></p>
<p style="text-align: left" align="left"><strong><span style="font-size: 9pt; color: black; font-family: Formata-Bold">Listing 2.1 <span style="font-weight: normal; font-family: Formata-Regular">A</span><span style="font-weight: normal; font-family: Formata-Regular"> mixed presentation logic page. </span></span></strong></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">以上代码是</span><span style="color: black; font-family: Century-Book">JSP</span><span style="color: black; font-family: 宋体">页面的一个混合</span><span style="color: black; font-family: Century-Book">VIEW</span><span style="color: black; font-family: 宋体">呈现和逻辑很好的例子，让我们来考虑以下几个在使用这个页面时必须面对的问题。</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">作为一个开发者，假设公司让你去创建一个简单的</span><span style="color: black; font-family: Century-Book">HTML</span><span style="color: black; font-family: 宋体">窗体，以接收或显示用户名细节情况。这个需求的改变将导致你需要从复杂的页面代码中分离出商业逻辑逻辑，并在适应的位置增加新逻辑。</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">当然，并非所有的页面都这么简单，有些时候，需要在页面中增加一些图片时。对代码开发者来说，由于他对界面设计不太了解，最终结果将导致页面非常难看；对页面设计者来说，由于他不了解</span><span style="color: black; font-family: Century-Book">JAVA</span><span style="color: black; font-family: 宋体">代码，最终可能出现程序不能运行的结果。</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">最后的结果就页面将难以维护和继续。</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">我希望这个故事对你来讲最好不要成为现实，但现实的情况恬恬如此。</span></p>
<p style="text-align: left" align="left"><strong><span style="font-size: 15pt; color: black; font-family: Formata-Medium">Smalltalk-80 MVC</span></strong><strong><span style="font-size: 15pt; color: black; font-family: 宋体">三合一架构</span></strong></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">当</span><span style="color: black; font-family: Century-Book">Smalltalk-80</span><span style="color: black; font-family: 宋体">被大量使用的时候，一种用于分离显示和逻辑的方法就显得非常重要了。进行分离后，前台只负责显示任务，后台负责数据获取和格式化处理，各司其职。下图为</span><span style="color: black; font-family: Century-Book">Smalltalk-80 MVC</span><span style="color: black; font-family: 宋体">三合一架构。<br />
</span></p>
<p style="text-align: left" align="left"><strong><span style="font-size: 9pt; color: black; font-family: Formata-Bold"><img style="border-left-color: #c0c0c0; border-bottom-color: #c0c0c0; border-top-color: #c0c0c0; border-right-color: #c0c0c0" height="340" alt="" src="http://www.blogjava.net/images/blogjava_net/kingwee/image002.gif" width="554" border="0" /><br />
Figure 2.1 </span></strong><span style="font-size: 9pt; color: black; font-family: Formata-Regular">The Smalltalk-80 MVC triad.</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: Century-Book">In Figure 2.1</span><span style="color: black; font-family: 宋体">，我们发现它有三个主要组件：</span><span style="color: black; font-family: Century-Book">model</span><span style="color: black; font-family: 宋体">，</span><span style="color: black; font-family: Century-Book"> view</span><span style="color: black; font-family: 宋体">和</span><span style="color: black; font-family: Century-Book">controller</span><span style="color: black; font-family: 宋体">。下面将对这三者和它们之间的关系进行解释。</span></p>
<p style="text-align: left" align="left"><strong><span style="font-size: 13.5pt; color: black; font-family: Formata-Medium">Model</span></strong></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: Century-Book">MVC</span><span style="color: black; font-family: 宋体">的模型部分通常由以下两部分组成：</span></p>
<p style="text-align: left" align="left"><span style="font-size: 6pt; color: black; font-family: ZapfDingbats">■</span><span style="color: black; font-family: 宋体">类或者别的数据结构，用于呈现系统或应用程序状态</span></p>
<p style="text-align: left" align="left"><span style="font-size: 6pt; color: black; font-family: ZapfDingbats">■</span><span style="color: black; font-family: 宋体">动作</span><span style="color: black; font-family: Century-Book">/</span><span style="color: black; font-family: 宋体">方法，用于改变系统状态</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">在很多情况下，模型用于呈现数据库里的数据。如果你在</span><span style="color: black; font-family: Century-Book">JAVA</span><span style="color: black; font-family: 宋体">中使用</span><span style="color: black; font-family: Century-Book">MVC</span><span style="color: black; font-family: 宋体">，则模型将被创建为</span><span style="color: black; font-family: Century-Book">JavaBeans</span><span style="color: black; font-family: 宋体">，用于访问或加载系统数据。</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">使用模型的最核心想法是为了从用户呈现页面中完全分离数据。意思是模型与所有的输入和输入无关。可以从</span><span style="color: black; font-family: Century-Book">VIEW</span><span style="color: black; font-family: 宋体">和控制器中访问模型。控制器从用户窗体接收输入信息，当信息需要进行加工时，控制器与模型进行交互，以得到适当的数据。</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">为了显示模型的信息，</span><span style="color: black; font-family: Century-Book">VIEW</span><span style="color: black; font-family: 宋体">组件在模型里注册自己。当信息发生改变时，模型通知所有注册了的</span><span style="color: black; font-family: Century-Book">VIEW</span><span style="color: black; font-family: 宋体">，告诉他们信息已经改变，可以获取新的信息并呈现给用户。模型不限于一个</span><span style="color: black; font-family: Century-Book">VIEW</span><span style="color: black; font-family: 宋体">，它可以允许多个</span><span style="color: black; font-family: Century-Book">VIEW</span><span style="color: black; font-family: 宋体">进行注册，并向他们告知系统目前的状态。<br />
</span></p>
<p style="text-align: left" align="left"><strong><span style="font-size: 9pt; color: black; font-family: Formata-Bold"><img height="216" alt="" src="http://www.blogjava.net/images/blogjava_net/kingwee/image004.gif" width="554" border="0" /><br />
Figure 2.2 </span></strong><span style="font-size: 9pt; color: black; font-family: Formata-Regular">Model inputs and outputs.</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">正如你在</span><span style="color: black; font-family: Century-Book">Figure 2.2</span><span style="color: black; font-family: 宋体">里看到的一样，模型主要连接到数据源（可以是数据库、固定格式的文件或一些扩展接口）。模型负责维护数据的真实性和可用性和完整性。其他输入包括</span><span style="color: black; font-family: Century-Book">VIEW</span><span style="color: black; font-family: 宋体">组件更新注册和数据更新通知。</span></p>
<p style="text-align: left" align="left"><strong>&nbsp;</strong></p>
<p style="text-align: left" align="left"><strong><span style="font-size: 13.5pt; color: black; font-family: Formata-Medium">View</span></strong></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">在我们讨论模型的时候已经接触到了</span><span style="color: black; font-family: Century-Book">VIEW</span><span style="color: black; font-family: 宋体">。</span><span style="color: black; font-family: Century-Book">VIEW</span><span style="color: black; font-family: 宋体">组件是一个可视化组件，它用于向用户显示由模型建立的数据。在多数情况下，</span><span style="color: black; font-family: Century-Book">VIEW</span><span style="color: black; font-family: 宋体">被设计成几种格式：比如字符、简单列表或一个组合风格。</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">当用户需要使用模型中的信息时，应用将生成一个新的用于某种特定格式显示数据的</span><span style="color: black; font-family: Century-Book">VIEW</span><span style="color: black; font-family: 宋体">组件，</span><span style="color: black; font-family: Century-Book">VIEW</span><span style="color: black; font-family: 宋体">将在模型里自动注册，以便于在数据或状态发生改变时，模型好通知该生成的</span><span style="color: black; font-family: Century-Book">VIEW</span><span style="color: black; font-family: 宋体">组件。</span><span style="color: black; font-family: Century-Book">VIEW</span><span style="color: black; font-family: 宋体">是如何获取数据的呢？其实，他可以通过调用模型中的特定方法，或接受串行化数据对象。</span><span style="color: black; font-family: Century-Book">VIEW</span><span style="color: black; font-family: 宋体">也可以从控制器中获取数据（下一节，我们将讨论这个问题）。</span></p>
<p style="text-align: left" align="left"><strong><span style="font-size: 13.5pt; color: black; font-family: Formata-Medium">Controller</span></strong></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">控制器组件负责处理所有在应用和用户之间的交互。所有从键盘、鼠标和其他扩展接口的输入都将被发送到控制器组件。使用预先定义的逻辑，控制器确定数据是否需要在模型里更新或是否需要创建一个新的</span><span style="color: black; font-family: Century-Book">VIEW</span><span style="color: black; font-family: 宋体">组件。</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">正如你所了解的一样，一些商业逻辑都包含在控制器和模型里，在</span><span style="color: black; font-family: Century-Book">VIEW</span><span style="color: black; font-family: 宋体">组件里不包含商业逻辑。</span></p>
<p style="text-align: left" align="left"><strong><span style="font-size: 13.5pt; color: black; font-family: Formata-Medium">MVC</span></strong><strong><span style="font-size: 13.5pt; color: black; font-family: 宋体">架构</span></strong></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: Century-Book">MVC</span><span style="color: black; font-family: 宋体">架构在</span><span style="color: black; font-family: Century-Book">Gang</span><span style="color: black; font-family: 宋体">的四本书里都有涉及（</span><em><span style="color: black; font-family: Century-BookItalic">Design Patterns: Elements of Reusable Object-Oriented Software</span></em><span style="color: black; font-family: 宋体">）。在高级语言里建立</span><span style="color: black; font-family: Century-Book">MVC</span><span style="color: black; font-family: 宋体">观念需要做很多工作，比如：</span><span style="color: black; font-family: Century-Book">JAVA</span><span style="color: black; font-family: 宋体">包括两个有个的接口，</span><span style="color: black; font-family: Century-Book">java.util.Observable </span><span style="color: black; font-family: 宋体">和</span><span style="color: black; font-family: Century-Book"> java.util.Observer</span><span style="color: black; font-family: 宋体">，用于监测和通知状态改变。在剩余章节里，我们主要关注</span><span style="color: black; font-family: Century-Book">MVC</span><span style="color: black; font-family: 宋体">在</span><span style="color: black; font-family: Century-Book">WEB</span><span style="color: black; font-family: 宋体">开发中相关的内容。</span></p>
<p style="text-align: left" align="left"><strong><span style="font-size: 15pt; color: black; font-family: Formata-Medium">Sun</span></strong><strong><span style="font-size: 15pt; color: black; font-family: 宋体">模式</span></strong><strong><span style="font-size: 15pt; color: black; font-family: Formata-Medium">1 </span></strong><strong><span style="font-size: 15pt; color: black; font-family: 宋体">和</span></strong><strong><span style="font-size: 15pt; color: black; font-family: Formata-Medium"> 2</span></strong></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">之前，我们讨论了</span><span style="color: black; font-family: Century-Book">Smalltalk-80</span><span style="color: black; font-family: 宋体">的</span><span style="color: black; font-family: Century-Book">MVC</span><span style="color: black; font-family: 宋体">定义，在</span><span style="color: black; font-family: Century-Book">WEB</span><span style="color: black; font-family: 宋体">开发的开初，用于快速开发的新技术不断产生。</span><span style="color: black; font-family: Century-Book">JSP</span><span style="color: black; font-family: 宋体">，一个类似的技术，允许</span><span style="color: black; font-family: Century-Book">WEB</span><span style="color: black; font-family: 宋体">页面从静态内容向动态内容转变。把</span><span style="color: black; font-family: Century-Book">JSP</span><span style="color: black; font-family: 宋体">用于Ｍ</span><span style="color: black; font-family: Century-Book">VC</span><span style="color: black; font-family: 宋体">的模式</span><span style="color: black; font-family: Century-Book">1</span><span style="color: black; font-family: 宋体">时，很不幸，除非你非常小心，一个动态</span><span style="color: black; font-family: Century-Book">WEB</span><span style="color: black; font-family: 宋体">页面看起来像</span><span style="color: black; font-family: Century-Book">Listing 2.1</span><span style="color: black; font-family: 宋体">一样，并且有太多的</span><span style="color: black; font-family: Century-Book">VIEW</span><span style="color: black; font-family: 宋体">和控制器代码混杂在里面。</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">随着</span><span style="color: black; font-family: Century-Book">servlet</span><span style="color: black; font-family: 宋体">的发展，开发者可以把控制器代码建立在动态页面里，并在里面放置自己的组件。这时，</span><span style="color: black; font-family: Century-Book">SUN</span><span style="color: black; font-family: 宋体">提出了模式</span><span style="color: black; font-family: Century-Book">2</span><span style="color: black; font-family: 宋体">，因为在</span><span style="color: black; font-family: Century-Book">MVC</span><span style="color: black; font-family: 宋体">架构里有</span><span style="color: black; font-family: Century-Book">2</span><span style="color: black; font-family: 宋体">个组件被使用。但许多可能需要考虑，其中之一就是模式</span><span style="color: black; font-family: Century-Book">2</span><span style="color: black; font-family: 宋体">和</span><span style="color: black; font-family: Century-Book">MVC</span><span style="color: black; font-family: 宋体">之间如果联系，许多典型的原因就是</span><span style="color: black; font-family: Century-Book">WEB</span><span style="color: black; font-family: 宋体">应用无法利用</span><span style="color: black; font-family: Century-Book">Observer</span><span style="color: black; font-family: 宋体">（监测）模式。</span></p>
<p style="text-align: left" align="left"><strong><span style="font-size: 15pt; color: black; font-family: 宋体">将</span></strong><strong><span style="font-size: 15pt; color: black; font-family: Formata-Medium">MVC</span></strong><strong><span style="font-size: 15pt; color: black; font-family: 宋体">扩展到</span></strong><strong><span style="font-size: 15pt; color: black; font-family: Formata-Medium">WEB</span></strong><strong><span style="font-size: 15pt; color: black; font-family: 宋体">应用</span></strong></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: Century-Book">WEB</span><span style="color: black; font-family: 宋体">站点利用</span><span style="color: black; font-family: Century-Book">HTTP</span><span style="color: black; font-family: 宋体">协议进行数据传递。当用户访问</span><span style="color: black; font-family: Century-Book">WEB</span><span style="color: black; font-family: 宋体">站点时，单击按钮或链接将向</span><span style="color: black; font-family: Century-Book">WEB</span><span style="color: black; font-family: 宋体">服务器发送一个</span><span style="color: black; font-family: Century-Book">GET </span><span style="color: black; font-family: 宋体">或</span><span style="color: black; font-family: Century-Book"> POST HTTP</span><span style="color: black; font-family: 宋体">协议请求。然后，</span><span style="color: black; font-family: Century-Book">WEB</span><span style="color: black; font-family: 宋体">服务器处理这个请求并返回</span><span style="color: black; font-family: Century-Book">HTML</span><span style="color: black; font-family: 宋体">页面给用户。如</span><span style="color: black; font-family: Century-Book">Figure 2.3</span><span style="color: black; font-family: 宋体">所示<br />
</span></p>
<p style="text-align: left" align="left"><strong><span style="font-size: 9pt; color: black; font-family: Formata-Bold"><img height="165" alt="" src="http://www.blogjava.net/images/blogjava_net/kingwee/image006.gif" width="553" border="0" /><br />
Figure 2.3 </span></strong><span style="font-size: 9pt; color: black; font-family: Formata-Regular">Web page processing.</span></p>
<p style="text-align: left" align="left"><span style="font-size: 9pt; color: black; font-family: 宋体">正如</span><span style="color: black; font-family: Century-Book">Figure 2.3</span><span style="color: black; font-family: 宋体">显示的一样，整个处理过程是线性的，所有信息被转换附加到请求上。事实上，在</span><span style="color: black; font-family: Century-Book">Figure 2.3</span><span style="color: black; font-family: 宋体">显示的处理中，</span><span style="color: black; font-family: Century-Book">WEB</span><span style="color: black; font-family: 宋体">页面直接访问数据，从</span><span style="color: black; font-family: Century-Book">VIEW</span><span style="color: black; font-family: 宋体">到数据层之间没有任何中介处理层，这将导致许多问题，这不是一个好的处理办法。解决方法是，在处理层加入适当的层，把它们进行分离。如</span><span style="color: black; font-family: Century-Book">Figure 2.4</span><span style="color: black; font-family: 宋体">所示的三层结构。<br />
</span></p>
<p style="text-align: left" align="left"><strong><span style="font-size: 9pt; color: black; font-family: Formata-Bold"><img height="104" alt="" src="http://www.blogjava.net/images/blogjava_net/kingwee/image008.gif" width="554" border="0" /><br />
Figure 2.4 </span></strong><span style="font-size: 9pt; color: black; font-family: Formata-Regular">Three-tier Web page processing.</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">在</span><span style="color: black; font-family: Century-Book">Figure 2.4</span><span style="color: black; font-family: 宋体">里，我们尝试把</span><span style="color: black; font-family: Century-Book">MVC</span><span style="color: black; font-family: 宋体">架构带入</span><span style="color: black; font-family: Century-Book">WEB</span><span style="color: black; font-family: 宋体">开发中，以分离不同层之间的功能。</span></p>
<p style="text-align: left" align="left"><strong><span style="font-size: 15pt; color: black; font-family: Formata-Medium">MVC</span></strong><strong><span style="font-size: 15pt; color: black; font-family: 宋体">实践</span></strong></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">在学习了以上知识的基础上，让我们看一下如何把</span><span style="color: black; font-family: Century-Book">Listing 2.1</span><span style="color: black; font-family: 宋体">中的代码转换为</span><span style="color: black; font-family: Century-Book">MVC</span><span style="color: black; font-family: 宋体">方式，让</span><span style="color: black; font-family: Century-Book">WEB</span><span style="color: black; font-family: 宋体">设计者和</span><span style="color: black; font-family: Century-Book">WEB</span><span style="color: black; font-family: 宋体">开发者的工作更容易。首先，我们需要创建一个包含所有显示信息的</span><span style="color: black; font-family: Century-Book">VIEW</span><span style="color: black; font-family: 宋体">。如</span><span style="color: black; font-family: Century-Book">Listing 2.2</span><span style="color: black; font-family: 宋体">所示：</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">&lt;HTML&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">&lt;HEAD&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">&lt;TITLE&gt;Test&lt;/TITLE&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">&lt;/HEAD&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">&lt;BODY&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">&lt;form action="ControllerServlet.jsp" method="post"&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">&lt;input type="text" name="username"</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">value="$$username"&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">&lt;input type="text" name="password"</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">value="$$password"&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">&lt;input type="text" name="city"</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">value="$$city"&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">&lt;input type="text" name="state"</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">value="$$state"&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">$if ($$first) {</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">&lt;input type="submit" name="submit" value="Submit"&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">$else</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">&lt;input type="submit" name="submit" value="Update"&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">&lt;/form&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">&lt;/BODY&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">&lt;/HTML&gt;</span></p>
<p style="text-align: left" align="left"><strong><span style="font-size: 9pt; color: black; font-family: Formata-Bold">Listing 2.2 </span></strong><span style="font-size: 9pt; color: black; font-family: Formata-Regular">Example view code.</span></p>
<p style="text-align: left" align="left"><span style="font-size: 9pt; color: black; font-family: 宋体">正如你在</span><span style="color: black; font-family: Century-Book">Listing 2.2</span><span style="color: black; font-family: 宋体">里看到的一样，我们仍旧需要</span><span style="color: black; font-family: Century-Book">WEB</span><span style="color: black; font-family: 宋体">设计者拥有一些通过控制器操作</span><span style="color: black; font-family: Century-Book">MODEL</span><span style="color: black; font-family: 宋体">模型里数据的能力。根据个人经验，在</span><span style="color: black; font-family: Century-Book">VIEW</span><span style="color: black; font-family: 宋体">层使用</span><span style="color: black; font-family: Century-Book">Loop</span><span style="color: black; font-family: 宋体">和条件将减轻</span><span style="color: black; font-family: Century-Book">WEB</span><span style="color: black; font-family: 宋体">应用开发相当多的工作。这些代码不能被用户直接访问，在显示给用户之前，</span><span style="color: black; font-family: Century-Book"> WEB</span><span style="color: black; font-family: 宋体">服务器将把它当作模板进行处理。</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">处理来自</span><span style="color: black; font-family: Century-Book">VIEW</span><span style="color: black; font-family: 宋体">的请求，需要创建一个</span><span style="color: black; font-family: Century-Book">servlet</span><span style="color: black; font-family: 宋体">（</span><span style="color: black; font-family: Century-Book">JAVA</span><span style="color: black; font-family: 宋体">），详见</span><span style="color: black; font-family: Century-Book">Listing 2.3</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">public class ControllerServet extends HttpServlet {</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">private AccountLocalHome home = null;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">public void init() throws ServletException {</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">try {</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">Context cmp = (Context) new</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">InitialContext().lookup("java:comp/env/cmp");</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">home = (AccountLocalHome) cmp.lookup("AccountBean");</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">} catch (NamingException e) {</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">e.printStackTrace();</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">}</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">}</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">public void doGet(HttpServletRequest req, HttpServletResponse res)</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">throws IOException, ServletException {</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">if (home == null) {</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">out.println("home is null");</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">} else {</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">AccountLocal account = home.create();</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; font-family: Courier">ServletContext app = getServletContext();</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; font-family: Courier">app.setAttribute("username", account.username);</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; font-family: Courier">app.setAttribute("passowrd", account.password);</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; font-family: Courier">app.setAttribute("city", account.city);</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; font-family: Courier">app.setAttribute("state", account.state);</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; font-family: Courier">RequestDispatcher disp;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; font-family: Courier">disp = app.getRequestDispatcher("/ViewAccount.tmp");</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; font-family: Courier">disp.forward(request, response);</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; font-family: Courier">}</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; font-family: Courier">}</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; font-family: Courier">}</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; font-family: Courier">public void doPost(HttpServletRequest req, HttpServletResponse res)</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; font-family: Courier">throws IOException, ServletException {</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; font-family: Courier">doGet(req, res);</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; font-family: Courier">}</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; font-family: Courier">}</span></p>
<p style="text-align: left" align="left"><strong><span style="font-size: 9pt; color: black; font-family: Formata-Bold">Listing 2.3 </span></strong><span style="font-size: 9pt; color: black; font-family: Formata-Regular">Example servlet code.</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">这个</span><span style="color: black; font-family: Formata-Regular">Servlet</span><span style="color: black; font-family: 宋体">可以使用</span><span style="color: black; font-family: Formata-Regular">EJBs</span><span style="color: black; font-family: 宋体">作为</span><span style="color: black; font-family: Formata-Regular">MODEL</span><span style="color: black; font-family: 宋体">模型组件访问数据。在很多情况下，控制器</span><span style="color: black; font-family: Formata-Regular">Servlet</span><span style="color: black; font-family: 宋体">将为特定的商业功能处理其他</span><span style="color: black; font-family: Formata-Regular">Servlet</span><span style="color: black; font-family: 宋体">或对象。我们的</span><span style="color: black; font-family: Formata-Regular">Servlet</span><span style="color: black; font-family: 宋体">将获得一个</span><span style="color: black; font-family: Formata-Regular">Account</span><span style="color: black; font-family: 宋体">对象和对象与当前</span><span style="color: black; font-family: Formata-Regular">WEB</span><span style="color: black; font-family: 宋体">应用的上下文之间的联系。这个处理将把存储在上下文中的数据传送到模板代码中（</span><span style="color: black; font-family: Formata-Regular">Listing 2.2</span><span style="color: black; font-family: 宋体">）。</span></p>
<p style="text-align: left" align="left"><strong><span style="font-size: 15pt; color: black; font-family: 宋体">本章小节和下章介绍</span></strong></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">在这一章里，我们探索了一</span><span style="color: black; font-family: Century-Book">MVC</span><span style="color: black; font-family: 宋体">架构（一个用于分离系统组件和商业逻辑的方法）。最突出的问题是在</span><span style="color: black; font-family: Century-Book">VIEW</span><span style="color: black; font-family: 宋体">组件里应该使用什么语言。我们的解决方案是使用</span><span style="color: black; font-family: Century-Book">Velocity</span><span style="color: black; font-family: 宋体">——一个为</span><span style="color: black; font-family: Century-Book">WEB</span><span style="color: black; font-family: 宋体">设计者特制的用于处理信息显示的语言。在下一章里，我们将介绍</span><span style="color: black; font-family: Century-Book">Velocity</span><span style="color: black; font-family: 宋体">，分析其结构，并且用示例说明如何把</span><span style="color: black; font-family: Century-Book">Velocity</span><span style="color: black; font-family: 宋体">集成到</span><span style="color: black; font-family: Century-Book">MVC</span><span style="color: black; font-family: 宋体">架构里。</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">※※译者注：</span><span style="color: black; font-family: Century-Book">MVC</span><span style="color: black; font-family: 宋体">是一种方法学，而不是一种特定的语言框架※※</span></p>
<img src ="http://www.blogjava.net/kingwee/aggbug/233803.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kingwee/" target="_blank">KINGWEE</a> 2008-10-11 22:51 <a href="http://www.blogjava.net/kingwee/articles/233803.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>CHAPTER 1 Web 开发基础</title><link>http://www.blogjava.net/kingwee/articles/233802.html</link><dc:creator>KINGWEE</dc:creator><author>KINGWEE</author><pubDate>Sat, 11 Oct 2008 14:43:00 GMT</pubDate><guid>http://www.blogjava.net/kingwee/articles/233802.html</guid><wfw:comment>http://www.blogjava.net/kingwee/comments/233802.html</wfw:comment><comments>http://www.blogjava.net/kingwee/articles/233802.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kingwee/comments/commentRss/233802.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kingwee/services/trackbacks/233802.html</trackback:ping><description><![CDATA[&nbsp;
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">如果你还记得大约</span><span style="color: black; font-family: Century-Book">10</span><span style="color: black; font-family: 宋体">年前的时候，或许你已经了解</span><span style="color: black; font-family: Century-Book">WWW</span><span style="color: black; font-family: 宋体">起初是如何工作。</span><span style="color: black; font-family: Century-Book">Telnet</span><span style="color: black; font-family: 宋体">和</span><span style="color: black; font-family: Century-Book">FTP</span><span style="color: black; font-family: 宋体">是最早的沟通方式。虽然这些技术不能直接用于</span><span style="color: black; font-family: Century-Book">WEB</span><span style="color: black; font-family: 宋体">，但他们的确是</span><span style="color: black; font-family: Century-Book">WWW</span><span style="color: black; font-family: 宋体">的先驱。</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">很快，新的技术不断出现，使</span><span style="color: black; font-family: Century-Book">WEB</span><span style="color: black; font-family: 宋体">开发变得越来越强大，本书主要探索最近几年才出现的</span><span style="color: black; font-family: Century-Book">WEB</span><span style="color: black; font-family: 宋体">技术的一部分：向客户端提供动态数据显示。我们主要关注一个名叫</span><span style="color: black; font-family: Century-Book">Velocity</span><span style="color: black; font-family: 宋体">的新技术。</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">在这一节里，我们将向你展现</span><span style="color: black; font-family: Century-Book">WEB</span><span style="color: black; font-family: 宋体">开发历史的概览。</span></p>
<p style="text-align: left" align="left"><strong><span style="font-size: 15pt; color: black; font-family: 宋体">静态</span></strong><strong><span style="font-size: 15pt; color: black; font-family: Formata-Medium">WEB</span></strong><strong><span style="font-size: 15pt; color: black; font-family: 宋体">页面</span></strong></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">一切都是从静态页面开始的，静态页面只能呈现一些静态的内容，它不能从数据库或其他应用里提取数据。比较接近于&#8220;所见既所得&#8221;的表现方式。</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">静态页面最大的问题是不能提供动态内容，以满足不同用户的需要。随着</span><span style="color: black; font-family: Century-Book">WEB</span><span style="color: black; font-family: 宋体">技术的发展，开始有了用于</span><span style="color: black; font-family: Century-Book">WEB</span><span style="color: black; font-family: 宋体">开发的动态技术。</span></p>
<p style="text-align: left" align="left"><strong><span style="font-size: 15pt; color: black; font-family: Formata-Medium">CGI</span></strong><strong><span style="font-size: 15pt; color: black; font-family: 宋体">介绍</span></strong></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: Century-Book">CGI (Common Gateway Interface)</span><span style="color: black; font-family: 宋体">公共网关接口对</span><span style="color: black; font-family: Century-Book">WEB</span><span style="color: black; font-family: 宋体">开发有着重要的意义。于</span><span style="color: black; font-family: Century-Book">1993</span><span style="color: black; font-family: 宋体">年开发出来，</span><span style="color: black; font-family: Century-Book"> CGI </span><span style="color: black; font-family: 宋体">是第一个通过服务器后端处理后向客户提供动态信息的</span><span style="color: black; font-family: Century-Book">WEB</span><span style="color: black; font-family: 宋体">开发技术。</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">在使用</span><span style="color: black; font-family: Century-Book">CGI</span><span style="color: black; font-family: 宋体">的时候，应用的动作一般由高级语言书写，比如</span><span style="color: black; font-family: Century-Book">C</span><span style="color: black; font-family: 宋体">，</span><span style="color: black; font-family: Century-Book">Perl</span><span style="color: black; font-family: 宋体">或</span><span style="color: black; font-family: Century-Book">C++</span><span style="color: black; font-family: 宋体">。</span><span style="color: black; font-family: Century-Book">CGI</span><span style="color: black; font-family: 宋体">通过网页窗体的按钮事件获取用户输入，并返回最终结果给用户。</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: Century-Book">Listing 1.1 CGI</span><span style="color: black; font-family: 宋体">示例（</span><span style="color: black; font-family: Century-Book">C</span><span style="color: black; font-family: 宋体">语言书写）</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">int main(int argc, char* argv[]) {</span></p>
<p style="text-indent: 8pt; text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">printf("content-type: text/html"r"n");</span></p>
<p style="text-indent: 8pt; text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">printf(""r"n");</span></p>
<p style="text-indent: 8pt; text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">printf("&lt;html&gt;&lt;body&gt;");</span></p>
<p style="text-indent: 8pt; text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">printf("&lt;h1&gt;Hello World!&lt;/h1&gt;");</span></p>
<p style="text-indent: 8pt; text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">printf("&lt;/body&gt;&lt;/html&gt;"n");</span></p>
<p style="text-indent: 8pt; text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">return(0);</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">}</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">因为</span><span style="color: black; font-family: Century-Book">CGI</span><span style="color: black; font-family: 宋体">应用执行在</span><span style="color: black; font-family: Century-Book">WEB</span><span style="color: black; font-family: 宋体">服务器端，安全性就非常重要。许多服务器需要</span><span style="color: black; font-family: Century-Book">CGI</span><span style="color: black; font-family: 宋体">应用放置到文件夹</span><span style="color: black; font-family: Century-Book">/cgi-bin</span><span style="color: black; font-family: 宋体">下。除此而外，服务器不允许执行任何程序。</span></p>
<p style="text-align: left" align="left"><strong><span style="font-size: 15pt; color: black; font-family: Formata-Medium">Scripting: JSP/ASP/PHP</span></strong></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">正如你所了解的一样，使用</span><span style="color: black; font-family: Century-Book">CGI</span><span style="color: black; font-family: 宋体">和</span><span style="color: black; font-family: Century-Book">Perl</span><span style="color: black; font-family: 宋体">或</span><span style="color: black; font-family: Century-Book">C++</span><span style="color: black; font-family: 宋体">进行</span><span style="color: black; font-family: Century-Book">WEB</span><span style="color: black; font-family: 宋体">开发对</span><span style="color: black; font-family: Century-Book">WEB</span><span style="color: black; font-family: 宋体">设计者来说是非常困难的。也就是说</span><span style="color: black; font-family: Century-Book">WEB</span><span style="color: black; font-family: 宋体">设计者只有完全掌握这些高级语言后才能进行</span><span style="color: black; font-family: Century-Book">WEB</span><span style="color: black; font-family: 宋体">开发。</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">和这些高级语言不同的时，脚本语言通过解释程序执行，他们很容易学习并用于</span><span style="color: black; font-family: Century-Book">WEB</span><span style="color: black; font-family: 宋体">程序开发。解释程序由高级语言编写，在</span><span style="color: black; font-family: Century-Book">HTTP</span><span style="color: black; font-family: 宋体">服务器端加载，丢弃了</span><span style="color: black; font-family: Century-Book">CGI</span><span style="color: black; font-family: 宋体">接口。脚本语言通过在</span><span style="color: black; font-family: Century-Book">HTML</span><span style="color: black; font-family: 宋体">文档中嵌入语句和脚本语言关键字来向客户端递送动态信息。</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: Century-Book">Listing 1.2 </span><span style="color: black; font-family: 宋体">脚本语言示例</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">&lt;HTML&gt;</span></p>
<p style="text-indent: 8pt; text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">&lt;HEAD&gt;</span></p>
<p style="text-indent: 16pt; text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">&lt;TITLE&gt;Time Example&lt;/TITLE&gt;</span></p>
<p style="text-indent: 8pt; text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">&lt;/HEAD&gt;</span></p>
<p style="text-indent: 8pt; text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">&lt;BODY&gt;</span></p>
<p style="text-indent: 16pt; text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">The time is &lt;?php time() ?&gt;</span></p>
<p style="text-indent: 8pt; text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">&lt;/BODY&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">&lt;/HTML&gt;</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: Century-Book">In Listing 1.2,</span><span style="color: black; font-family: 宋体">我们增加了一些脚本用于显示当前时间。当用户浏览该页的时候，他们将通</span><span style="color: black; font-family: Century-Book">HTTP</span><span style="color: black; font-family: 宋体">服务器得到当前时候。</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">嵌入脚本的页面虽然看起来像</span><span style="color: black; font-family: Century-Book">HTML</span><span style="color: black; font-family: 宋体">页面。然后，其后缀不能是</span><span style="color: black; font-family: Century-Book">.html</span><span style="color: black; font-family: 宋体">或</span><span style="color: black; font-family: Century-Book">.htm</span><span style="color: black; font-family: 宋体">。只能是对应的后缀，比如：</span><span style="color: black; font-family: Century-Book">.jsp</span><span style="color: black; font-family: 宋体">，</span><span style="color: black; font-family: Century-Book">.asp</span><span style="color: black; font-family: 宋体">，</span><span style="color: black; font-family: Century-Book">.php</span><span style="color: black; font-family: 宋体">等。这些扩展名非常重要，它主要是用于告诉服务器该页面是否需要进行服务器端处理。如果需要进行处理，解释程序将脚本代码进行后台运算，最后将运算结果以标准的</span><span style="color: black; font-family: Century-Book">HTML</span><span style="color: black; font-family: 宋体">形式嵌入</span><span style="color: black; font-family: Century-Book">HTML</span><span style="color: black; font-family: 宋体">文档中返回给客户。</span></p>
<p style="text-align: left" align="left"><strong><span style="font-size: 15pt; color: black; font-family: 宋体">未来的发展</span></strong></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">当我们在讨论脚本语言的时候，你应该关注以下可用到的脚本语言——如</span><span style="color: black; font-family: Century-Book">JavaScript</span><span style="color: black; font-family: 宋体">，</span><span style="color: black; font-family: Century-Book">Java</span><span style="color: black; font-family: 宋体">，和</span><span style="color: black; font-family: Century-Book">ActiveX</span><span style="color: black; font-family: 宋体">。</span><span style="color: black; font-family: Century-Book">Listing 1.3</span><span style="color: black; font-family: 宋体">展现了一个用</span><span style="color: black; font-family: Century-Book">Java</span><span style="color: black; font-family: 宋体">脚本写的</span><span style="color: black; font-family: Century-Book">HTML</span><span style="color: black; font-family: 宋体">页面。</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">&lt;%@ page language='java' import='java.sql.*' %&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">&lt;HTML&gt;</span></p>
<p style="text-indent: 8pt; text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">&lt;HEAD&gt;</span></p>
<p style="text-indent: 16pt; text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">&lt;TITLE&gt;Test&lt;/TITLE&gt;</span></p>
<p style="text-indent: 8pt; text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">&lt;/HEAD&gt;</span></p>
<p style="text-indent: 8pt; text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">&lt;%</span></p>
<p style="text-indent: 8pt; text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">ResultSet rs;</span></p>
<p style="text-indent: 8pt; text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">try {</span></p>
<p style="text-indent: 16pt; text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">Class.forName("com.mysql.jdbc.Driver");</span></p>
<p style="text-indent: 16pt; text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">connection = DriverManager.getConnection(</span></p>
<p style="text-indent: 16pt; text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">"jdbc:mysql://localhost/products");</span></p>
<p style="text-indent: 16pt; text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">statement = connection.createStatement();</span></p>
<p style="text-indent: 8pt; text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">%&gt;</span></p>
<p style="text-indent: 8pt; text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">&lt;BODY&gt;</span></p>
<p style="text-indent: 8pt; text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">&lt;/BODY&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: Courier">&lt;/HTML&gt;</span></p>
<p style="text-align: left" align="left"><strong><span style="font-size: 9pt; color: black; font-family: Formata-Bold">Listing 1.3 </span></strong><span style="font-size: 9pt; color: black; font-family: Formata-Regular">Using Java in an HTML page. </span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">在</span><span style="color: black; font-family: Century-Book">HTML</span><span style="color: black; font-family: 宋体">页面中嵌入</span><span style="color: black; font-family: Century-Book">Java</span><span style="color: black; font-family: 宋体">脚本是为了让</span><span style="color: black; font-family: Century-Book">WEB</span><span style="color: black; font-family: 宋体">站点具有动态处理的能力。你不仅需要了解</span><span style="color: black; font-family: Century-Book">Java</span><span style="color: black; font-family: 宋体">，同时也需要了解在服务器端执行的</span><span style="color: black; font-family: Century-Book">Java</span><span style="color: black; font-family: 宋体">代码是如何编写的。</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">我们讨论很多不同类型的动态页面技术，但他们都有一个共同点，就是将显示和商业逻辑混杂在一起。在下一节里，我们将讨论混杂编程是多么的令人头痛。</span></p>
<p style="text-align: left" align="left"><strong><span style="font-size: 15pt; color: black; font-family: 宋体">本章小节和下章介绍</span></strong></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">这一章里，我们分析了</span><span style="color: black; font-family: Century-Book">WEB</span><span style="color: black; font-family: 宋体">页面的开发历史。下一节，我们将讨论</span><span style="color: black; font-family: Century-Book">WEB</span><span style="color: black; font-family: 宋体">开发的方法学，并且主要关注</span><span style="color: black; font-family: Century-Book">MVC</span><span style="color: black; font-family: 宋体">模式。</span></p>
<img src ="http://www.blogjava.net/kingwee/aggbug/233802.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kingwee/" target="_blank">KINGWEE</a> 2008-10-11 22:43 <a href="http://www.blogjava.net/kingwee/articles/233802.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>概述</title><link>http://www.blogjava.net/kingwee/articles/233798.html</link><dc:creator>KINGWEE</dc:creator><author>KINGWEE</author><pubDate>Sat, 11 Oct 2008 14:26:00 GMT</pubDate><guid>http://www.blogjava.net/kingwee/articles/233798.html</guid><wfw:comment>http://www.blogjava.net/kingwee/comments/233798.html</wfw:comment><comments>http://www.blogjava.net/kingwee/articles/233798.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kingwee/comments/commentRss/233798.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kingwee/services/trackbacks/233798.html</trackback:ping><description><![CDATA[<p align="right">&nbsp; </p>
<p><span style="font-family: 宋体">起初，</span>WEB<span style="font-family: 宋体">页面是一个为所有访问者提供一个统一的信息静态实体。开发者很快就想到为拥有一种为每一个用户提供唯一数据的能力，一个大的技术分类随之而来，比如</span>PHP,ASP<span style="font-family: 宋体">和</span>JSP<span style="font-family: 宋体">。当这些语言在解决这个问题的同时，也导致了一个非常大的问题。</span></p>
<p><span style="font-family: 宋体">这些语言直接和</span>HTML<span style="font-family: 宋体">标签相混合，导致程序可维护性大大降低。如果开发者想改变页面外观，修改工作将难以进行。</span></p>
<p><span style="font-family: 宋体">幸运的是，模型</span>-<span style="font-family: 宋体">视图</span>-<span style="font-family: 宋体">控制器（</span>MVC<span style="font-family: 宋体">）设计范例完全把私有代码从页面和数据中分离出来。使用</span>MVC<span style="font-family: 宋体">模式进行设计时，</span>WEB<span style="font-family: 宋体">设计者只关注于创建页面表现外观，而</span>WEB<span style="font-family: 宋体">开发者则只需关注代码的处理。</span>Velocity<span style="font-family: 宋体">是一种用于从私有代码中分离</span>Java Web<span style="font-family: 宋体">代码的技术（通过</span>MVC<span style="font-family: 宋体">方式），</span> Web<span style="font-family: 宋体">设计者通过使用</span>java<span style="font-family: 宋体">基础模板，引用用</span>java<span style="font-family: 宋体">书写的私有代码。</span></p>
<p><span style="font-family: 宋体">这本书提供了一个使用</span>Velocity1.3.x<span style="font-family: 宋体">创建可维护站点的综合处理方案（通过本书示例的帮助）。</span></p>
<p style="text-align: left" align="left"><strong><span style="font-size: 15pt; font-family: 宋体">这本书里有些什么？</span></strong></p>
<p style="text-align: left" align="left"><span style="font-family: 宋体">因为</span><span style="font-family: Century-Book">Velocity</span><span style="font-family: 宋体">是为</span><span style="font-family: Century-Book">Web</span><span style="font-family: 宋体">设计者和开发者而设计的，这本书包含了</span><span style="font-family: Century-Book">VTL</span><span style="font-family: 宋体">（</span><span style="font-family: Century-Book">velocity</span><span style="font-family: 宋体">模板语言）的全部内容。我们展示了如何把</span><span style="font-family: Century-Book">VTL</span><span style="font-family: 宋体">语言应用到你的</span><span style="font-family: Century-Book">Velocity</span><span style="font-family: 宋体">模板的窗体数据里，以及如何使用这些模板开发应用程序。</span></p>
<p style="text-align: left" align="left"><span style="font-family: 宋体">我们假定你不知道</span>Velocity<span style="font-family: 宋体">，因此在编写第一个实际应用之前，我们提供了一个示例以便于你能够理解系统是如何工作的。在这个实例里，我们展示了如何利用</span>MYSQL<span style="font-family: 宋体">数据库来构建一个</span>CD<span style="font-family: 宋体">收藏应用。通过这个应用，你将学会如何利用</span>MVC<span style="font-family: 宋体">方式书写代码。你也将学会如何用</span>velocity<span style="font-family: 宋体">模板来进行</span>web<span style="font-family: 宋体">输出、文本报表和生成</span>XML<span style="font-family: 宋体">。本书第二个示例是一个酒店预约系统，用于验证如何使用</span><span style="font-family: Century-Book">Maverick </span><span style="font-family: 宋体">和</span><span style="font-family: Century-Book"> Velocity </span><span style="font-family: 宋体">模板来</span><span style="font-family: 宋体">构建一个完整的</span>WEB<span style="font-family: 宋体">应用。这个应用允许用户使用某几个标准进行房间信息搜索，预订想要的房间，然后显示预约确认。许多</span>Velocity<span style="font-family: 宋体">模板和三个控制类被用于完成应用，用一个</span>Velocity<span style="font-family: 宋体">模板来展现。</span></p>
<p style="text-align: left" align="left"><strong><span style="font-size: 15pt; font-family: 宋体">谁最应该读这本书</span></strong></p>
<p style="text-align: left" align="left"><span style="font-family: 宋体">本书是为帮助</span><span style="font-family: Century-Book">WEB</span><span style="font-family: 宋体">开发者和</span><span style="font-family: Century-Book">WEB</span><span style="font-family: 宋体">设计者维护和开发</span><span style="font-family: Century-Book">WEB</span><span style="font-family: 宋体">站点和应用而写的。许多组织把这些分成</span><span style="font-family: Century-Book">WEB</span><span style="font-family: 宋体">设计者和软件开发者这两个角色，并分别雇用图形设计者来进行</span><span style="font-family: Century-Book">WEB</span><span style="font-family: 宋体">表现设计和雇用软件设计者来进行</span><span style="font-family: Century-Book">WEB</span><span style="font-family: 宋体">开发。这两个角色都是（</span><span style="font-family: Century-Book">critical</span><span style="font-family: 宋体">）独立的：</span><span style="font-family: Century-Book">WEB</span><span style="font-family: 宋体">开发者专注于</span><span style="font-family: Century-Book">Servlet Veloctiy</span><span style="font-family: 宋体">后端（</span><span style="font-family: Century-Book">back-end</span><span style="font-family: 宋体">）支持，</span><span style="font-family: Century-Book">WEB</span><span style="font-family: 宋体">设计者利用</span><span style="font-family: Century-Book">WEB</span><span style="font-family: 宋体">开发者提供的后端支持进行界面设计。</span></p>
<p style="text-align: left" align="left"><span style="font-family: 宋体">在这里，我们假定</span><span style="font-family: Century-Book">WEB</span><span style="font-family: 宋体">开发者已经具备</span><span style="font-family: Century-Book">JAVA</span><span style="font-family: 宋体">开发工作的经验和知识，并且已经能够熟练使用</span><span style="font-family: Century-Book">servlets</span><span style="font-family: 宋体">和</span><span style="font-family: Century-Book">EJBs</span><span style="font-family: 宋体">进行交互，同时假定</span><span style="font-family: Century-Book">WEB</span><span style="font-family: 宋体">设计者已经具备</span><span style="font-family: Century-Book">HTML</span><span style="font-family: 宋体">开发工作的经验和知识。如果他们（</span><span style="font-family: Century-Book">exposure</span><span style="font-family: 宋体">）不得不使用</span><span style="font-family: Century-Book">JSP/ASP</span><span style="font-family: 宋体">或其他服务器端语言进行开发，</span><span style="font-family: Century-Book">Velocity</span><span style="font-family: 宋体">将很容易进行转换（虽然我们假定他们不了解这些知识）。</span></p>
<p style="text-align: left" align="left"><span style="font-family: 宋体">本书由三部分组成。第一部分是</span><span style="font-family: Century-Book">MVC</span><span style="font-family: 宋体">和</span><span style="font-family: Century-Book">Velocity</span><span style="font-family: 宋体">的介绍。一旦你已经掌握或了解了（</span><span style="font-family: Century-Book">under your belt</span><span style="font-family: 宋体">）这些介绍性的知识，我们将进入</span><span style="font-family: Century-Book">Velocity</span><span style="font-family: 宋体">语言和它的特性讨论环节（第二部分）。最后，第三部分提供了许多示例和全面的示例应用，并举例说明如何使用</span><span style="font-family: Century-Book">Velocity</span><span style="font-family: 宋体">。</span></p>
<p style="text-align: left" align="left"><strong><span style="font-size: 13.5pt; font-family: Formata-Medium">Part I: Velocity</span></strong><strong><span style="font-size: 13.5pt; font-family: 宋体">和</span></strong><strong><span style="font-size: 13.5pt; font-family: Formata-Medium">MVC</span></strong><strong><span style="font-size: 13.5pt; font-family: 宋体">介绍</span></strong></p>
<p style="text-align: left" align="left"><strong><em><span style="font-size: 11.5pt; font-family: Formata-MediumItalic">Chapter 1: Web</span></em></strong><strong><em><span style="font-size: 11.5pt; font-family: 宋体">开发基础</span></em></strong><strong><em><span style="font-size: 11.5pt; font-family: Formata-MediumItalic">(development basics)</span></em></strong></p>
<p style="text-align: left" align="left"><span style="font-family: 宋体">直到今天，</span><span style="font-family: Century-Book">Internet</span><span style="font-family: 宋体">开发仅仅是目前技术革新的一小部分。通过</span><span style="font-family: Century-Book">internet</span><span style="font-family: 宋体">，把相互连接性进一步延长，它允许个体和公司以相同的方式向全球成千上万的客户和朋友呈现信息。最初，</span><span style="font-family: Century-Book">WEB</span><span style="font-family: 宋体">页面开发仅限于使用</span><span style="font-family: Century-Book">HTML</span><span style="font-family: 宋体">来产生一个静态页面。</span></p>
<p style="text-align: left" align="left"><span style="font-family: 宋体">随着</span><span style="font-family: Century-Book">internet</span><span style="font-family: 宋体">语言的进化和站点需求的增加，开始向动态页面发展，并利用数据库进行数据管理和复杂应用处理。新的复杂性是，结果常常导致在同一个文件里混杂</span><span style="font-family: Century-Book">view</span><span style="font-family: 宋体">和处理代码。</span><span style="font-family: Century-Book">Velocity</span><span style="font-family: 宋体">利用</span><span style="font-family: Century-Book">MVC</span><span style="font-family: 宋体">方式为设计者和开发者提供了一个解决方案。本章为</span><span style="font-family: Century-Book">internet</span><span style="font-family: 宋体">发展历史和</span><span style="font-family: Century-Book">velocity</span><span style="font-family: 宋体">是如何</span><span style="font-family: Century-Book">brings to the table(</span><span style="font-family: 宋体">使表恢复知觉？</span><span style="font-family: Century-Book">)</span><span style="font-family: 宋体">提供了一个全面的概览。</span></p>
<p style="text-align: left" align="left"><strong><em><span style="font-size: 11.5pt; font-family: Formata-MediumItalic">Chapter 2: MVC</span></em></strong><strong><em><span style="font-size: 11.5pt; font-family: 宋体">基本原理</span></em></strong></p>
<p style="text-align: left" align="left"><span style="font-family: 宋体">当</span><span style="font-family: Century-Book">Smalltalk-80</span><span style="font-family: 宋体">设计出来的时候，一个叫做</span><span style="font-family: Century-Book">Model-View-Controller</span><span style="font-family: 宋体">（</span><span style="font-family: Century-Book">MVC</span><span style="font-family: 宋体">）的体系被用于从数据和控制逻辑中分离</span><span style="font-family: Century-Book">view</span><span style="font-family: 宋体">，几年过去了，</span><span style="font-family: Century-Book">MVC</span><span style="font-family: 宋体">已经变成一个能够被所有现代语言所应用的模式。</span><span style="font-family: Century-Book">MVB</span><span style="font-family: 宋体">已经带进</span><span style="font-family: Century-Book">WEB</span><span style="font-family: 宋体">舞台，同时能够被</span><span style="font-family: Century-Book">Velocity</span><span style="font-family: 宋体">充分利用。</span></p>
<p><span style="font-family: 宋体">本章给你一个全面的</span>MVC<span style="font-family: 宋体">概览，同时向你解释</span>MVC<span style="font-family: 宋体">在</span>internet<span style="font-family: 宋体">开发处理中的角色。我们向你呈现了代码示例，同时描述了每一个</span>MVC<span style="font-family: 宋体">组件是如何解决在创建组合代码过程中所出现的问题。</span></p>
<p style="text-align: left" align="left"><strong><em><span style="font-size: 11.5pt; font-family: Formata-MediumItalic">Chapter 3: Velocity</span></em></strong><strong><em><span style="font-size: 11.5pt; font-family: 宋体">介绍</span></em></strong></p>
<p><span style="font-family: 宋体">本章主要介绍</span>Veloctiy<span style="font-family: 宋体">。我们向你呈现了</span>Velocity<span style="font-family: 宋体">是如何工作的，并且调试我们在本书中将使用的代码。随着学习的深入，你将对这个系统有一个好的理解。</span></p>
<p style="text-align: left" align="left"><strong><span style="font-size: 13.5pt; color: black; font-family: Formata-Medium">Part II: Velocity </span></strong><strong><span style="font-size: 13.5pt; color: black; font-family: 宋体">基础</span></strong></p>
<p style="text-align: left" align="left"><strong><em><span style="font-size: 11.5pt; color: black; font-family: Formata-MediumItalic">Chapter 4: </span></em></strong><strong><em><span style="font-size: 11.5pt; color: black; font-family: 宋体">安装</span></em></strong><strong><em><span style="font-size: 11.5pt; color: black; font-family: Formata-MediumItalic">Velocity</span></em></strong></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">在你开始关注</span><span style="color: black; font-family: Century-Book">Velocity</span><span style="color: black; font-family: 宋体">细节之前，你必须先安装它。本章提供了一个全面的</span><span style="color: black; font-family: Century-Book">Velocity</span><span style="color: black; font-family: 宋体">安装手册。涵盖</span><span style="color: black; font-family: Century-Book">windows</span><span style="color: black; font-family: 宋体">和</span><span style="color: black; font-family: Century-Book">Unix</span><span style="color: black; font-family: 宋体">平台下所有必须的开发工具和先决条件包。我们将对</span><span style="color: black; font-family: Century-Book">Velocity</span><span style="color: black; font-family: 宋体">测试组进行全面讨论，同时提供一个执行示例应用的手册和</span><span style="color: black; font-family: Century-Book">sevlets</span><span style="color: black; font-family: 宋体">支持包。一些支持包包含了</span><span style="color: black; font-family: Century-Book">Java SDK</span><span style="color: black; font-family: 宋体">和一个应用服务器（比如</span><span style="color: black; font-family: Century-Book">Tomcat</span><span style="color: black; font-family: 宋体">或</span><span style="color: black; font-family: Century-Book">Resin</span><span style="color: black; font-family: 宋体">）。</span></p>
<p style="text-align: left" align="left"><strong><em><span style="font-size: 11.5pt; color: black; font-family: Formata-MediumItalic">Chapter 5:</span></em></strong><strong><em><span style="font-size: 11.5pt; color: black; font-family: 宋体">创建</span></em></strong><strong><em><span style="font-size: 11.5pt; color: black; font-family: Formata-MediumItalic">Hello World </span></em></strong><strong><em><span style="font-size: 11.5pt; color: black; font-family: 宋体">示例</span></em></strong></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">正如你所期待的一样，一个新的开发范例都是从</span><span style="color: black; font-family: Century-Book">Hello World</span><span style="color: black; font-family: 宋体">应用开始的。在这一节里，你将书写你的第一个</span><span style="color: black; font-family: Century-Book">Velocity</span><span style="color: black; font-family: 宋体">应用</span><span style="color: black; font-family: Century-Book">-but with a twist</span><span style="color: black; font-family: 宋体">。你可以书写用于单机和</span><span style="color: black; font-family: Century-Book">WEB</span><span style="color: black; font-family: 宋体">格式的应用，以此证明</span><span style="color: black; font-family: Century-Book">Velocity</span><span style="color: black; font-family: 宋体">能够用于任何类型的应用输出。当然，书写代码仅仅是战斗的一部分——你还必须能够部署和执行你的应用。本章将告诉你每一个详细的步骤。</span></p>
<p style="text-align: left" align="left"><strong><em><span style="font-size: 11.5pt; color: black; font-family: Formata-MediumItalic">Chapter 6: </span></em></strong><strong><em><span style="font-size: 11.5pt; color: black; font-family: 宋体">理解和模板和上下文</span></em></strong></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: Century-Book">Velocity</span><span style="color: black; font-family: 宋体">的两个主要组件就是</span><em><span style="color: black; font-family: Century-Book">templates</span></em><span style="color: black; font-family: 宋体">模板和</span><em><span style="color: black; font-family: Century-Book">context</span></em><span style="color: black; font-family: 宋体">上下文。模板为</span><span style="color: black; font-family: Century-Book">WEB</span><span style="color: black; font-family: 宋体">设计者创建应用界面提供了一个区域，这个界面将通过单机应用生成一个</span><span style="color: black; font-family: Century-Book">WEB</span><span style="color: black; font-family: 宋体">页面或产生一个报表；上下文为</span><span style="color: black; font-family: Century-Book">WEB</span><span style="color: black; font-family: 宋体">开发者放置所有设计者</span><span style="color: black; font-family: Century-Book">designer</span><span style="color: black; font-family: 宋体">和</span><span style="color: black; font-family: Century-Book">Velocity</span><span style="color: black; font-family: 宋体">模板所需要的信息提供了一个区域。本章将介绍这些组件。我们将通过调试一个完整的示例来展示组件是如何在一起工作的，同时，我们将讨论他们的一般用法。</span></p>
<p style="text-align: left" align="left"><strong><em><span style="font-size: 11.5pt; color: black; font-family: Formata-MediumItalic">Chapter 7: Exploring References</span></em></strong><strong><em><span style="font-size: 11.5pt; color: black; font-family: 宋体">引用探索</span></em></strong></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">在</span><span style="color: black; font-family: Century-Book">Velocity</span><span style="color: black; font-family: 宋体">内部，引用在模板和上下文（一个存储数据的地方）之间提供了一个接口。在这一节里，我们将描述以下三种类型的引用：语法、正式的和非正式的（？），我们也将讨论逃逸（</span><span style="color: black; font-family: Century-Book">escaping</span><span style="color: black; font-family: 宋体">）、静态（</span><span style="color: black; font-family: Century-Book">quiet</span><span style="color: black; font-family: 宋体">）和属性符号（</span><span style="color: black; font-family: Century-Book">property notation</span><span style="color: black; font-family: 宋体">），同时提供一个示例来说明这些概念。</span></p>
<p style="text-align: left" align="left"><strong><em><span style="font-size: 11.5pt; color: black; font-family: Formata-MediumItalic">Chapter 8: </span></em></strong><strong><em><span style="font-size: 11.5pt; color: black; font-family: 宋体">使用指令（</span></em></strong><strong><em><span style="font-size: 11.5pt; color: black; font-family: Formata-MediumItalic">Directives</span></em></strong><strong><em><span style="font-size: 11.5pt; color: black; font-family: 宋体">）</span></em></strong></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: Century-Book">Velocity</span><span style="color: black; font-family: 宋体">和许多别的</span><span style="color: black; font-family: Century-Book">Internet</span><span style="color: black; font-family: 宋体">语言一样，提供了一个命叫指令（</span><em><span style="color: black; font-family: Century-Book">directives</span></em><span style="color: black; font-family: 宋体">）的控制和判断结构，这些指令（如</span><span style="color: black; font-family: Century-Book">#foreach </span><span style="color: black; font-family: 宋体">和</span><span style="color: black; font-family: Century-Book"> #if</span><span style="color: black; font-family: 宋体">）为</span><span style="color: black; font-family: Century-Book">WEB</span><span style="color: black; font-family: 宋体">设计者提供了一个强大的工具，来熟练操作上下文中的数据。本章涵盖了</span><span style="color: black; font-family: Century-Book">directives</span><span style="color: black; font-family: 宋体">和</span><span style="color: black; font-family: Century-Book">includes</span><span style="color: black; font-family: 宋体">示例，同时也包含了一个用于快速查找的引用片段。</span></p>
<p style="text-align: left" align="left"><strong><em>&nbsp;</em></strong></p>
<p style="text-align: left" align="left"><strong><em><span style="font-size: 11.5pt; color: black; font-family: Formata-MediumItalic">Chapter 9: Velocimacros</span></em></strong><strong><em><span style="font-size: 11.5pt; color: black; font-family: 宋体">介绍</span></em></strong></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">当你发现自己再三重复同样的</span><span style="color: black; font-family: Century-Book">Velocity</span><span style="color: black; font-family: 宋体">代码时，你就应该开始学习</span><em><span style="color: black; font-family: Century-Book">velocimacros</span></em><span style="color: black; font-family: 宋体">了。这些宏允许你创建一些用于模板的模块，以产生清晰（</span><span style="color: black; font-family: Century-Book">clean-looking</span><span style="color: black; font-family: 宋体">）的代码，同时有助于今后开发的维护。本章涵盖了</span><span style="color: black; font-family: Century-Book">velocimacros</span><span style="color: black; font-family: 宋体">内容，同时提供了广泛的例子。</span></p>
<p style="text-align: left" align="left"><strong><em><span style="font-size: 11.5pt; color: black; font-family: Formata-MediumItalic">Chapter 10: Velocity</span></em></strong><strong><em><span style="font-size: 11.5pt; color: black; font-family: 宋体">控制器讨论</span></em></strong></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: Century-Book">Velocity</span><span style="color: black; font-family: 宋体">开发者需要包含了几个结构——比如事件、资源加载和其他系统属性（帮助你定制</span><span style="color: black; font-family: Century-Book">Velocity</span><span style="color: black; font-family: 宋体">的行为）。本章用示例来说明如何更改</span><span style="color: black; font-family: Century-Book">Velocity</span><span style="color: black; font-family: 宋体">模式以适用于你的应用。</span></p>
<p style="text-align: left" align="left"><strong><span style="font-size: 13.5pt; font-family: Formata-Medium">Part III: Velocity</span></strong><strong><span style="font-size: 13.5pt; font-family: 宋体">开发</span></strong></p>
<p style="text-align: left" align="left"><strong><em><span style="font-size: 11.5pt; font-family: Formata-MediumItalic">Chapter 11: Velocity, XML, </span></em></strong><strong><em><span style="font-size: 11.5pt; font-family: 宋体">和</span></em></strong><strong><em><span style="font-size: 11.5pt; font-family: Formata-MediumItalic"> Anakia</span></em></strong></p>
<p style="text-align: left" align="left"><span style="font-family: Century-Book">XML</span><span style="font-family: 宋体">是宣传和介绍的最多的技术。用于</span><span style="font-family: Century-Book">HTML</span><span style="font-family: 宋体">时，</span><span style="font-family: Century-Book">XML</span><span style="font-family: 宋体">允许用户自定义标记来识别包含在文本里的数据。为了使</span><span style="font-family: Century-Book">XML</span><span style="font-family: 宋体">更易用，人们设计了</span><span style="font-family: Century-Book">XSLT</span><span style="font-family: 宋体">，用于快速、便捷地操控和转换</span><span style="font-family: Century-Book">XML</span><span style="font-family: 宋体">数据。</span></p>
<p style="text-align: left" align="left"><span style="font-family: Century-Book">Anakia</span><span style="font-family: 宋体">设计者使用</span><span style="font-family: Century-Book">Ant</span><span style="font-family: 宋体">任务，利用强大的</span><span style="font-family: Century-Book">XSLT</span><span style="font-family: 宋体">功能（</span><span style="font-family: Century-Book">found</span><span style="font-family: 宋体">）和</span><span style="font-family: Century-Book">XML</span><span style="font-family: 宋体">来创建输出。</span></p>
<p style="text-align: left" align="left"><strong><em><span style="font-size: 11.5pt; font-family: Formata-MediumItalic">Chapter 12:</span></em></strong><strong><em><span style="font-size: 11.5pt; font-family: 宋体">在</span></em></strong><strong><em><span style="font-size: 11.5pt; font-family: Formata-MediumItalic">Servlets</span></em></strong><strong><em><span style="font-size: 11.5pt; font-family: 宋体">里使用</span></em></strong><strong><em><span style="font-size: 11.5pt; font-family: Formata-MediumItalic">Velocity</span></em></strong></p>
<p style="text-align: left" align="left"><span style="font-family: 宋体">当你使用</span><span style="font-family: Century-Book">Velocity</span><span style="font-family: 宋体">开发应用时，</span><span style="font-family: Century-Book">MVC</span><span style="font-family: 宋体">范例模式是创建可维护性应用最有效方式。第一个控制器开发的就是</span><span style="font-family: Century-Book">Servlet</span><span style="font-family: 宋体">。本章里，我们将向你展示如何使用</span><span style="font-family: Century-Book">Servlet</span><span style="font-family: 宋体">和</span><span style="font-family: Century-Book">Velocity</span><span style="font-family: 宋体">书写一个</span><span style="font-family: Century-Book">CD</span><span style="font-family: 宋体">收藏应用。许多模板都是有插图的，同时我们将讨论在下载表文件的窗体里利用</span><span style="font-family: Century-Book">Velocity</span><span style="font-family: 宋体">来输出文本。该应用同时也利用了</span><span style="font-family: Century-Book">EJBs</span><span style="font-family: 宋体">来作为</span><span style="font-family: Century-Book">MVC</span><span style="font-family: 宋体">范例模式的模型（</span><span style="font-family: Century-Book">model</span><span style="font-family: 宋体">）组件。在</span><span style="font-family: Century-Book">EJBs</span><span style="font-family: 宋体">里，数据通过</span><span style="font-family: Century-Book">Collection</span><span style="font-family: 宋体">（收藏）对象窗体里的上下文来传递到模板。</span><span style="font-family: Century-Book">VTL</span><span style="font-family: 宋体">指令（</span><span style="font-family: Century-Book">directives</span><span style="font-family: 宋体">）把显示给用户的</span><span style="font-family: Century-Book">Collection</span><span style="font-family: 宋体">（收藏）数据填充到数据库行。</span></p>
<p style="text-align: left" align="left"><strong><em><span style="font-size: 11.5pt; font-family: Formata-MediumItalic">Chapter 13: Velocity</span></em></strong><strong><em><span style="font-size: 11.5pt; font-family: 宋体">和国际化</span></em></strong></p>
<p style="text-align: left" align="left"><span style="font-family: 宋体">当你正在设计一个</span><span style="font-family: Century-Book">WEB</span><span style="font-family: 宋体">应用的时候，你可能习惯考虑使用母语来书写应用里的文本，但是你可能忘记了其他国家的用户或许正在使用这个应用的功能。虽然</span><span style="font-family: Century-Book">Velocity</span><span style="font-family: 宋体">不能改变在</span><span style="font-family: Century-Book">JAVA</span><span style="font-family: 宋体">基础</span><span style="font-family: Century-Book">WEB</span><span style="font-family: 宋体">应用上完成国际化任务的现状，但它提供了一个创建被许多语言理解的兼容站点的框架。本章展示了如何把德语文本增加到你的</span><span style="font-family: Century-Book">CD</span><span style="font-family: 宋体">收藏</span><span style="font-family: Century-Book">Velocity</span><span style="font-family: 宋体">应用中。使用这个本章介绍的这个技术，你可以很容易地为你的</span><span style="font-family: Century-Book">Velocity</span><span style="font-family: 宋体">应用增加其他语言支持。</span></p>
<p style="text-align: left" align="left"><strong><em><span style="font-size: 11.5pt; font-family: Formata-MediumItalic">Chapter 14: </span></em></strong><strong><em><span style="font-size: 11.5pt; font-family: 宋体">在</span></em></strong><strong><em><span style="font-size: 11.5pt; font-family: Formata-MediumItalic">Turbine</span></em></strong><strong><em><span style="font-size: 11.5pt; font-family: 宋体">（涡轮）里应用</span></em></strong><strong><em><span style="font-size: 11.5pt; font-family: Formata-MediumItalic">Velocity</span></em></strong></p>
<p style="text-align: left" align="left"><span style="font-family: 宋体">在</span><span style="font-family: Century-Book">Jakarta</span><span style="font-family: 宋体">的开发小组中，</span><span style="font-family: Century-Book">Turbine</span><span style="font-family: 宋体">是一个为开发者提供的创建企业级应用工具的应用框架，其目标是提供一个让开发者自行创建其想要的组件框架（？）。</span></p>
<p style="text-align: left" align="left"><span style="font-family: 宋体">在本章里，我们将讨论如何使用</span><span style="font-family: Century-Book">Turbine</span><span style="font-family: 宋体">和</span><span style="font-family: Century-Book">Velocity</span><span style="font-family: 宋体">获取、安装和部署一个应用。让你利用</span><span style="font-family: Century-Book">Turbine</span><span style="font-family: 宋体">的</span><span style="font-family: Century-Book">MVC</span><span style="font-family: 宋体">支持进行</span><span style="font-family: Century-Book">Velocity</span><span style="font-family: 宋体">开发。</span></p>
<p style="text-align: left" align="left"><strong><em><span style="font-size: 11.5pt; font-family: Formata-MediumItalic">Chapter 15: </span></em></strong><strong><em><span style="font-size: 11.5pt; font-family: 宋体">在</span></em></strong><strong><em><span style="font-size: 11.5pt; font-family: Formata-MediumItalic">Maverick</span></em></strong><strong><em><span style="font-size: 11.5pt; font-family: 宋体">里使用</span></em></strong><strong><em><span style="font-size: 11.5pt; font-family: Formata-MediumItalic">Velocity</span></em></strong></p>
<p style="text-align: left" align="left"><span style="font-family: 宋体">如果你正在使用</span><span style="font-family: Century-Book">J2EE</span><span style="font-family: 宋体">和</span><span style="font-family: Century-Book">MVC</span><span style="font-family: 宋体">构建一个应用，可以考虑使用</span><span style="font-family: Century-Book">Maverick</span><span style="font-family: 宋体">框架。这个框架联合了</span><span style="font-family: Century-Book">Velocity</span><span style="font-family: 宋体">和</span><span style="font-family: Century-Book">DVSL</span><span style="font-family: 宋体">，它允许你构建一个企业级的</span><span style="font-family: Century-Book">XML</span><span style="font-family: 宋体">应用。你也可以在应用中混合使用</span><span style="font-family: Century-Book">JDBC</span><span style="font-family: 宋体">和</span><span style="font-family: Century-Book">EJBs</span><span style="font-family: 宋体">。</span></p>
<p style="text-align: left" align="left"><strong><em><span style="font-size: 11.5pt; font-family: Formata-MediumItalic">Chapter 16: Velocity IDEs</span></em></strong></p>
<p style="text-align: left" align="left"><span style="font-family: 宋体">虽然许多开发者和设计者都使用文本编辑器来操作他们的</span><span style="font-family: Century-Book">WEB</span><span style="font-family: 宋体">页面，一些人更喜欢使用</span><span style="font-family: Century-Book">IDE</span><span style="font-family: 宋体">。本章提供了各种不同的第三方</span><span style="font-family: Century-Book">IDE</span><span style="font-family: 宋体">插件和文本编辑器插件。我们将涵盖许多开发工具的插件，比如</span><span style="font-family: Century-Book">IntelliJ's IDEA, UltraEdit, JEdit, TextPad,</span><span style="font-family: 宋体">和</span><span style="font-family: Century-Book"> Emacs</span><span style="font-family: 宋体">。</span></p>
<p style="text-align: left" align="left"><strong><em><span style="font-size: 11.5pt; color: black; font-family: Formata-MediumItalic">Chapter 17: </span></em></strong><strong><em><span style="font-size: 11.5pt; color: black; font-family: 宋体">在</span></em></strong><strong><em><span style="font-size: 11.5pt; color: black; font-family: Formata-MediumItalic">Struts</span></em></strong><strong><em><span style="font-size: 11.5pt; color: black; font-family: 宋体">里使用</span></em></strong><strong><em><span style="font-size: 11.5pt; color: black; font-family: Formata-MediumItalic">Velocity</span></em></strong></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: Century-Book">Struts</span><span style="color: black; font-family: 宋体">或许是目前用得最多的</span><span style="color: black; font-family: Century-Book">MVC</span><span style="color: black; font-family: 宋体">框架了。</span><span style="color: black; font-family: Century-Book">Velocity</span><span style="color: black; font-family: 宋体">团队预期的开发目标是使用</span><span style="color: black; font-family: Century-Book">Velocity</span><span style="color: black; font-family: 宋体">作为</span><span style="color: black; font-family: Century-Book">MVC</span><span style="color: black; font-family: 宋体">框架里的</span><span style="color: black; font-family: Century-Book">VIEW</span><span style="color: black; font-family: 宋体">组件，同时创建可利用的接口包来进行综合处理。本章为使用</span><span style="color: black; font-family: Century-Book">Struts</span><span style="color: black; font-family: 宋体">和</span><span style="color: black; font-family: Century-Book">Velocity</span><span style="color: black; font-family: 宋体">创建一个应用提供了完整的说明。</span></p>
<p style="text-align: left" align="left"><strong><em><span style="font-size: 11.5pt; color: black; font-family: Formata-MediumItalic">Chapter 18: </span></em></strong><strong><em><span style="font-size: 11.5pt; color: black; font-family: 宋体">酒店预约</span></em></strong><strong><em><span style="font-size: 11.5pt; color: black; font-family: Formata-MediumItalic">Velocity</span></em></strong><strong><em><span style="font-size: 11.5pt; color: black; font-family: 宋体">应用系统</span></em></strong></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">在这一节时里，我们使用</span><span style="color: black; font-family: Century-Book">Velocity</span><span style="color: black; font-family: 宋体">和</span><span style="color: black; font-family: Century-Book">MVC</span><span style="color: black; font-family: 宋体">框架书写了一个完整的</span><span style="color: black; font-family: Century-Book">WEB</span><span style="color: black; font-family: 宋体">应用文档。我们使用许多模板来为</span><span style="color: black; font-family: Century-Book">WEB</span><span style="color: black; font-family: 宋体">用户提供输入和显示页面。控制器使用</span><span style="color: black; font-family: Century-Book">MYSQL</span><span style="color: black; font-family: 宋体">数据库跟踪酒店房间信息。</span></p>
<p style="text-align: left" align="left"><strong><em><span style="font-size: 11.5pt; color: black; font-family: Formata-MediumItalic">Chapter 19: </span></em></strong><strong><em><span style="font-size: 11.5pt; color: black; font-family: 宋体">在</span></em></strong><strong><em><span style="font-size: 11.5pt; color: black; font-family: Formata-MediumItalic">JSP</span></em></strong><strong><em><span style="font-size: 11.5pt; color: black; font-family: 宋体">里使用</span></em></strong><strong><em><span style="font-size: 11.5pt; color: black; font-family: Formata-MediumItalic">Velocity</span></em></strong></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">许多</span><span style="color: black; font-family: Century-Book">WEB</span><span style="color: black; font-family: 宋体">设计者和开发者对</span><span style="color: black; font-family: Century-Book">JSP</span><span style="color: black; font-family: 宋体">已经非常熟悉，他们不想切换到</span><span style="color: black; font-family: Century-Book">Velocity</span><span style="color: black; font-family: 宋体">或不想放弃</span><span style="color: black; font-family: Century-Book">JSP</span><span style="color: black; font-family: 宋体">页面，只想把</span><span style="color: black; font-family: Century-Book">JSP</span><span style="color: black; font-family: 宋体">和</span><span style="color: black; font-family: Century-Book">Velocity</span><span style="color: black; font-family: 宋体">混合在起编程。本节向你展现了如何在</span><span style="color: black; font-family: Century-Book">JSP</span><span style="color: black; font-family: 宋体">页面里使用</span><span style="color: black; font-family: Century-Book">Velocity</span><span style="color: black; font-family: 宋体">标记库将</span><span style="color: black; font-family: Century-Book">Velocity</span><span style="color: black; font-family: 宋体">命令嵌入到</span><span style="color: black; font-family: Century-Book">JSP</span><span style="color: black; font-family: 宋体">页面中。</span></p>
<p style="text-align: left" align="left"><strong><em>&nbsp;</em></strong></p>
<p style="text-align: left" align="left"><strong><em><span style="font-size: 11.5pt; color: black; font-family: Formata-MediumItalic">Chapter 20: DVSL</span></em></strong><strong><em><span style="font-size: 11.5pt; color: black; font-family: 宋体">和</span></em></strong><strong><em><span style="font-size: 11.5pt; color: black; font-family: Formata-MediumItalic">Velocity</span></em></strong></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: Century-Book">Velocity</span><span style="color: black; font-family: 宋体">类型声明语言（</span><span style="color: black; font-family: Century-Book">DVSL</span><span style="color: black; font-family: 宋体">）是为许多</span><span style="color: black; font-family: Century-Book">XSLT</span><span style="color: black; font-family: 宋体">特性功能而设计的（？），它可以使用许多</span><span style="color: black; font-family: Century-Book">XSLT</span><span style="color: black; font-family: 宋体">中相同的方法函数来转换</span><span style="color: black; font-family: Century-Book">XML</span><span style="color: black; font-family: 宋体">。本章提供了一些使用</span><span style="color: black; font-family: Century-Book">DVSL</span><span style="color: black; font-family: 宋体">例子。</span></p>
<p style="text-align: left" align="left"><strong><em><span style="font-size: 11.5pt; color: black; font-family: Formata-MediumItalic">Appendix A: The Velocity</span></em></strong><strong><em><span style="font-size: 11.5pt; color: black; font-family: 宋体">规范</span></em></strong></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: Century-Book">Velocity</span><span style="color: black; font-family: 宋体">系统由许多类和接口组成。本附录提供了一个完整的概览。</span></p>
<p style="text-align: left" align="left"><strong><em><span style="font-size: 11.5pt; color: black; font-family: Formata-MediumItalic">Appendix B: Velocity </span></em></strong><strong><em><span style="font-size: 11.5pt; color: black; font-family: 宋体">站点</span></em></strong></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">本附录提供了一个</span><span style="color: black; font-family: Century-Book">Velocity</span><span style="color: black; font-family: 宋体">帮助站点列表。</span></p>
<img src ="http://www.blogjava.net/kingwee/aggbug/233798.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kingwee/" target="_blank">KINGWEE</a> 2008-10-11 22:26 <a href="http://www.blogjava.net/kingwee/articles/233798.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>