内容


使用 Rational Application Developer 中的 JSFTrace 来进行 JavaServer Faces 程序调试和排除故障

Comments

在 JavaServer™ Faces (JSF)程序中,每一个来自浏览器的请求,在可以生成回应之前,都要通过一系列复杂的处理步骤。这些复杂的步骤(或者叫做过程,就像它们在 JSF 中那样)叫做 JSF 生命周期。有一些情况,可以决定执行什么阶段的生命周期,因此,进而决定向浏览器发送什么信息以回应请求。

JSF 开发人员在开发和调试他们的程序时,通常会面临很多问题。这些问题可以归因于对 JSF 生命周期理解的不到位,或者在服务器 JSF 生命周期阶段无力全程监控进程。

这些问题中,一个很典型的例子,便是用户是在什么时候点击了一个 JSF 页面上的按钮,以及开发人员本来想让程序切换(导航)到一个不同的页面,但是实际呈现在用户面前的还是相同的页面。导航信息丢失的原因,是用户提供的对页面提供的不确切信息,是 JSF 探测的验证或者转变错误,由于这些错误,跳出了导航所负责的阶段。如果开发人员对这种可能性不负有责任,并向页面添加一个特殊的标记以显示错误(例如 <h:messages> ),不管是用户还是开发人员,在试着找出为什么同一个页面重新出现时,都会茫然不知所措。

IBM® Rational® Application Developer V7.5.4 引入了一个 JSF Trace 特性,该特性给了开发人员一个关于运行 JSF 程序的潜在巅峰。它收集了关于 JSF 生命周期的信息,并以一种容易理解的方式来将其实时显示。

追踪的信息

当您向程序添加 JSF Tracing 支持功能时,会收集到关于 JSF 生命周期的以下信息,同时浏览器的请求也会得到处理(查看图 1 中的例子):

  • 收到的请求,它包含了请求的路径信息、参数、报头以及 cookies 。
  • 所有执行的生命周期阶段,包含了关于每一个阶段的以下信息:
    • 阶段名字
    • 该阶段所花费的大概时间
    • 请求、会话以及程序范围中对象之前和之后的阶段快照
    • JSF 视图之前和之后的阶段快照,包含了视图属性以及组件构件树(构件类型,ID,以及值) 。
  • 注册的信息(错误,警告,信息)
  • 发生的导航,包含了源页面和目标页面,产生导航的操作,以及操作的结果。

收集到的追踪信息,同样由使用的信息、图片以及强调性字体来修饰,以指出请求处理期间发生的重大事件,例如范围性对象(例如 JSF 管理的 beans)、构件属性或者根本没有赋值构件的创建或者编辑操作。查看接下来的“Legend”章节以得到细节信息。

图 1. Trace 视图
范例 Trace 视图内容
范例 Trace 视图内容

追踪不同于真实的调试,理解这一点非常重要,因为它呈现了“历史性”的数据;在收集关于对象的信息时,视图中呈现的所有对象都会存在于它过去所在的位置上,但是这些对象出现在树状视图中时并不存在。因此,使用 JSF Trace 视图来检查对象是不可能的,在您调试程序时您会适应这一点的。

JSF Trace 特性对真实调试提供了有限的支持功能(查看接下来的“Debugging”),但是它并不会被当做一个调试工具的。

技术性结构

JSFTrace 特性包含了两个部分:

  • Rational Application Developer 中的 JSF Trace 视图:
  • 程序的 WEB-INF/lib 文件夹中的 jsf-trace.jar (Java™ Archive,或者 JAR)文件。

当程序在服务器上运行时, jsf-trace.jar 文件会向收集信息的程序 (PhaseListener 以及 NavigationHandler)安装一些 JSF 工件。收集到的信息会通过网络连接,传递给 Rational Application Developer 中的 JSF Trace 视图,该视图会以一种容易理解的方式理解这些信息,并将其展示出来。JAR 文件和视图通过可以配置的网络插座 ( host:port )来进行交流。

除了 JSF Trace 视图,一个新的 JSF Trace 操控台,会通过网络插座从运行的程序那里展现原始的信息(见于图 2)。

图 2. JSF Trace 操控台
范例 Trace 操控台内容
范例 Trace 操控台内容

