目录
此处引用的 Adventure Builder 应用程序是以 Sun Microsystems Java BluePrints 程序(它用于展示 J2EE 1.4 平台上的 Web 服务)中的 Java Adventure Builder Reference 应用程序为模型。我们已使用 Java Studio Creator 2 IDE 重新构建并重新实现了 Adventure Builder 应用程序的客户 Web 部分以及它与 Web 服务的交互。 通过 Java Studio Creator 实现的 Adventure Builder 应用程序利用了 IDE 的多项功能。我们将向您介绍如何使用 JavaServer Faces 组件和页面片段来构建 JSP 页,该页可用来访问 Web 服务和数据库。同时,我们还将向您说明如何使用诸如 CSS、虚拟表单、转换器和验证器之类的功能,并向您介绍如何在适当的情况下定制这些功能。
准备开始之前,您首先应通过阅读位于
重要说明:在继续之前,请参见位于 安装 Adventure Builder
请按照以下说明安装 Adventure Builder 应用程序,并确保在 IDE 中对其进行正确设置。
运行 Adventure Builder
安装 Adventure Builder 项目后,您可能希望从 Java Studio Creator IDE 中浏览项目的各个部分。在“项目”窗口中,展开 AdventureBuilder 项目节点,然后展开“Web 页”节点。您应该看到 "resources" 节点,该节点包含在整个应用程序中使用的图像文件以及应用程序的样式表。“Web 页”节点还包含组成应用程序的不同 JSP 页和页面片段。双击“项目”窗口中的任何页,即可在“设计”窗口中查看其布局(使用 "JSP" 和 "Java" 标签可查看同一页的 JSP 和 Java 源代码)。 图 4 显示了一些在“项目”窗口中出现的 Adventure Builder Web 页。“设计”窗口显示了 Account.jsp 页。请注意 Main.jsp 页标有一个绿色箭头。该绿色箭头指示此页为起始页 - 即,运行应用程序时首先显示的页。
同样,在“服务器”窗口中,展开“数据源”节点可看到 Adventure Builder 数据源
要生成并运行应用程序,请右键单击“项目”窗口中的 "AdventureBuilder" 节点,然后从上下文菜单中选择“运行项目”。IDE 将编译并部署该应用程序。在部署完成后,将在浏览器窗口中打开 Adventure Builder,并显示 Main.jsp 页。 试用一下该应用程序。在各种探险类别中单击某个探险类别(如 Mountain Adventure),然后从中选择一种探险。也许您会选择 "Mountain Relaxation Adventure"。您将看到套餐旅游的详细信息 - 价格、旅店住宿以及活动列表。单击 "Select Package" 按钮可以购买套餐旅游项目,或单击 "Cancel this Adventure" 返回到探险类别页以选择其他探险。在您选择了套餐旅游项目后,该应用程序将转至某一页面,您可以在该页面中指定人数、开始和结束日期以及要预订的房间数。从下拉菜单中选择人数和房间数,然后输入开始和结束日期,以便对缺省的开始及结束日期进行更改。或者,单击位于相应的日期字段旁边的日历图标以显示某个日历,您可以从中选择某个日期。然后,选择航班或提供您自己的交通方式。至此,您便完成了探险套餐旅游选项的设置,现在应用程序将转至结帐屏幕。 完成结帐过程之前,您可以使用结帐屏幕上的标签来检查和更新已设置的选项:您可以更改住宿详细信息,删除活动以及重新设置交通方式选项。当一切准备就绪,请在 "Summary" 标签显示中单击 "Checkout" 按钮。如果您尚未注册,则应用程序将转至 "Sign In" 页,您可以在该页中作为回头客登录或创建一个新帐户。登录后,您将看到自己的帐单和信用卡信息,并可以更新这些字段。单击页面底部的 "Submit" 按钮完成购买探险套餐旅游的操作。应用程序将转至已完成的结帐页,您可以从该页中查看刚刚订购的套餐旅游详细信息。 Adventure Builder 应用程序的体系结构
整个 Java Adventure Builder Reference 应用程序是由多个基于 J2EE 的应用程序组成的,这些应用程序使用 Web 服务进行交互。在本文档中,我们将着重说明在 IDE 中实现的 Adventure Builder 应用程序部分,并将重点介绍客户界面,即客户 Web 站点应用程序,该应用程序已被替换为使用 JavaServer Faces 组件的 Java Studio Creator 版本。我们的客户 Web 站点应用程序与部署在应用服务器上的订单跟踪 Web 应用程序进行交互,该订单跟踪应用程序模拟引用应用程序的订单跟踪 Web 服务。此外,客户 Web 站点应用程序还与数据库进行交互。 该多层应用程序的前端是客户 Web 站点。客户使用浏览器与客户 Web 站点进行交互,以购买旅行度假套餐旅游项目。他们期望获得某些服务,例如可以跟踪订单。一旦客户组合并购买了度假套餐旅游项目,客户 Web 站点就会生成一个采购订单,并将其发送到订单处理中心。订单处理中心负责执行订单。图 6 显示了该应用程序的用例图。
在 IDE 之外开发的模块 尽管 Java Studio Creator 可以轻松地使用 Web 服务,但是它不支持创建 Web 服务。因此,订单跟踪 Web 服务应用程序是使用 Sun Java Studio Enterprise IDE 开发的(NetBeans 是另一个可用于开发 Web 服务应用程序的工具)。
Web 服务应用程序是使用 Java Studio Enterprise 创建的,并且在创建完成后将其包装为一个 Web 服务客户端工件
Adventure Builder 应用程序使用这些 JAR 文件中的类来调用订单跟踪 Web 服务的方法,尤其是 OrderTrackingClient 类上的 您可以从 IDE 的“项目”窗口中查看这些文件并检查它们的内容。展开 AdventureBuilder 项目中的 “lib” 节点,并向下滚动到 OrderTracking Web 服务的条目。
在用户请求中共享状态 当用户首次启动浏览器会话时,IDE 会自动实例化一个名为 SessionBean1 的会话 Bean。在浏览器会话终止之前,此会话 Bean 将一直存在。会话 Bean 对象被认为存在于会话范围内,而且这些对象是唯一的并为每个用户会话所专用。会话 Bean 可以在多个页面上使用,并且在同一会话中运行的其他对象可以访问该会话 Bean。 Adventure Builder 应用程序使用 SessionBean1 保存它在整个用户会话期间所需的状态。除了与用户选择的下拉列表组件的选项和值有关的一些属性外,这还包括应用程序使用的大部分行集数据。 请求 Bean 是另一种在多页中共享状态的机制。请求 Bean 仅用于在页面之间传递某个状态,除此之外不会保留其状态。要使用请求 Bean,您应当为请求 Bean 添加一个属性,以保存要在两个页面之间传输的状态。然后,在第一页的操作处理程序方法(它启动指向第二页的链接)中,使用请求 Bean 的 setter 方法添加代码以设置此请求 Bean 属性的值。第二页在其初始化代码中使用请求 Bean 存取方法,从该请求 Bean 属性中获取值。
Adventure Builder 应用程序使用 RequestBean1 在 CartSummary 和 Customer 两个页面之间传递某些住宿和客户帐户的行集数据。如果在“概要”窗口中检查 RequestBean1,您会注意到,它包括
这两个行集被放置在请求 Bean 中,原因是只有两个页面需要共享数据。如果放置在会话 Bean 或应用程序 Bean 中,则数据将在整个用户会话期间或应用程序的整个持续时间(对于应用程序 Bean 而言)中一直存在。 安全 Adventure Builder 允许已注册和未注册(也称为匿名)的用户访问 Web 站点。这两种类型的用户都可以通过目录浏览探险套餐旅游项目、选择并形成一个完整的套餐旅游项目,即,将各项放置在虚拟购物车中,所有这一切都无须注册。但是,用户必须注册和登录(只有已注册的用户才可以登录)到应用程序,才能真正购买套餐旅游项目。 如果用户在访问结帐页时尚未登录,则应用程序将要求用户完成登录过程。如果用户已注册,则可以使用其注册的用户名和口令进行登录。或者,用户此时可以通过提供其他标识信息进行注册,然后进行登录。 Web 应用程序将跟踪那些尚未登录的客户。这样,应用程序便可以在这些客户尝试购买购物车中的物品时显示登录页。应用程序登录页既允许回头客登录,同时也允许新客户进行注册。 使用 Web 服务
假定您希望查找使用此 Web 服务的一个或多个页面。如果您不想在应用程序的大量页面中手动搜索,请使用“编辑”下拉菜单中的“在项目中查找...”功能。图 9 显示了“在项目中查找”对话框,我们通过使用该对话框来搜索
当您打开 TrackOrderResult 页时,“概要”窗口会显示该页面上的组件以及
页面的 Java 代码可以调用 Web 服务的
OrderDetails details = 用户界面和 JavaServer Faces 组件
正如上面所述,我们使用 IDE 组件面板中的 JavaServer Faces 组件生成了客户 Web 应用程序用户界面。我们还使用了 IDE 编辑器(特别是样式编辑器和查询编辑器)对这些组件进行了调整。 让我们看一下用户界面必须执行的一些任务,如页面布局、过程流、数据访问和错误消息显示,并了解如何使用各种 IDE 组件来处理这些任务。
要了解有关组件的详细信息,请参见位于 页面布局 页面片段
页面片段出现在“项目”窗口中的“Web 页”节点下,并且具有 我们希望在每页的顶部使用相同的标题或页眉,并在每页的底部使用相同的页脚。页眉显示可能会随着用户在页面之间的导航而稍有变化,但是页眉仍会保持相同的外观。我们还希望每页都具有相同的样式边栏,即使边栏可能显示不同的信息(或不显示信息)。因此,我们为页眉、左边栏和页脚创建了页面片段,它们分别为 AbHeader.jspf、LeftSidebar.jspf 和 Footer.jspf。
在内容重用方面,页面片段要优于模板,尽管模板也有助于您在多个页面中重用相同的内容。页面片段实际上是被添加它的不同页面所引用,无需将页面片段复制到这些页面中。例如,通过使用 JSP 指令 以后,您可能会决定更改页眉的布局或内容。如果使用的是页面片段方法,则只需对页面片段进行更改,包含该片段的所有页面会自动反映这些更改。然而,如果使用的是模板方法,则必须显式地编辑每个页面。 网格面板 下面介绍了网格面板的工作方式。首先,从组件面板的“布局”类别中将一个网格面板拖动到页面上,将其放在要排列组件的页面区域中。然后将其他组件(如标签、文本字段等)拖放到网格面板上。缺省情况下,您添加到网格面板上的组件将按照添加它们的顺序在面板中从上至下依次显示。如果面板包含多列,则以从左至右、从上至下的顺序添加组件。您可以使用网格面板的属性表单来控制组件的布局和面板的外观,例如通过设置列数、外观规则、新组件的添加方向、样式等。
当您设计页面布局时,Account.jsp 页是一个很好的让您了解如何使用网格面板的示例。帐户页主要显示一个表单,以供用户在创建新的客户帐户时填写。图 11 显示了“设计”窗口中使用网格面板的帐户页部分。“概要”窗口则显示了已添加到此网格面板的组件。另请注意,网格面板组件本身可以包含网格面板组件。对于 Account.jsp 页上的表单,存在一个外部网格面板(标记为
在“设计”窗口中,网格面板的轮廓由虚线来标记。当网格面板处于选中状态时,您可以手动调整其大小,方法是:单击位于四个角中的方框,然后沿轮廓的边缘拖动方框。但是请记住,当您将组件拖放到面板上时,该面板将自动扩展。 由于这是一个两列的网格面板,因此拖放到该面板上的组件将按照先从左至右再从上至下的顺序显示。即,首先从左至右添加表示姓氏的标签和文本字段组件,然后在姓氏的下方从左至右添加另外两个组件,在底部添加表示国家/地区的标签和文本字段组件。另请注意,添加到面板的所有组件均处于对齐状态,且在其各自的列中靠左对齐。所以可以认为,网格面板专门负责组件的排列布局。 表组件 让我们看一下 AdventureDetails.jsp 页是如何使用表组件的。请注意,在浏览器中此页显示了三个类似的表(请参见图 12)。我们将这三个表放置在页面上已有的网格面板组件中。通过网格面板可以将表对齐,并允许我们在这三个表的周围放置边框。
开发此页时,我们首先在页面上放置一个网格面板组件,然后将各个表组件拖放到网格面板上。接下来,将数据库表拖放到不同的表组件上。例如,将 ACTIVITY 表拖放到一个表组件上(请参见图 13)。
然后,选择表组件,并从上下文菜单中打开“表布局”对话框。使用该“表布局”对话框(请参见图 14)定制表,以便它像图 12 中所示的那样出现在浏览器中。在表布局“选项”标签中,键入表的标题 (Included Activities),清除分页、排序和其他选项。在“列”标签中,删除显示的三个数据库表列之外的所有列,并添加一个图像列。
数据访问和数据提供器组件 请注意,许多 Adventure Builder 页都包含一个或多个数据提供器。除了各个页中的数据提供器外,SessionBean1 还包括访问不同表的行集。每个行集都表示一个查询(或 SQL SELECT 语句)。 例如,让我们看一下 Travel.jsp 页。通过此页,您可以选择起程航班和返程航班。它包括与 SessionBean1 中的三个行集(transportationRowSet、transportationDepartureRowSet 和 transportationReturnRowSet)关联的三个数据提供器(transportationDataProvider、transportationDataProvider1 和 transportationDataProvider2)。这些行集的查询 SELECT 语句从 TRANSPORTATION 数据库表中获取匹配的行。 通过 Travel.jsp 页,用户可以同时选择度假的起程航班和返程航班。transportationDataProvider 包装了用于检索所有航班的 SQL 查询,而 transportationDataProvider1 包装了起程航班的查询,transportationDataProvider2 包装了返程航班的查询。最后两个查询会基于原始参数和目标参数来选择行。请参见图 15 和图 16。
您可能想知道为什么此页使用三个数据提供器和三个行集。应用程序使用数据提供器 API 访问由不同的行集查询返回的不同缓存表数据集。每个行集都保留一个单独的缓存行集或数据集,并在这些缓存行中保留单独的指针。
要了解有关数据库访问的详细信息,请参见位于 控制应用程序流 页面导航 无论采取哪种方法,您都可以重新访问页面导航功能,进而调整页面之间的交互,尤其是当您希望将一个页面上的特定操作组件链接到其他页面上时。通常情况下,以页面级别为准,将一个页面链接到另一个页面,从而定义应用程序流。然后,在各个页面上实现应用程序细节(即,在页面上放置按钮、链接等)时,可以返回到“导航”窗口,并在单个页面中的组件级别创建导航链接。您甚至可以直接在“导航”窗口中将按钮和其他链接添加到页面中。 例如,图 17 显示了“导航”窗口中 Adventure Builder 页面导航显示的一部分。
图 18 显示了同一页面导航显示的不同片段,但是现在您可以在组件级别上看到链接。我们单击了 CartSummary.jsp 页上的结帐按钮 (checkoutButton),将该页放大并显示了该页组件的详细信息和指向后续页面的链接。
标签组件 IDE 提供了标签集和标签组件,我们使用这些组件在 CartSummary 页上创建了一组标签。标签可以具有子标签和其他组件(如按钮、超级链接和网格面板),所有这些都显示在顶级标签的下面。当应用程序运行时,会显示顶级标签。如果用户单击某一标签,则会在选定标签下显示子标签或组件。并且 IDE 会生成各种标签及子标签之间的链接。 通过 CartSummary 页上的标签,客户可以轻松地导航到订单的不同汇总屏幕(住宿、活动、交通方式等)。我们已将标签集组件从组件面板的“布局”类别拖放到页面上。标签集就像一个包含实际标签和子标签的容器。将一个标签集拖放到已添加了一个标签集和一个标签的页面上。然后,通过将标签组件拖放到标签集上来添加其他标签,这是在同一顶级上添加标签(虽然我们未使用过子标签,但是将一个标签组件拖放到另一个标签组件上会创建子标签)。 在添加标签时,IDE 会分配缺省名称和序列号,从 Tab 1、Tab 2 开始依此类推。我们更改了这些名称以匹配特定标签的功能。我们还在每个标签的下方放置了网格面板组件,以包含特定的汇总显示。例如,图 19 显示了 cartSummary 页上的标签集组件。如果选择 "Lodging" 标签,则“设计”窗口将显示用户以前选择的住宿安排。
处理错误 应用程序使用消息组件显示与特定组件关联的信息性消息或错误消息。它使用消息组组件显示全局性的消息或与整个页面有关的消息,如系统错误。在您开发应用程序时,消息组组件也是非常有用的,因为它们对调试页面很有帮助。
有关详细信息,请参见位于 虚拟表单 我们使用虚拟表单功能来定义两组输入数据:一个虚拟表单包含回头客输入的数据,另一个虚拟表单包含新客户输入的数据。在我们处理 Login.jsp 页时,虚拟表单将这两组数据分别进行处理。例如,如果用户为回头客,则单击 "Sign In" 按钮时,仅处理口令字段。而不处理新用户的名称字段。
要了解有关虚拟表单的详细信息,请参见位于 图 20 显示了 Login.jsp 页,其中虚拟表单显示处于打开状态。
其他组件 验证器 小结
本文介绍了如何使用 Java Studio Creator 2 IDE 来开发面向客户的 Web 应用程序。以 Adventure Builder 客户 Web 应用程序为例,本文说明了如何通过 IDE 轻松设计并生成此应用程序。尽管本文不能作为实践教程(涵盖 IDE 的所有方面)来使用,但也确实为大家提供了有效使用 IDE 的简便方法。 此外,本文还介绍了如何使用组件面板上各种复杂的组件来快速设计具有复杂功能和专业外观的 Web 页,如何使用页面导航功能在应用程序的页面之间建立控制流,以及如何在 Web 应用程序中包含数据库访问、通过外部 Web 服务获取信息,并考虑用户访问的安全性。
有关使用 IDE 的详细信息,请参见位于
您还应当浏览 |
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
| ||||||||||||