2011-03-01 84 views
2

我的春天MVC Web應用程序有它一個可摺疊的堆棧跟蹤元素(顯然是一個開發/調試選項)一個錯誤頁面。這用於正常工作,並從控制器(或有時來自JSP引擎)顯示適當的堆棧跟蹤。JSP錯誤頁面產生一個JSP錯誤

Q:是否有可能有一個JSP是一個錯誤頁面,或者它應該是靜態的HTML?

Q:我在做什麼錯?

的一連串事件是由我的web.xml中定義的錯誤處理程序驅動的(我認爲):

<error-page> 
    <exception-type>java.lang.Throwable</exception-type> 
    <location>/view/errors/internalError.jsp</location> 
</error-page> 

沿途某處(切換到Maven構建系統,升級的碼頭,和春季2.5 - > 3.0),我注意到這個錯誤頁面停止了以前的工作方式。它renderes一個問題是相同的 - 異常堆棧軌跡顯示是從控制器拋出的異常,但是從錯誤頁面本身!

javax.servlet.ServletException: javax.servlet.jsp.JspTagException: 
500 /WEB-INF/jsp/admin/errors/internalError.jsp 
    at org.apache.jasper.runtime.PageContextImpl.doHandlePageException(PageContextImpl.java:862) 
    at org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:791) 
    at org.apache.jsp.WEB_002dINF.jsp.admin.defaultParent_jsp._jspService(defaultParent_jsp.java:225) 
    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:820) 

什麼似乎是這裏發生的,是下面的事件鏈:

  1. 春季控制器點擊未捕獲的異常:throw new RuntimeException("no bananas")
  2. 此異常由彈簧底座的MultiActionController(因爲沒有自定義抓錯誤處理程序是爲此頁面定義的)重新引發異常:僅在Spring的DispatcherServlet中才會被捕獲。
  3. 然後DispatcherServlet查看一些東西(可能是我的web.xml),以發現異常類型的錯誤頁面:
  4. Spring然後將此URL解析爲視圖(以及我的錯誤JSP)並嘗試呈現它。
  5. 現在,這裏出問題時默認父JSP(見下面),拋出一個異常JSP其被捕後,這一次,由碼頭的ServletHolder。這個異常現在被映射(通過web.xml)到錯誤的JSP頁面。
  6. 在這裏,您可能會認爲這會導致無限循環。但是,第二次的事情就會很好地發生,並且會導致JSP錯誤。

JSP引擎似乎在呈現默認父JSP時就死了 - 它似乎遇到了問題:org.apache.taglibs.standard.tag.common.core.ImportSupport。我看過一些網絡帖子,人們說它必須處理來自WEB-INF目錄的導入。

// disallow inappropriate response codes per JSTL spec 
if (irw.getStatus() < 200 || irw.getStatus() > 299) { 
    throw new JspTagException(irw.getStatus() + " " + stripSession(targetUrl)); 
} 

雖然它看起來像任何HTTP 500錯誤會打破它。但是,這不是什麼錯誤頁應該有什麼?

回答

2

問:是否有可能讓JSP成爲錯誤頁面,還是應該是靜態HTML?

這是完全正常的。它甚至可以是一個servlet或其他東西。只要它沒有錯誤當然。

問:我在做什麼錯?

您的錯誤頁面有錯誤。您顯然在錯誤頁面中使用<c:import>以包含來自/WEB-INF的片段。這是不允許的,因爲它不是公共資源(老實說,我不記得它會在古代JSTL版本中工作過)。而是使用<jsp:include>

+0

哇,它驚人的你能夠從我的帖子中得知它。這正是我正在做的。 – Justin 2011-03-02 00:43:28

+0

這完全解決了它,所有頁面的默認父項不必要地使用了。我仍然不明白爲什麼從錯誤頁面的錯誤顯示正確..因爲,它也使用默認的父母。 – Justin 2011-03-02 03:21:22

+0

不客氣。 – BalusC 2011-03-02 03:21:47