安装

按照以下方式,来安装对 JSF 程序的追踪支持功能:

  1. 打开 JSF Trace 视图(默认条件下,不管何时您在服务器上打开 JSF Trace 时,JSF Trace 视图是会自动打开的)。视图会显示出一条信息(因此它还不会检测显示的任何数据)。查看图 3。
  2. 点击 Add Tracing support 链接。
  3. Optional:在工作区内如果有多个 Web 项目,那么您就需要选择向什么项目添加追踪。
  4. 出现的信息会告知您追踪的潜在风险,并让您确认是否向项目添加追踪。在您确认之后, jsf-trace.jar 文件会添加到项目的 WEB-INF/lib 文件夹中。
图 3. JSF Trace 创建
初始 Trace 视图内容

JSF Trace 视图打开而 jsf-trace.jar 文件添加到项目之后,向服务器发布您的决定,然后向浏览器请求打开一个页面。视图会从运行的程序中检测收到的信息,然后用收集的实际数据来替换信息(如图 1 所示)。

卸载特性

为了禁止程序中的 JSF Trace 功能,要么从 WEB-INF/lib 文件夹中删除 jsf-trace.jar 文件,或者将 web.xml 内容参数 com.ibm.faces.trace.ENABLED 设置为 false (查看接下来的“Configuration”章节)。这两种设置,都不会收集任何追踪信息。

为了禁止 Rational Application Developer 中的 JSF Trace 功能,关闭 JSF Trace 视图。在关闭视图之后, Rational Application Developer 将不会从运行的程序中监视进行的交流过程。

程序配置

如表 1 所示, jsf-trace.jar 文件将会添加到项目中,这些项目拥有一些配置设置,通过程序的 web.xml 文件作为内容参数来提供:

表 1. 参数
参数名默认值 (如果内容参数没有出现的话)描述
com.ibm.faces.trace.ENABLED激活或者禁止追踪收集以及交流。
追踪数据的收集,会向程序的性能添加很重的负担,所以在产品中它从来没有得到使用过。
该参数可以设置为“假”以禁止追踪功能。
禁止追踪功能的另外一种方法,是从程序中移除 jsf-trace.jar 文件(查看“卸载特性”章节)。
com.ibm.faces.trace.HOST127.0.0.1Rational Application Developer 运行机器的 IP 地址或者名字。如果主机名已经被使用过了,那么这个问题是可以解决的。
从技术上而言, Rational Application Developer 和 JSF 程序可以在不同的机器上运行,相互之间也可以交流。但是,防火墙可以阻止这种交流。
com.ibm.faces.trace.PORT 4444与 Rational Application Developer 建立连接的 IP 端口。 这种设置应该与 Rational Application Developer 中的 JSF Trace 视图设置相匹配(查看“Preferences”章节)。
com.ibm.faces.trace.MAX_NESTING3在处理范围对象的属性问题时,指定处理的深度。
这个数值越大,收集信息所花的时间就越长。将其传递给 Rational Application Developer 并在视图中显示出来。
增大这个数值时要特别谨慎。
com.ibm.faces.trace.IGNORE非默认

推荐值:
com.ibm.,com.sun.,
javax.,org.,/

