下面是我们的示例ASP.NET和JSF应用程序的两幅快照。由于两种组件的内在特性以及我也没有对之应用匹配的视觉式样,所以它们看起来略微有些不同。在两个页面中,显示一个会议房间表格,还有进一步了解相应房间的View按钮和预订该房间的Reserve按钮。
ASP.NET程序快照

上面这些组件都是通过拖动添加的,然后通过修改一个属性面板定制它们的外观和行为。当然,我还可以通过编辑它们在HTML源码中的标签来定制这些组件。在此不赘述。下面,我们重点分析一下在这些web页面背后的代码文件,从而进一步分析事件代码。
我认为,以表格形式显示数据是不错的开始,因为这种情况在应用程序是常见的。为此,ASP.NET和JSF也都没有忽略这种实现,两类被显示的组件都提供了内置功能来实现诸如排序和分页显示等效果。在ASP.NET 2.0之前,ASP.NET就已经提供了许多数据显示组件,其中DataGrid组件是使用最广泛的。另外,ASP.NET 2.0发行中引入了一个新的GridView组件。在本例中,我使用了这种组件,因为它添加了一些新的有用的特性。ASP.NET组件利用ADO.NET技术,这也是整个.NET框架的数据存取技术-ADO.NET提供了一种健壮的对象模型来操作各种类型的数据源。例如,Dataset对象允许你以一种断开的方式来使用数据。这意味着,为了使用数据,你的应用程序并不需要连续地连接到数据库上。一个Dataset还允许你隐蔽在它的接口后面的数据库细节,从而使你以对应用程序的其它部分极小的影响来切换数据库。我在本例中所使用的JSF组件是一个与Java Studio Creator一同发行的表格组件。它使用一个DataProvider对象-它允许你利用JDBC Rowset技术。JDBC Rowset还能使你在断开的情况下以一种易于使用的方式使用数据库。
理想情况下,ASP.NET和JSF web页面应该包含很少的代码而且只是包含必要的HTML和标签来生成页面的组件,一个页面的事件逻辑驻留于代码文件中。在ASP.NET中,每个web页面与一个相应的子类化页面ASP.NET类的.NET类文件相关联。有时,这些文件被引用为"code-behind"文件。在JSF中,每个web页面都有一个相关联的支持JavaBean类。ASP.NET的code-behind文件和JSF支持bean都包含页面属性(例如标签和输入域)。JSF bean是用Java编写的,而ASP.NET code-behind文件可以使用任何.NET语言(例如VB.NET或C#)编写。ASP.NET code-behind类负责处理相关联的页面事件。这个处理一个组件事件的Java类不必是页面的支持JavaBean。过一会我们再讨论它。值得注意的是,在ASP.NET中分离的code-behind文件可能是不必要的-有可能在页面本身的代码中实现事件处理。然而,一般来说,这被认为是一种不好的编码实践,因为这样以来将会导致混淆HTML和代码问题。
下面是我们的示例ASP.NET和JSF应用程序的两幅快照。由于两种组件的内在特性以及我也没有对之应用匹配的视觉式样,所以它们看起来略微有些不同。在两个页面中,显示一个会议房间表格,还有进一步了解相应房间的View按钮和预订该房间的Reserve按钮。

上面这些组件都是通过拖动添加的,然后通过修改一个属性面板定制它们的外观和行为。当然,我还可以通过编辑它们在HTML源码中的标签来定制这些组件。在此不赘述。下面,我们重点分析一下在这些web页面背后的代码文件,从而进一步分析事件代码。
我认为,以表格形式显示数据是不错的开始,因为这种情况在应用程序是常见的。为此,ASP.NET和JSF也都没有忽略这种实现,两类被显示的组件都提供了内置功能来实现诸如排序和分页显示等效果。在ASP.NET 2.0之前,ASP.NET就已经提供了许多数据显示组件,其中DataGrid组件是使用最广泛的。另外,ASP.NET 2.0发行中引入了一个新的GridView组件。在本例中,我使用了这种组件,因为它添加了一些新的有用的特性。ASP.NET组件利用ADO.NET技术,这也是整个.NET框架的数据存取技术-ADO.NET提供了一种健壮的对象模型来操作各种类型的数据源。例如,Dataset对象允许你以一种断开的方式来使用数据。这意味着,为了使用数据,你的应用程序并不需要连续地连接到数据库上。一个Dataset还允许你隐蔽在它的接口后面的数据库细节,从而使你以对应用程序的其它部分极小的影响来切换数据库。我在本例中所使用的JSF组件是一个与Java Studio Creator一同发行的表格组件。它使用一个DataProvider对象-它允许你利用JDBC Rowset技术。JDBC Rowset还能使你在断开的情况下以一种易于使用的方式使用数据库。
注意,在上面的事件代码中,ASP.NET文件调用一个方法"Server.Transfer"实现把控制传递给另一个页面。然而,在JSF事件代码中,你不会找到这样的到另一个页面的直接的参考,而仅有返回串"view"和"reserve"。这是因为,JSF中经由我们更早讨论的faces-config配置文件处理页面流问题,任何使用过开源框架Struts的Java开发者应该对此很熟悉。在ConferenceRooms.jsp文件的faces-config.xml文件中共有两个入口-字符串"view"和"reserve"。在运行时刻,应用程序使用这些字符串查询页面地址。下面是在ConferenceRooms.jsp页面的faces-config文件中发现的XML形式的导航规则。我是使用Java Studio Creator中的一个可视化设计器创建的这些映射。
<from-view-id>/ConferenceRooms.jsp</from-view-id>
<navigation-case>
<from-outcome>view</from-outcome>
<to-view-id>/RoomReservations.jsp</to-view-id>
</navigation-case>
<navigation-case>
<from-outcome>reserve</from-outcome>
<to-view-id>/ReserveRoom.jsp</to-view-id>
</navigation-case>
</navigation-rule>

可视化设计器展示了在Java Studio Creator中的导航规则
这个faces-config文件也是你列举与你的JSP页面文件相关联的所有Java Bean的地方。事实上,你可以通过这个文件配置任何你的应用程序需要参考的Java对象-这些Java对象被参考为'managed beans'。所有的JSF支持bean都将在这个配置文件中被列举为托管bean,但是任何你需要的其它对象也都可以在这里找到。一个托管bean包含完全限定的类名、该bean(是把它存储在应用程序的Request,Session还是应用程序级)的使用范围以及当参考这个bean时要使用的名字。在下面的XML中,列举出了初启web页面的支持bean,还有一个名为ReservationsSessionBean(我们使用它来共享应用程序中的数据)的EJB的入口:
<managed-bean-name>ReservationsSessionBean</managed-bean-name>
<managed-bean-class>webreservations.ReservationsSessionBean</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
</managed-bean>
<managed-bean>
<managed-bean-name>ConferenceRooms</managed-bean-name>
<managed-bean-class>webreservations.ConferenceRooms</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
</managed-bean>
JSF
一个delete按钮相应于删除每一行数据,这两个组件都允许你轻松地修改表中的数据。最后,每一个表单都包含一个按钮-它把你导向另一个表单以添加对该房间的新的预订。这些表单显示于下面图中。注意,在图中由Java Studio Creator和Visual Studio实现的日历组件在显示上有所不同,但是实现相同的目的。





