【问题标题】:Getting the actual jsp line number from a stack trace line number?从堆栈跟踪行号中获取实际的 jsp 行号?
【发布时间】:2010-11-21 05:52:45
【问题描述】:

这是堆栈跟踪:

...
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 文件中搜索您在 _jsp.java 文件的第 128 行找到的任何内容。
  5. 轰隆隆!大功告成!

请问有没有更简单的方法?

【问题讨论】:

  • 甚至不知道你能做到这一点。 +1

标签: java debugging jsp tomcat


【解决方案1】:

我曾经使用 Lex 和 Yacc 进行编程,它们会生成 C 代码,您可以启用 #line 预处理器指令进行调试。当生成的 c 代码中发生某些事情时,IDE 足够聪明,可以打开相应的 lex 或 yacc 文件,而不是生成的 c 代码。乖乖的

【讨论】:

    【解决方案2】:

    我在 Eclipse WTP FAQ 上找到了这个page,它解释了如何配置 Eclipse,以便您可以通过单击堆栈跟踪转到生成的 java 代码。

    【讨论】:

    • +1,但仍然 - 这只会带您生成 java 代码,而不是原始 JSP。
    【解决方案3】:

    我不认为你可以。 JSP 文件被编译成一个 servlet,而不是直接运行。由于此 servlet 引发了异常,因此堆栈跟踪中的行是类中的行。此时 JSP 中的原始行丢失了。

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

    【讨论】:

    • WebLogic 在 WL10 之前的版本中有一个非常好的特性:它会在生成的 Java 文件中写入一个注释,显示源 JSP 行号。即使您的逻辑封装在 taglib 中,也很高兴看到哪个调用抛出了。
    • 快速浏览一下 Jasper 源似乎表明它将 JSP 文件作为令牌流处理,而不知道行号。所以答案是否定的。
    • IDE 拥有计算原始行号的所有数据。也许有人可以编写一个 IntelliJ 插件来完成这项工作。
    • 关于 JSTL:我不喜欢将代码编写为 XML。它违反了 KISS 原则。
    • 您可以使用其他模板引擎,例如velocity或freemarker
    猜你喜欢
    • 1970-01-01
    • 2012-12-12
    • 2013-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-10
    • 2011-02-19
    • 1970-01-01
    相关资源
    最近更新 更多