从堆栈跟踪行号获取实际的JSP行号?

31

以下是堆栈跟踪:

...
org.apache.jsp.showcustomer_jsp._jspService(showcustomer_jsp.java:128)
org.apache.jasper.runtime.HttpJspBase.service(Unknown Source)

我的做法如下:

  1. 从堆栈跟踪中获取行号,在本例中是128。
  2. 找到showcustomer_jsp.java文件(但很难想到要查找/var/run/tomcat-6/Catalina/localhost/_/org/apache/jsp目录)。
  3. 打开文件并跳转到第128行。
  4. 现在,在 _jsp.java 文件中找到你在第128行发现的内容,然后搜索相应的 .jsp 文件。
  5. 完成!

请问是否有更简单的方法?


甚至不知道你可以这样做。+1 - iandisme
3个回答

5
我在Eclipse WTP FAQ中找到了这个页面,它解释了如何配置Eclipse,以便在堆栈跟踪上单击后可以转到生成的Java代码。

+1,但是这只会让您进入生成的Java代码,而不是原始的JSP。 - Juraj

2

我认为你无法这样做。 JSP文件被编译成servlet,而不是直接运行。由于异常是从该servlet抛出的,因此堆栈跟踪中的行是来自类的行。此时,JSP中原始行已丢失。

通常最好避免从jsp编写代码或抛出异常,并封装您的逻辑在servlet和JSP标签中,并使用JSTL进行控制流程(if,forEach等)。


2
WebLogic在WL10版本之前有一个非常好的功能:它会在生成的Java文件中写入一个注释,显示源JSP行号。即使您的逻辑封装在标签库中,看到哪个调用抛出异常也很好。 - kdgregory
看一下Jasper源代码似乎表明它将JSP文件处理为一个令牌流,而不知道行号。所以答案是否定的。 - kdgregory
该IDE具有计算原始行号所需的所有数据。也许有人可以编写一个IntelliJ插件来完成这项工作。 - Arne Evertsson
关于JSTL:我不喜欢将代码编写为XML。这违反了KISS原则。 - Arne Evertsson
你可以使用其他的模板引擎,比如velocity或者freemarker。 - David Rabinowitz
JSP的设计者们在想什么呢?跳转到行号的能力非常重要。我在处理JSP异常时花费的时间比实际编码还要多。此外,我不使用Eclipse,所以使用Eclipse的答案并不有用。 - Jus12

0

我曾经使用Lex和Yacc进行编程,它们可以生成C代码,并且您可以启用#line预处理指令进行调试。当在生成的C代码中发生问题时,IDE足够智能,会打开相应的lex或yacc文件,而不是生成的C代码。确实如此。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接