서블릿 예외 처리
서블릿에서 예외가 발생하면 웹 컨테이너는 예외 유형 요소를 사용하여 web.xml에서 발생한 예외 유형과 일치하는 구성을 검색합니다.
특정 예외 또는 HTTP 상태 코드<에 대해 적절한 서블릿 호출을 지정하려면 web.xml의 error-page 요소를 사용해야 합니다. 🎜> .
web.xml 구성
에서는 정의된 예외나 오류가 발생할 때 호출되는 Servelt에 대한 ErrorHandler가 있다고 가정합니다. web.xml에 생성되는 항목은 다음과 같습니다.
<!-- servlet 定义 --> <servlet> <servlet-name>ErrorHandler</servlet-name> <servlet-class>ErrorHandler</servlet-class> </servlet> <!-- servlet 映射 --> <servlet-mapping> <servlet-name>ErrorHandler</servlet-name> <url-pattern>/ErrorHandler</url-pattern> </servlet-mapping> <!-- error-code 相关的错误页面 --> <error-page> <error-code>404</error-code> <location>/ErrorHandler</location> </error-page> <error-page> <error-code>403</error-code> <location>/ErrorHandler</location> </error-page> <!-- exception-type 相关的错误页面 --> <error-page> <exception-type> javax.servlet.ServletException </exception-type > <location>/ErrorHandler</location> </error-page> <error-page> <exception-type>java.io.IOException</exception-type > <location>/ErrorHandler</location> </error-page>
모든 예외에 대해 공통 오류 처리기를 갖고 싶다면 각 예외에 대해 별도의 오류 페이지 요소를 정의하는 대신 다음 오류 페이지를 정의해야 합니다.
<error-page> <exception-type>java.lang.Throwable</exception-type > <location>/ErrorHandler</location> </error-page>
위의 web.xml 예외 처리에 관해 주의할 점은 다음과 같습니다.
Servelt ErrorHandler는 다른 Servelt와 동일하게 정의되며 web.xml에 구성됩니다.
404(찾을 수 없음)이든 403(금지)이든 오류 상태 코드가 발생하면 ErrorHandler의 서블릿이 호출됩니다.
웹 애플리케이션에서 ServletException 또는 IOException이 발생하면 웹 컨테이너는 ErrorHandler의 Servlet을 호출합니다.
다양한 유형의 오류 또는 예외를 처리하기 위해 다양한 오류 핸들러를 정의할 수 있습니다. 위의 예는 매우 일반적인 것이므로 예를 통해 기본 개념을 이해할 수 있기를 바랍니다.
요청 속성 - 오류/예외
다음은 오류/예외의 성격을 분석하기 위해 오류 처리 서블릿에서 액세스할 수 있는 요청 속성 목록입니다. .
序号 | 属性 & 描述 |
---|---|
1 | javax.servlet.error.status_code 该属性给出状态码,状态码可被存储,并在存储为 java.lang.Integer 数据类型后可被分析。 |
2 | javax.servlet.error.exception_type 该属性给出异常类型的信息,异常类型可被存储,并在存储为 java.lang.Class 数据类型后可被分析。 |
3 | javax.servlet.error.message 该属性给出确切错误消息的信息,信息可被存储,并在存储为 java.lang.String 数据类型后可被分析。 |
4 | javax.servlet.error.request_uri 该属性给出有关 URL 调用 Servlet 的信息,信息可被存储,并在存储为 java.lang.String 数据类型后可被分析。 |
5 | javax.servlet.error.exception 该属性给出异常产生的信息,信息可被存储,并在存储为 java.lang.Throwable 数据类型后可被分析。 |
6 | javax.servlet.error.servlet_name 该属性给出 Servlet 的名称,名称可被存储,并在存储为 java.lang.String 数据类型后可被分析。 |
서블릿 오류 처리기 예제
다음은 정의한 오류나 예외를 처리하는 서블릿 인스턴스입니다.
이 예는 서블릿의 예외 처리에 대한 기본적인 이해를 제공하며 동일한 개념을 사용하여 더 복잡한 예외 처리 애플리케이션을 작성할 수 있습니다.
// 导入必需的 java 库 import java.io.*; import javax.servlet.*; import javax.servlet.http.*; import java.util.*; // 扩展 HttpServlet 类 public class ErrorHandler extends HttpServlet { // 处理 GET 方法请求的方法 public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 分析 Servlet 异常 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"; } // 设置响应内容类型 response.setContentType("text/html"); PrintWriter out = response.getWriter(); String title = "Error/Exception Information"; String docType = "<!doctype html public \"-//w3c//dtd html 4.0 " + "transitional//en\">\n"; out.println(docType + "<html>\n" + "<head><title>" + title + "</title></head>\n" + "<body bgcolor=\"#f0f0f0\">\n"); if (throwable == null && statusCode == null){ out.println("<h2>Error information is missing</h2>"); out.println("Please return to the <a href=\"" + response.encodeURL("http://localhost:8080/") + "\">Home Page</a>."); }else if (statusCode != null){ out.println("The status code : " + statusCode); }else{ out.println("<h2>Error information</h2>"); out.println("Servlet Name : " + servletName + "</br></br>"); out.println("Exception Type : " + throwable.getClass( ).getName( ) + "</br></br>"); out.println("The request URI: " + requestUri + "<br><br>"); out.println("The exception message: " + throwable.getMessage( )); } out.println("</body>"); out.println("</html>"); } // 处理 POST 方法请求的方法 public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
일반적인 방법으로 컴파일ErrorHandler .java, 클래스 파일을 <Tomcat-installation-directory>/webapps/ROOT/WEB-INF/classes에 넣습니다.
웹에 다음 구성을 추가해 보겠습니다. 컨테이너는
ErrorHandler의 서블릿을 호출하고 해당 메시지를 표시합니다. 예를 들어 잘못된 URL을 입력하면 다음과 같은 결과가 표시됩니다. <servlet>
<servlet-name>ErrorHandler</servlet-name>
<servlet-class>ErrorHandler</servlet-class>
</servlet>
<!-- servlet mappings -->
<servlet-mapping>
<servlet-name>ErrorHandler</servlet-name>
<url-pattern>/ErrorHandler</url-pattern>
</servlet-mapping>
<error-page>
<error-code>404</error-code>
<location>/ErrorHandler</location>
</error-page>
<error-page>
<exception-type>java.lang.Throwable</exception-type >
<location>/ErrorHandler</location>
</error-page>
일부 웹 브라우저에서는 위 코드가 제대로 작동하지 않을 수 있습니다. 따라서 Mozilla 및 Safari 브라우저를 사용해 보십시오. 두 브라우저 모두에서 제대로 작동할 것입니다.