Servlet异常处理
当Web应用程序抛出异常时,Web服务器会在web.xml中的元素中搜索与这个异常类型相匹配的配置,在元素中搜索与HTTP状态码匹配的配置。需要在web.xml中的中指定相应的Servlet来处理这些异常或HTTP状态码。用来处理这些异常的Servlet和其他Servlet定义方式一样,在web.xml中配置。
<!-- 定义servlet -->
<servlet>
<servlet-name>ExceptionHanderServlet</servlet-name>
<servlet-class>ExceptionHandlerServlet</servlet-class>
</servlet>
<!-- servlet 映射 -->
<servlet-mapping>
<servlet-name>ExceptionHandlerServlet</servlet-name>
<url-pattern>/ExceptionHandlerSErvlet</url-pattern>
</servlet-mapping>
<!-- 指定ExceptionHandlerServlet来处理404状态码 -->
<error-page>
<error-code>404</error-code>
<location>/ExceptionHandlerServlet</location>
</error-page>
<!-- 指定ExceptionHandlerServlet来处理ServletException -->
<error-page>
<exception-type>
javax.servle.ServletException
</exception-type>
<location>/ExceptionHandlerServlet</location>
</error-page>
<!-- 指定ExceptionHandlerServlet来处理IOException -->
<error-page>
<exception-type>java.io.IOException</exception-type>
<location>/ExceptionHandlerServlet</location>
</error-page>
<!-- 对所有异常统一处理 -->
<error-page>
<exception-type>java.lang.Throwable</exception-type>
<location>/ExceptionHandlerServlet</location>
</error-page>
Servlet处理异常时可以获取的属性集合:
通过属性值来分析错误和异常的性质。
属性 | 描述 |
---|---|
javax.servlet.error.status_code | 该属性给出状态码,状态码可被存储,并在存储为 java.lang.Integer 数据类型后可被分析。 |
javax.servlet.error.exception_type | 该属性给出异常类型的信息,异常类型可被存储,并在存储为 java.lang.Class 数据类型后可被分析。 |
javax.servlet.error.message | 该属性给出确切错误消息的信息,信息可被存储,并在存储为 java.lang.String 数据类型后可被分析。 |
javax.servlet.error.request_uri | 该属性给出有关 URL 调用 Servlet 的信息,信息可被存储,并在存储为 java.lang.String 数据类型后可被分析。 |
javax.servlet.error.exception | 该属性给出异常产生的信息,信息可被存储,并在存储为 java.lang.Throwable 数据类型后可被分析。 |
javax.servlet.error.servlet_name | 该属性给出 Servlet 的名称,名称可被存储,并在存储为 java.lang.String 数据类型后可被分析。 |
实例
@WebServlet("/ErrorHandlerServlet")
public class ErrorHandlerServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
private String EXCEPTION = "javax.servlet.error.exception";
private String STATUS_CODE = "javax.servlet.error.status_code";
private String SERVLET_NAME = "javax.servlet.error.servlet_name";
private String REQUEST_URI = "javax.servlet.error.request_uri";
public ErrorHandlerServlet() {
super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
Throwable exception = (Throwable) request.getAttribute(EXCEPTION);
Integer statusCode = (Integer) request.getAttribute(STATUS_CODE);
String servletName = (String) request.getAttribute(SERVLET_NAME);
if (servletName == null) {
servletName = "Unknown";
}
String requestUri = (String) request.getAttribute(REQUEST_URI);
if (requestUri == null) {
requestUri = "Unknown";
}
// 设置响应内容类型
response.setContentType("text/html;charset=UTF-8");
PrintWriter writer = response.getWriter();
String title = "Exception Handler";
String outStr = "<!DOCTYPE html>\n" + "<html>\n" + "<head><title>" + title + "</title></head>\n"
+ "<body bgcolor=\"#f0f0f0\">\n" + "<h1>处理异常demo"
+ ((exception == null && statusCode == null) ? ("<h2>错误信息丢失</h2>")
: ((statusCode != null) ? "错误代码-- : " + statusCode
: ("<h2>错误信息</h2>\n" + "Servlet Name : " + servletName + "<br><br>" + "Request Uri : "
+ requestUri + "<br><br>" + "异常信息 : " + exception.getMessage() + "<br><br>"))
+ "</body>" + "</html>");
writer.println(outStr);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
启动服务器,执行servlet,然后输入错误的地址,即可看到对404错误的处理。