前言:很多網站為了給用戶很好的用戶體驗性,都會提供比較友好的異常界面,現在我們在來回顧一下Servlet中如何進行異常處理的。
什麼是聲明式:就是在web.xml中聲明對各種異常的處理方法。
是通過<error-page>元素來聲明的,<error-page>下面有幾個子元素如下圖
error-code:http錯誤代碼
exception-type:java異常類的完整名
location:響應http錯誤代碼或者java異常的資源路徑
下面通過例子一一講解:
1:首先我們做個最簡單的先在程序中加一個FileNotFound.html文件,文件內容如下
1 <html> 2 <head> 3 <meta charset="UTF-8"> 4 <title>頁面沒有發現</title> 5 </head> 6 <body> 7 你訪問的頁面並不存在,或者被移到其他位置。<p> 8 如有其他問題請聯系<a href="#">管理員</a> 9 </body> 10 </html> View Code然後我們在web.xml中加入下面代碼
<error-page> <error-code>404</error-code> <location>/FileNotFound.html</location> </error-page>
如果開啟tomcat 在浏覽器輸入http://localhost:8080/servlet-test/index1.jsp
然後會出現下面
2:然後我們發現如果我聲明越來越多的異常時候會出現越來越多的html這樣的靜態代碼,那麼可以能否在後台操作呢,答案是肯定的,現在我們用一個Servlet類來進行響應
首先來看一副關於servlet相關屬性的圖
現在我以其中status_code作為例子先建立一個ErrorHandlerServlet如下
1 public class ErrorHandlerServlet extends HttpServlet{ 2 3 private static final long serialVersionUID = 1L; 4 protected void service(HttpServletRequest request,HttpServletResponse response) throws IOException 5 { 6 7 response.setContentType("text/html;charset=gb2312"); 8 PrintWriter out=response.getWriter(); 9 Integer status_code=(Integer)request.getAttribute("javax.servlet.error.status_code"); 10 out.println("<html><head><title>錯誤列表</title></head>"); 11 out.println("<body>"); 12 13 switch(status_code) 14 { 15 case 401: 16 out.println("<h2>http錯誤碼:"+status_code+"</h2>"); 17 out.println("你並沒有被授權"); 18 out.println("如有其他問題請聯系<a href='#'>管理員</a>"); 19 break; 20 case 404: 21 out.println("<h2>http錯誤碼:"+status_code+"</h2>"); 22 out.println("你訪問的頁面並不存在,或者被移到其他位置"); 23 out.println("如有其他問題請聯系<a href='#'>管理員</a>"); 24 break; 25 } 26 27 out.println("</body></html>"); 28 out.close(); 29 } ErrorHandlerServlet然後在配置web.xml
1 <servlet> 2 <servlet-name>ErrorHandlerServlet</servlet-name> 3 <servlet-class>com.lp.servlet.ErrorHandlerServlet</servlet-class> 4 </servlet> 5 <servlet-mapping> 6 <servlet-name>ErrorHandlerServlet</servlet-name> 7 <url-pattern>/errorHandler</url-pattern> 8 </servlet-mapping> 9 <error-page> 10 <error-code>404</error-code> 11 <location>/errorHandler</location> 12 </error-page> web.xml現在我們再次開啟tomcat 在浏覽器輸入http://localhost:8080/servlet-test/index1.jsp
可以看到如下圖
3:我們發現發現關於exception-type都沒有用上那麼關於怎麼用exception-type呢下面來用實例講解
我們在寫一個關於文件操作的Servlet類FileExceptionServlet
1 public class FileExceptionServlet extends HttpServlet{ 2 /** 3 * 4 */ 5 private static final long serialVersionUID = 1L; 6 public void doGet(HttpServletRequest request,HttpServletResponse response) throws FileNotFoundException 7 { 8 File file=new File("1.txt"); 9 FileInputStream fileInputStream=new F 10 } 11 } FileExceptionServlet在這裡我們並沒有1.txt文件,注意聲明的FileNotFoundException異常在配置中會用的到
同樣我們在寫一個關於處理Servlet異常的ExceptionHandlerServlet類
1 public class ExceptionHandlerServlet extends HttpServlet{ 2 3 /** 4 * 5 */ 6 private static final long serialVersionUID = 1L; 7 protected void service(HttpServletRequest request,HttpServletResponse response) throws IOException 8 { 9 response.setContentType("text/html;charset=gb2312"); 10 PrintWriter out=response.getWriter(); 11 out.println("<html><head><title>錯誤列表</title></head>"); 12 out.println("<body>"); 13 out.println("應用程序出錯"); 14 out.println("錯誤原因可能是某個服務器端文件被刪除"); 15 out.println("請聯系<a href='#'>管理員</a>"); 16 out.println("</body></html>"); 17 out.close(); 18 } ExceptionHandlerServlet然後再次配置web.xml
1 <servlet> 2 <servlet-name>ExceptionHandlerServlet</servlet-name> 3 <servlet-class>com.lp.servlet.ExceptionHandlerServlet</servlet-class> 4 </servlet> 5 <servlet-mapping> 6 <servlet-name>ExceptionHandlerServlet</servlet-name> 7 <url-pattern>/exceptionHandler</url-pattern> 8 </servlet-mapping> 9 <error-page> 10 <exception-type>java.io.FileNotFoundException</exception-type> 11 <location>/exceptionHandler</location> 12 </error-page> web.xml然後啟動tomcat輸入http://localhost:8080/servlet-test/exceptionHandler看到
這個在實際開發中運用的比較多主要采取try catch捕獲異常 然後進行處理。舉一個小例子比喻我們上面說的文件操作,如果發現文件不存在的時候我們可以把這個錯誤記錄在日志便於查閱,ok我看一下
1 public void doGet(HttpServletRequest request,HttpServletResponse response) throws IOException 2 { 3 try { 4 File file=new File("1.txt"); 5 @SuppressWarnings("unused") 6 FileInputStream fileInputStream=new FileInputStream(file); 7 } catch (FileNotFoundException e) { 8 getServletContext().log(e.getMessage()); 9 response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR,"文件未能發現"); 10 } 11 } View Code從中我們可以看出采用了sendError這個方法,目的就是可以把一些錯誤信息很好的展現出來,日志這裡就是簡單提下,在實際中可能根據不同業務選擇的不一樣。
然後再次配置wen.xml
<servlet> <servlet-name>FileExceptionServlet</servlet-name> <servlet-class>com.lp.servlet.FileExceptionServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>FileExceptionServlet</servlet-name> <url-pattern>/fileexception</url-pattern> </servlet-mapping>
再次運行http://localhost:8080/servlet-test/fileexception
好了,關於Servlet異常就說這麼多了,隨著技術不停的更新,處理異常的方式也越來越多但是這些基礎的還是應該了解和學習下的