在 javax.servlet.HttpServlet中html
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
拋出了 ServletException 和 IOException。java
讓咱們寫一個簡單的Servlet MyExceptionServlet 看下當咱們在web中拋出如上的異常會出現什麼狀況:web
package com.journaldev.servlet.exception; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @WebServlet("/MyExceptionServlet") public class MyExceptionServlet extends HttpServlet { private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { throw new ServletException("GET method is not supported."); } }
咱們在瀏覽器中發出請求 _ localhost:8080/ServletExceptionHandling/MyExceptionServlet_,獲得以下響應:api
由於瀏覽器只能解析 HTML 文本,因此在web應用中拋出異常後,Servlet容器會將拋出的異常解析爲 HTML文本對瀏覽器進行響應。不一樣的解析會在不一樣的web容器中有所不一樣。以上響應是tomcat響應的結果,若是使用其它容器 JBOSS 或者 Glassfish 獲得的響應會有所不一樣。瀏覽器
以上響應將服務器商的詳細的錯誤信息展現給用戶沒有任何實際意義,不利於用戶操做體驗和網站安全。tomcat
Servlet api容許們對 web異常進行自定義處理,對用戶給出有效的響應。能夠在web應用中給出多個異常處理類,爲了簡單起見,咱們只建立一個類對全部的異常和錯誤進行響應。安全
package com.journaldev.servlet.exception; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @WebServlet("/AppExceptionHandler") public class AppExceptionHandler extends HttpServlet { private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { processError(request, response); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { processError(request, response); } private void processError(HttpServletRequest request, HttpServletResponse response) throws IOException { // Analyze the servlet exception Throwable throwable = (Throwable) request .getAttribute("javax.servlet.error.exception"); Integer statusCode = (Integer) request .getAttribute("javax.servlet.error.status_code"); String servletName = (String) request .getAttribute("javax.servlet.error.servlet_name"); if (servletName == null) { servletName = "Unknown"; } String requestUri = (String) request .getAttribute("javax.servlet.error.request_uri"); if (requestUri == null) { requestUri = "Unknown"; } // Set response content type response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.write("<html><head><title>Exception/Error Details</title></head><body>"); if(statusCode != 500){ out.write("<h3>Error Details</h3>"); out.write("<strong>Status Code</strong>:"+statusCode+"<br>"); out.write("<strong>Requested URI</strong>:"+requestUri); }else{ out.write("<h3>Exception Details</h3>"); out.write("<ul><li>Servlet Name:"+servletName+"</li>"); out.write("<li>Exception Name:"+throwable.getClass().getName()+"</li>"); out.write("<li>Requested URI:"+requestUri+"</li>"); out.write("<li>Exception Message:"+throwable.getMessage()+"</li>"); out.write("</ul>"); } out.write("<br><br>"); out.write("<a href=\"index.html\">Home Page</a>"); out.write("</body></html>"); } }
在 web.xml 中增長以下配置:服務器
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0"> <display-name>ServletExceptionHandling</display-name> <welcome-file-list> <welcome-file>index.html</welcome-file> </welcome-file-list> <error-page> <error-code>404</error-code> <location>/AppExceptionHandler</location> </error-page> <error-page> <exception-type>javax.servlet.ServletException</exception-type> <location>/AppExceptionHandler</location> </error-page> </web-app>
經過如上配置,咱們此時再發出 404請求和 錯誤請求會獲得以下響應:app