2014-03-31 70 views
2

我有一個小的Java Web應用程序。它使用MVC,一個HttpServlet作爲控制器和幾個JSP用於查看。JSP異常隱含對象

Servlet捕獲像SQLExceptions這樣的幾個異常,我需要在「ErrorPage」JSP中處理這些異常。 (JSP與指令<%@page isErrorPage="true" %>。) 問題是,我怎樣才能從Servlet中設置「異常」JSP隱式對象?

(我用一個RequestDispatcher對象來控制傳遞給錯誤頁。)

+0

見下面我對如何配置和使用錯誤頁面,並利用JSP隱異常的反應。 – spiderman

回答

2

這是用法,

的Page1.jsp

<%@page errorPage="errorpage.jsp" %> 
<% 
    //this has your code that throws some exception 

%> 

拋出的異常的JSP頁面將根據你的errorPage配置被捕獲。

的errorPage.jsp

<%@ page isErrorPage='true' %> 
<% 
out.print("Error Message : "); 
out.print(exception.getMessage()); 
%> 

異常對象代表所有的錯誤和異常。異常隱式對象的類型爲java.langThrowable。您可以使用page指令的isErrorPage屬性訪問聲明爲錯誤頁面的頁面上的異常對象。

僅當JSP使用頁面指令將isErrorPage設置爲true時,纔會創建異常對象。當JSP生成一個錯誤,該錯誤轉發到錯誤頁面,容器設置錯誤頁面的JSP異常對象所產生的誤差

除了exception.getMessage(),您還可以在exception對象調用printStackTrace()toString()

這是你在問什麼?或者你想在你的Servlet類中處理異常?

而且,如果你配置你的web.xml這個樣子,

<error-page> 
    <exception-type>java.lang.Throwable</exception-type> 
    <location>/errorpage.jsp</location> 
</error-page> 

,那麼對於所有的異常此錯誤頁面中調用,您可以使用exception對象如上所述並調用其方法爲異常細節。 如果要針對特定​​異常配置特定錯誤頁面,請相應地更改<exception-type>

請注意,異常是由容器在遇到異常時設置的。如果您只是將控件轉發到錯誤頁面,它只會顯示該頁面。

更新:

try { 
//sample code 
    data= dao.find(something); 
} 
catch (SQLException e) { 
    throw new ServletException("The query got failed", e); 
} 

的Servlet容器處理的ServletException。當容器在執行servlet的時候抓住它,然後將它的原因解開並與web.xml中的任何特定條目進行比較,並且會顯示最接近的匹配項。

<error-page> 
    <exception-type>java.sql.SQLException</exception-type> 
    <location>/errorpage.jsp</location> 
</error-page> 

更新2

再舉一個例子:

的web.xml

<servlet> 
    <servlet-name>servlet1</servlet-name> 
    <servlet-class>com.examples.example.Servlet1</servlet-class> 
    <load-on-startup>1</load-on-startup> 
</servlet> 
<servlet-mapping> 
    <servlet-name>servlet1</servlet-name> 
    <url-pattern>*.do</url-pattern> 
</servlet-mapping> 
<error-page> 
    <exception-type>javax.servlet.ServletException</exception-type> 
    <location>/errorpage.jsp</location> 
</error-page> 
<error-page> 
    <exception-type>java.sql.SQLException</exception-type> 
    <location>/errorpage.jsp</location> 
</error-page> 
<error-page> 
    <exception-type>java.lang.Throwable</exception-type> 
    <location>/errorpage.jsp</location> 
</error-page> 

Servlet1.java

protected void doPost(HttpServletRequest request, HttpServletResponse response) 
      throws ServletException, IOException { 
     try { 
      String s = null; 
      if (s.equals("")) { 

      } 
     } catch (Exception ex) { 
      throw new ServletException("my custom exception message"); 
     } 
    } 

的errorPage.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1" 
    pageEncoding="ISO-8859-1" isErrorPage='true'%> 
<html> 
<head> 
<title>Error Page</title> 
</head> 
<body> 
    <% 
     out.print("Error Message : "); 
     out.print(exception.getMessage()); 
    %> 
</body> 
</html> 
+0

謝謝你的迴應。 – aecordoba

+0

謝謝你的迴應。我知道那個操作。但在我的情況下,這個異常是在Servlet中捕獲的,我想在JSP錯誤頁面中進行管理。 – aecordoba

+0

我想知道爲什麼你想要這樣做。如果你能夠捕捉到servlet中的異常,那麼爲什麼你想在jsp中再次處理它呢?不推薦,但可以將異常對象設置爲請求屬性並轉發到錯誤頁面。您可以在jsp中獲取作爲異常對象的屬性。但是這與錯誤頁面缺省配置沒有任何關係 – spiderman