注意:末尾的斜杠,是让旧有的 JSF 执行将会话中的视图论述位于 /jspname 键之下。
字符串逗号隔开的列表。如果范围对象的名字,以列表中任何一个字符串开头,那么该对象就会被忽略掉。关于它的信息不会收集,而且不会传递给 JSF Trace 视图。
JSF 程序运行时,会有大量不同范围的对象,这些对象不属于实际的程序,而是属于 JSF 执行或者服务器容器。那些对象很少更改,通常不会引起您的兴趣。因此,您可以从追踪数据中排除出它们,以提高收集以及网络交通的性能。
com.ibm.faces.trace.IGNORE_APPLICATION_SCOPE当该值设置为时,从追踪中排除所有的程序范围对象。
可以用于提高性能(这里收集的信息越少,追踪进行的速度就越快)。
com.ibm.faces.trace.IGNORE_SESSION_SCOPE当该值设置成时,从追踪中会排除所有会话范围内的对象。
可以用于提高性能(这里收集的信息越少,追踪进行的速度就越快)。
com.ibm.faces.trace.IGNORE_REQUEST_SCOPE当该值设置为时,从追踪中会排除所有会话范围内的对象。
可以用于提高性能(这里收集的信息越少,追踪进行的速度就越快)。
com.ibm.faces.trace.IGNORE_VIEW_ATTRIBUTES当该值设置成时,从追踪中会排除所有的视图对象。
可以用于提高性能(收集的信息越少,追踪的速度就越快)。
com.ibm.faces.trace.IGNORE_VIEW_TREE当该值设置成时,会从追踪中排除视图树(所有的构件)。
可以用于提高性能(收集的信息越少,追踪的速度就越快)。
com.ibm.faces.trace.IGNORE_COMPONENT_VALUES当该值设置为时,追踪就不再需要构件的值了。
查询构件的值可能会引起预料之外的效果,因为如果捆绑值没有遵循规范的 JSF 生命周期的话,那么它就会受到评价。反过来,这将会导致不应该创建受管理 bean 时却创建了。
com.ibm.faces.trace.TRACE_UIDATA当该值设置成时, UI Data 构件的追踪会在数据模型上迭代进行,并收集关于每一行构件的信息(快达到行的最大数目)。
当该值设置为时, UI Data 构件的追踪将会只包含 UI Data 构件端的一个实例。
com.ibm.faces.trace.MAX_UIDATA_ROWS10com.ibm.faces.trace.TRACE_UIDATA 被设置成时,该参数就会限制追踪包含的 UI Data 行的数量。这个数值越大,它用于收集信息、将其传递给 Rational Application Developer、然后在视图中呈现出来所花的时间就越长。
增加这个数值时要特别小心。

JSF Trace 视图配置

偏好

JSF Trace 在 Rational Application Developer 的 Preferences (见于图 4)中可以进行一些配置设置。为了进行这些设置,从视图的菜单中选择 Customize,或者使用到 Preferences 的常用路径:Window >Preferences >JSF Tools >Trace

图 4. Preferences
Trace 视图配置
Trace 视图配置

此处有 Preferences 设置以及您需要了解的:

  • 交流端口:用于监听收到交通的插座端口。它应该匹配运行程序 com.ibm.faces.trace.PORT 内容的值(查看“Application configuration”以得到细节信息)。
  • 系统对象:如果范围对象名字以列表中的字符串开始,那么这样的对象将会被当作“系统对象”来处理,这意味着对象不再属于实际的程序,而是属于 JSF 执行或者服务器容器。当对象的值被更改(去避免不相关的信息),或者没有完全显示出来(见于“Filtering”),视图可以被配置成不强调系统对象。默认条件下 ,所有的 com.ibmcom.sunjavax ,以及 org 对象被当作系统对象来处理。
  • 展开树以显示新的和更改后的对象。这将会自动展开树的分支,树中含有新的或者更改后的对象。关闭这个选项可以提高视图的性能。
  • 强调新的和更改后的对象。选中该选项将会使用不同的颜色,来自动标示处理请求期间创建的和更改后的对象(颜色见于下面)。
  • 新值颜色。选择一种颜色来标示特定阶段中创建的对象。
  • 更改值的颜色选择一种颜色来标示特定阶段中更改的对象。
  • 强调系统对象。指定在更改对象的值时,是否强调显示系统对象(见于上面)。
  • 内容更改时会显示视图。如果视图已经打开但是隐藏在其他视图的下面,那么不管何时有新的追踪信息显示时,该视图都会置于顶层显示出来。
  • 当 Faces 页面在服务器上运行时显示视图。不论何时 Run On Server 操作作为 JSF 页面或者项目执行,都会打开视图。
  • 显示解释。不论何时视图自动打开,都会显示一条信息,给您一个使用该功能的机会。

筛选

JSF Trace 视图中显示的信息,可以通过设置筛选规则来进行隐藏。在视图中的菜单中选择 Filters,以查看可用筛选规则的列表,并开启或者关闭个人的筛选规则(见于图 5)。例如,applicationsession,而 request scope 筛选将会从视图中相应的范围隐藏所有的对象;尽管如此, system objects 筛选规则将会隐藏那些对象,这些对象可以在 Preferences 中被设置成“系统”(查看“Preferences”)。

