Servlet异常处理:
当一个Servlet抛出异常时,web容器在使用了exception-type元素的web.xml中搜索与异抛出常匹类型匹配的配置。必须在web.xml中使用error-page元素来指定对特定异常或HTTP状态码做出相应的Servlet调用。
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>/ErrorHandle</location>
</error-page>
关于web.xml异常处理注意点:
1.Servlet ErrorHandle与其他的Servlet的定义方式一样,且在web.xml中配置
2.如果有错误状态代码出现,不管为 404(Not Found 未找到)或 403(Forbidden 禁止),则会调用ErrorHandle Servlet
3.如果web应用程序抛出ServletException/IOException,则会调用ErrorHandle Servlet
请求属性-错误/异常:
以下是错误处理的Servlet可以访问的请求属性列表,用来分析错误/异常的性质
1.javax.servlet.error.status_code
该属性给出状态码,状态码可被存储,并在存储为 java.lang.Integer 数据类型后可被分析
2.javax.servlet.error.exception_type
该属性给出异常类型的信息,异常类型可被存储,并在存储为 java.lang.Class 数据类型后可被分析。
3.javax.servlet.error.exception
该属性给出异常产生的信息,信息可被存储,并在存储为 java.lang.Throwable 数据类型后可被分析。
4.avax.servlet.error.message
该属性给出确切错误消息的信息,信息可被存储,并在存储为 java.lang.String 数据类型后可被分析。
5.javax.servlet.error.request_uri
该属性给出有关 URL 调用 Servlet 的信息,信息可被存储,并在存储为 java.lang.String 数据类型后可被分析。
6.javax.servlet.error.servlet_name
该属性给出 Servlet 的名称,名称可被存储,并在存储为 java.lang.String 数据类型后可被分析。
Servlet错误处理程序实例:
package MyServlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.io.IOException;
/**
* Created by 1192126986 on 2017/1/18.
*/
@WebServlet(name = "ErrorHandle")
//拓展HttpServlet类
public class ErrorHandle extends HttpServlet {
//POST请求处理方法
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request,response);
}
//GET请求处理方法
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//请求属性表-错误/异常
//属性javax.servlet.error.exception:给出异常产生的信息,被存储在java.lang.Throwable数据类型可分析
Throwable throwable=(Throwable) request.getAttribute("javax.servlet.error.exception");
//属性javax.servlet.error.status_code:给出状态码,存储在java.lang.Integer数据类型后可分析
Integer status=(Integer) request.getAttribute("javax.servlet.error.status_code");
//属性javax.servlet.error.servlet_name:给出Servlet的名称,存储在java.lang.String数据类型后可分析
String servletName=(String)request.getAttribute("javax.servlet.error.servlet_name");
if(servletName==null){
servletName="Unknowed";
}
//属性javax.servlet.error.request_uri:给出有关URL调用Servlet的信息
String uri=(String)request.getAttribute("javax.servlet.error.request_uri");
if(uri==null){
uri="Unknowwed";
}
response.setContentType("text/html;charset=UTF-8");
PrintWriter out=response.getWriter();
String title = "菜鸟教程 Error/Exception 信息";
String docType = "<!DOCTYPE html>\n";
out.println(docType +
"<html>\n" +
"<head><title>" + title + "</title></head>\n" +
"<body bgcolor=\"#f0f0f0\">\n");
out.println("<h1>异常信息实例演示</h1>");
//标签<a>定义超链接,用于从一张页面链接到另一张页面 最重要的属性:href 值:url 描述:规定链接指向的页面的url
if(status==null && throwable==null){
out.println("<h2>错误信息丢失</h2>");
out.println("请返回 <a href=\"" +
response.encodeURL("http://localhost:8080/") +
"\">主页</a>。");
}else if(status!=null){
out.println("错误代码:"+status);
}else{
out.println("<h2>错误信息</h2>");
out.println("Servlet name"+servletName);
out.println("异常类型:"+throwable.getClass().getName());
out.println("异常信息:"+throwable.getMessage());
out.println("请求URI"+uri);
}
out.println("</body>");
out.println("</html>");
}
}
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<!-- servlet定义 -->
<servlet>
<servlet-name>ErrorHandle</servlet-name>
<servlet-class>MyServlet.ErrorHandle</servlet-class>
</servlet>
<!-- servlet映射 -->
<servlet-mapping>
<servlet-name>ErrorHandle</servlet-name>
<url-pattern>/ErrorHandle</url-pattern>
</servlet-mapping>
<!-- error-code 状态代码相关的错误页面 -->
<error-page>
<error-code>404</error-code>
<location>/ErrorHandle</location>
</error-page>
<!-- exception type 异常类型相关的错误页面-->
<!-- 对所有的异常类型进行错误处理 -->
<error-page>
<exception-type>java.lang.Throwable</exception-type>
<location>/ErrorHandle</location>
</error-page>
</web-app>