2009-08-20 101 views
31

這裏是堆棧跟蹤:從堆棧跟蹤行號獲取實際的jsp行號?

... 
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. 熱潮!你完成了!

請問,有沒有更簡單的方法來做到這一點?

+0

甚至不知道你可以做到這一點。 +1 – iandisme 2011-07-28 17:58:51

回答

2

我不認爲你可以。 JSP文件被編譯成一個servlet,而不是直接運行。由於此servlet引發異常,因此您在堆棧跟蹤中的行是來自該類的行。此時JSP中的原始行已經丟失。

通常最好避免編寫代碼或從JSP拋出異常,並封裝在servlet和JSP標記你的邏輯,並使用JSTL的控制流(如,的forEach等)

+2

WebLogic在WL10之前的版本中有一個很好的功能:它會在生成的Java文件中寫入註釋,顯示源JSP行號。即使您的邏輯被封裝在taglib中,也很高興看到哪個調用被拋出。 – kdgregory 2009-08-20 11:18:10

+0

快速查看Jasper源代碼似乎表明它將JSP文件作爲標記流進行處理,而無需瞭解行號。所以答案是否定的。 – kdgregory 2009-08-20 11:41:15

+0

IDE具有計算原始行號的所有數據。也許有人可以寫一個IntelliJ插件來完成這項工作。 – 2009-08-21 08:09:37

4

我發現Eclipse WTP FAQ上的這個page,它解釋瞭如何配置Eclipse,以便您可以單擊堆棧跟蹤來轉到生成的java代碼。

+0

+1,但仍然 - 這會使您僅生成Java代碼,而不是原始JSP。 – Juraj 2011-11-14 10:58:33

0

我曾經在Lex和Yacc中編寫過可以生成C代碼的代碼,並且可以啓用#line預處理器指令進行調試。當生成的c代碼發生某些事情時,IDE足夠聰明地打開相應的lex或yacc文件,而不是生成的c代碼。 Surly