通过隐藏那些您不感兴趣的对象,筛选规则可以帮助您有效地减少视图中的信息量。例如,程序范围内的对象很少发生更改,所以您可以从视图中将它们完全地隐藏起来。

同一时间可以激活多个筛选规则。

图 5. 筛选规则
 Trace 视图的筛选规则
Trace 视图的筛选规则

图例

视图中的追踪信息可以使用强调性的颜色、图片以及字体来修饰。可用的修饰手段有:

  • 在生命周期的某个阶段中创建的对象,用绿色背景来强调显示(该颜色在 Preferences 中可以进行配置)
  • 在生命周期的某个阶段中更改的值,用黄色背景来强调显示(该颜色在 Preferences 中可以进行配置)
  • 生命周期某个阶段中创建或者更改的值,用 粗体来显示。
  • 尚未赋值的构件在构件树中用 斜体来显示。
  • 无效的构件在构件树中用一个小的红色 X 图标来表示。该图标在视图节点中进而标示所有构件的父类。
  • 设置断点的阶段(见于“Debugging”)用一个小的穿透图标来表示(蓝色点)

调试

以上描述的所有追踪特性,并不要求服务器处于调试模式之下。在使用 JSF Trace 时,您会得到大量的信息,这些信息一般仅用于调试(不同对象、执行路径的值) ,同时避免实际调试产生过大的负担。

但是,有时您仍然需要调试程序。在这些情况下,当服务器在调试模式下运行时, JSF Trace 为调试专门提供了两个附加的特性:

  • JSF 特定的断点
  • 注意范围中的对象以及视图属性

断点

使用 JSF Trace 视图,可以在 JSF 生命周期的各个阶段来设置断点。

如果您要设置一个断点,您可以对感兴趣的阶段在树中右键点击“之前”或者“之后”节点,或者使用视图菜单中的“断点”选项(见于图 6)。在设置断点之后,在视图中阶段图标上将会显示一个小的图标,以指示它的存在。断点可以按设置它们的相同方式来删除。

当断点激活时,程序将会暂停,您就可以执行所有通常进行的调试工作了。例如, Variables 视图在当前的状态下会自动包含一个 FacesContext 对象。 FacesContext 是所有关于 JSF 状态信息的根源;因此,通过展开 FacesContext 对象的各个节点,您就能够找到关于当前暂停程序的各个方面的信息。

图 6. 断点菜单
JSF 生命周期的断点设置
JSF 生命周期的断点设置

监视

当程序暂停以检查 JSF 管理 beans 时,通常需要执行的操作,是检查 JSF 管理 beans 的状态。尽管所有管理的 beans (以及其他的范围对象)可以在 Variables 视图中查看 FacesContext 对象来找到,以这种方式来找对象可以说是非常困难和耗时的。为了帮助您完成这些任务, JSF Trace 视图允许为范围性对象和视图属性创建 “watches”。在创建一次监视之后,对象将会自动出现在 Expressions 视图中。

注意:
Watch 表达式只是当执行在程序代码中暂停时才会得到评价(在类中它们在项目的 JavaSource 文件夹中,例如在您自己管理的 beans 中)。当断点在核心 JSF 代码中或者 jsf-trace.jar 文件中激活时,Expressions 并不会得到评价。

要为对象创建一个监视,您可以在视图中右键点击它,并从下拉菜单中选择 Add Watch Expression,或者使用视图菜单中的 Watches 项(见于图 7)。

图 7. Watches 菜单
为 JSF 对象添加监视表达式
为 JSF 对象添加监视表达式

您可以通过 Expressions 视图来编辑或者删除已存在的监视。

图 8 显示了名为“person”的请求范围管理 bean 所添加的 Watch Expression ,而 Variables 视图显示了 FacesContext 对象的当前状态。

图 8. Expressions and Variables 视图
 模式下的监视表达式以及变量
模式下的监视表达式以及变量

相关主题


评论

添加或订阅评论,请先登录注册

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Rational
ArticleID=457526
ArticleTitle=使用 Rational Application Developer 中的 JSFTrace 来进行 JavaServer Faces 程序调试和排除故障
publish-date=12172009