My FAQ,最新最全的IT技术FAQ
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 未整理篇 | 技术讨论
  当前位置:> Bea专区 > WebLogic Server 8.1
用WebLogic Workshop 8.1进行JSP调试
作者:佚名 时间:2005-11-23 20:30 出处:bea 责编:My FAQ
              摘要:暂无
WebLogic Workshop 8.1调试器的两个主要目标是:简化不同程序设计语言之间的交互调试、提供对当前执行状态的便利访问。WebLogic Workshop新版本中添加了一些新的特性,使得调试JSP、标签库、以及它们之间的交互变得更为容易。除了可以在代码级调试JSP,您还可以在JSP和标签库代码之间来回切换,并在调用堆栈上同时观察它们。Workshop还可以深入跟踪到标签库实现类,这样有助于我们在其相应方法上设置断点。在编译JSP页面时调试器可以展现页面的内容,本地和观察窗口可以通过定制化的视图来展现对象。定制化视图使这些对象看起来好像编程用的API,而不是其下复杂的数据结构。
为了演示这些新特性及它们的作用,我们将会调试一个非常简单的Web应用,其中包括一个HTML文件、一个JSP 文件、和一个标签库。该应用的主要目的是接收来自用户的一个数字并输出从1到该数字之间所有数的阶乘,其中包含1和该数字。请打消疑虑,你的确需要一个调试器来跟踪这些问题,甚至还需要一个这样的Web应用。
首先,我们不做任何改动运行应用并观察效果。如果用Workshop的测试浏览器运行HTML文件,请在表单的text字段中输入"4",然后单击"submit",结果得到一个如下的异常:


java.lang.NumberFormatException: null
at java.lang.Integer.parseInt(Integer.java:394)
at java.lang.Integer.parseInt(Integer.java:476)
at jsp_servlet.__factorial._jspService(factorial.jsp:6)
...

这当然不是我们所期望的输出结果。为了跟踪问题,请在代码视图中打开factorial.jsp 并察看它的代码。在JSP的第6行中我们没有找到request 对象的"number"参数,因此请在该行设置断点并在浏览器中重新载入这个JSP。在Workshop中,我们可以在任何调用标签库或包含Java代码片断的JSP源代码上设置断点。类似地,我们可以单步跟踪到这些代码的任意一行。



如果曾经用过JSP或servlet,您应该已经对request对象十分熟悉,它是javax.servlet.HttpServletRequest的一个实例。其中包含了浏览器发送出来的信息,比如request的目的地URI、HTTP报头、等等。调试JSP时通常有两种检查request对象的复杂方法:添加代码,打印request对象的信息到System.out上、或通过本地窗口察看它的数据结构。前一个不好,因为需要添加许多无用代码到JSP中,这将在控制台中迅速生成难以管理的大量文本。后者也很糟糕,因为它需要你了解WebLogic Server的JSP实现是如何存储数据的。
现在有了新版Workshop,我们可以像检查代码那样检查request对象。本地窗口中的视图以名值对的方式显示诸如属性、参数、cookies、和HTTP报头这样的数据,从而避免了再查找各种列表、哈希表、以及其它持有数据的数据结构。Workshop还为会话和cookie对象、以及许多没有绑定到JSP的类:诸如java.lang.StringBuffer、java.util.Date、XMLBeans,提供了方便的视图。想要把任何特殊视图类型切换成标准数据结构视图,右击弹出式菜单即能实现。



想要了解JSP从浏览器获得了那些参数,只需展开request 对象和它的参数即可。展开后会发现其中只有一个名为"Number"的参数。通过查看JSP源代码我们发现它要找的是"number",而不是"Number"。由于参数是大小写敏感的,所以这里是我们的第一个bug。修改JSP源代码,使用"Number"以匹配HTML表单发送过来的数据。
现在,我们在测试浏览器中重新载入该页,会发现异常不再出现。JSP的输出如下:

1! = 1
2! = 1
3! = 2
4! = 6


很显然,程序中还有其它错误。4! = 4*3*2*1 = 24,不应该等于6。通过察看JSP代码我们可以了解到:它实际上利用一个标签库来进行值的计算。我们需要调试标签库,但对其并不了解。这里有几种选择:

  • 在JSP中设置断点,位置在调用标签库的那一行上,然后单步跟进。
  • 使用源代码编辑器跳转到标签库的定义并在那里设置断点
  • 让Workshop跟踪标签库源代码,并告诉我们它实现了那些方法,然后在其中的一或多个方法中设置断点。


这些方法都是可行的,最后我们选择了最容易的方法,因为我们并不了解标签库代码。在JSP源代码中右击对标签库的调用,然后在弹出式菜单中选择"Taglib Breakpoints"。Workshop将弹出一个对话框,其中显示实现类tags.FactorialEvaluatorTag, 并显示源代码中所有方法。针对本例,列表中只有一个方法doEndTag()。选中它并设置断点。
如果是一个更复杂的标签库,Workshop将会遍历类层次并查找标签库接口指定方法的源代码。假定有一个标签库类A,它继承类B,B又继承类C。如果Workshop中含有类A和C的源代码,那么这两个类中所有的标签库方法都将显示在列表中,但不会显示B的任何方法。这样做是有原因的:如果没有类的源代码,对其设置断点并进行调试实际上没有多大用处。


现在在浏览器中重新载入JSP并点击断点。单步遍历标签库代码,我们发现只是一个简单的off-by-one错误。变量i 应该在使用之后减1而不是在使用之前。用i--替代--i ,重新构建taglib项目,然后再次载入JSP页面。

值得关注的还包含JSP和标签库的调用堆栈、以及观察窗口,在那儿我们正对表达式bodyContent.getString()进行求值。从中我们可到看到JSP当前设置的标签体内容,如本例所示,若标签体内容是动态生成的,这样做会非常方便。

通过JSP调试器的流视图,我们可以看见所有将会写回到客户端的内容。调试JSP时能够看到输出,并知道哪一行代码生成输出的哪个部分是十分有用的。而且,你还可以轻松判断缓冲溢出以及响应执行的时间,这意味着至少已经有一部分内容被写回到了客户端。这些有助于判断是否仍有可能重定向客户端到另外一个URL或修改响应的HTTP报头。
现在我们正位于标签库的断点处,请返回到JSP中。察看流中的内容,其中有1! = 1,它是正确的,但这一结果以前就是正确的。取消标签库中的断点并在factorial.jsp 的第7行设置断点,即包含for 循环的那一行。单击continue按钮,每次进行一次求值。现在可以看到流中含有2! = 2, 3! = 6,等等。这正是我们想要的输出,至此已经修复了所有bug。


最后,我们小巧的Web应用运行良好。通过它您应该对Workshop的JSP调试新功能有了一定了解,这些功能有助于跟踪JSP和标签库代码中的问题。我们不再需要向System.out 输出许多调试信息,而且现在可以访问以前所不能访问的一些数据,Workshop使得JSP和标签库的调试变得和标准Java应用的调试一样简单。
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 myfaq.com.cn All rights reserved. www.myfaq.com.cn 版权所有