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

Java 从堆栈跟踪行号获取实际的jsp行号?,java,debugging,jsp,tomcat,Java,Debugging,Jsp,Tomcat,以下是stacktrace: ... org.apache.jsp.showcustomer_jsp._jspService(showcustomer_jsp.java:128) org.apache.jasper.runtime.HttpJspBase.service(Unknown Source) 我就是这么做的: 从stacktrace中获取行号,在本例中为128 查找showcustomer\u jsp.java文件(在/var/run/tomcat-6/Catalina/localh

以下是stacktrace:

...
org.apache.jsp.showcustomer_jsp._jspService(showcustomer_jsp.java:128)
org.apache.jasper.runtime.HttpJspBase.service(Unknown Source)
我就是这么做的:

  • 从stacktrace中获取行号,在本例中为128
  • 查找
    showcustomer\u jsp.java
    文件(在
    /var/run/tomcat-6/Catalina/localhost/\uu/org/apache/jsp
    中查找并不明显)
  • 打开它并转到第128行
  • 现在,在
    .jsp
    文件中搜索在
    \u jsp.java
    文件第128行中找到的内容
  • 轰!你完了
    请问,有没有更简单的方法呢?

    我想你做不到。JSP文件被编译成servlet,而不是直接运行。当从这个servlet抛出异常时,堆栈跟踪中的行就是类中的行。此时JSP中的原始行丢失


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

    我在Eclipse WTP FAQ上找到了这一点,该FAQ解释了如何配置Eclipse,以便您可以点击stacktrace转到生成的java代码。

    我曾经在Lex和Yacc中编程,这将生成C代码,您可以启用#line预处理器指令进行调试。当生成的c代码中出现问题时,IDE足够聪明,可以打开相应的lex或yacc文件,而不是生成的c代码。Surly

    WebLogic在WL10之前的版本中有一个非常好的特性:它将在生成的Java文件中写入注释,显示源JSP行号。即使您的逻辑被封装在taglib中,也可以很好地看到抛出了哪个调用。快速查看Jasper源代码似乎表明它将JSP文件作为令牌流进行处理,而不知道行号。所以答案是否定的。IDE拥有计算原始行号的所有数据。也许有人可以编写一个IntelliJ插件来完成这项工作。它打破了KISS原则。你可以使用其他模板引擎,比如velocity或freemarkerDidn,你甚至不知道你可以这么做+1+1,但仍然-这将使您只看到生成的java代码,而不是原始JSP。