Servlet&JSP的那些事兒(九)

來源:互聯網
上載者:User

我們難保自己寫的程式不會出錯,所以需要一些錯誤處理機制來幫我們更好的解決異常,處理錯誤。在瀏覽網頁的時候,如果訪問的頁面不存在,那麼會收到一個HTTP 404錯誤資訊。這個問題的發生,可能是因為使用者輸入了錯誤的URL,但更多的情況是伺服器端的連結出現了錯誤,頁面移動了位置或者刪除了,卻忘記修改原來的連結。另外一種情況就是,我們開發的web應用程式本身有bug,在運行時出現了異常。

所以,這就要求我們在開發web應用時,對於可能出現的錯誤或異常,提前做好處理,即使錯誤不可避免,也應該提供一些友好的資訊。在servlet中,有兩種伺服器處理機制:聲明式異常處理(declarative exception handling)和程式式異常處理(programmatic exception handling)。

聲明式異常處理

這種異常處理方式是在web.xml檔案中聲明對各種異常的處理方法。其格式如下:

<?xml version='1.0' encoding='utf-8'?><web-app xmlns="http://java.sun.com/xml/ns/javaee"  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xsi:schemaLocation="http://java.sun.com/xml/ns/javaee                      http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"  version="3.0"  metadata-complete="true"><error-page><error-code>404</error-code><location>/FileNotFound.html</location></error-page></web-app>

可以看出來,<error-code>指定HTTP的錯誤碼,<location>制定了錯誤出現時的頁面路徑。還有一種格式如下:

<?xml version='1.0' encoding='utf-8'?><web-app xmlns="http://java.sun.com/xml/ns/javaee"  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xsi:schemaLocation="http://java.sun.com/xml/ns/javaee                      http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"  version="3.0"  metadata-complete="true"><error-page><error-type>java.io.FileNotFoundException</error-type><location>/ExceptionHandle</location></error-page></web-app>

其中<error-type>指定了java異常類的完整限定名,而<location>指定了處理異常的處理類(Servlet類)。在上面的那中格式中,<location>也可以這樣指定。

HTTP常見的錯誤碼詳見HTTP解析,文章有對HTTP的詳細說明。

一個異常處理類的詳細代碼如下所示:

package com.shan.web;import java.io.*;import javax.servlet.*;import javax.servlet.http.*;public class HttpErrorHandleServlet extends HttpServlet{public void service(HttpServletRequest request, HttpServletResponse response) throws IOException,ServletException {request.setCharacterEncoding("UTF-8");response.setContentType("text/html; charset=UTF-8");Integer status_code = (Integer)request.getAttribute("javax.servlet.error.status_code");out.println("<html><head><title>");out.println("錯誤頁面");out.println("</title></head>");out.println("<body>");switch(status_code) {case 401: break;case 404:out.println("HTTP狀態代碼:"+status_code);out.println("您訪問的頁面不存在,或者已被移動到其他位置。");break;default:break;}out.println("</body></html>");out.close();}}

為了協助進行錯誤處理的servlet分析問題,以及產生詳細的響應,servlet容器在將請求轉寄給錯誤頁面之前,會在請求中設定某些有用的屬性,如表1所示:

屬性的名字 屬性的類型 屬性說明
javax.servlet.error.status_code java.lang.Integer HTTP協議的狀態碼
javax.servlet.error.exception_type java.lang.Class 未捕獲異常的Class類的對象
javax.servlet.error.message java.lang.String 傳遞給sendError()方法的訊息,或者是在未捕獲異常中的訊息
javax.servlet.error.exception java.lang.Throwable 調用錯誤頁面的未捕獲異常
javax.servlet.error.request_uri java.lang.String 當前請求的URI
javax.servlet.error.servlet_name java.lang.String 導致錯誤頁面被調用的servlet的名字
表1 servlet容器在請求對象中設定的屬性

針對上面錯誤處理類的完整web.xml配置如下所示:

<?xml version='1.0' encoding='utf-8'?><web-app xmlns="http://java.sun.com/xml/ns/javaee"  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xsi:schemaLocation="http://java.sun.com/xml/ns/javaee                      http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"  version="3.0"  metadata-complete="true"><servlet><servlet-name>HttpErrorHandleServlet</servlet-name><servlet-class>com.shan.web.HttpErrorHandleServlet</servlet-class></servlet><servlet-mapping><servlet-name>HttpErrorHandleServlet</servlet-name><url-pattern>/ExceptionHandle</url-pattern></servlet-mapping><error-page><error-code>401</error-code><location>/ExceptionHandle</location></error-page><error-page><error-code>404</error-code><location>/ExceptionHandle</location></error-page></web-app>

程式式異常處理

這種異常處理方式利用try-catch來捕獲異常,並對捕獲的異常進行相應的處理。可在catch塊中利用如下語句將異常資訊輸出到log日誌中。

getServletContext().log("ServletContext.log():異常資訊"+ex.toString());log("GenericServlet.log():異常資訊"+ex.toString());

這兩句話都可以將異常資訊記錄到log日誌中,他們的區別在於:如果調用GenericServlet類的log()方法,它會在日誌訊息前面加上servlet的名字,而調用ServletContext的log()方法,則只記錄訊息本身。

也可以使用response的sendError()方法將錯誤訊息發送到錯誤頁面。

利用RequestDispatcher來處理異常

之前介紹過頁面轉寄機制,所以也可以將異常封裝到一個請求中,然後利用ServletContext.log()轉寄一個異常處理servlet進行統一的處理。

轉載請註明出處:http://blog.csdn.net/iAm333

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.