04. Servlet 异常处理&日志调试
来源:互联网 发布:java 抽象方法 static 编辑:程序博客网 时间:2024/06/07 15:20
Servlet 异常处理
- 对于 Servlet 的异常处理,整个流程同 Java SE 中的 异常处理一样,一样使用 throw 抛出异常,在代码中捕获异常后进行处理,但是在 Servlet 中可以使用 <error-page> 元素来对特定的异常或 HTTP 状态码调用相应的 Servlet 进行处理;
- Servlet 中的异常捕获机制是这样的:当一个 Servlet 抛出异常时,Web 容器在使用了 exception-type 的 web.xml 中搜索与抛出异常类型相匹配的配置;
在 web.xml 中进行配置
假如有一个命名为 error.ErrorHandler 的 Servlet 在 Web 应用抛出 404,403 状态码和 ServletException,IOException 时会被调用,其在 web.xml 中的配置如下:
1
<!--对ErrorHandler进行Servlet的配置和映射配置-->
2
<servlet>
3
<servlet-name>ErrorHandler</servlet-name>
4
<servlet-class>error.ErrorHandler</servlet-class>
5
</servlet>
6
<servlet-mapping>
7
<servlet-name>ErrorHandler</servlet-name>
8
<url-pattern>/ErrorHandler</url-pattern>
9
</servlet-mapping>
10
<!--进行错误状态码403,404的相关 error-page 配置-->
11
<error-page>
12
<error-code>404</error-code>
13
<location>/ErrorHandler</location>
14
</error-page>
15
<error-page>
16
<error-code>403</error-code>
17
<location>/ErrorHandler</location>
18
</error-page>
19
<!--进行ServletException,IOException异常相关的 error-page 配置-->
20
<error-page>
21
<exception-type>javax.servlet.ServletException</exception-type>
22
<location>/ErrorHandler</location>
23
</error-page>
24
<error-page>
25
<exception-type>java.io.IOException</exception-type>
26
<location>/ErrorHandler</location>
27
</error-page>
当然如果要对所有的异常类型配置一个通用的错误处理 Servlet,那么只要对 java.lang。Throwable配置error-page即可,如下:
1
<error-page>
2
<exception-type>java.lang.Throwable</exception-type>
3
<location>/ErrorHandler</location>
4
</error-page>
Servlet 异常请求属性
Servlet 中提供了一系列的可访问请求属性列表,用于分析错误异常的性质,在 Sevlet抛出异常时,相应的异常类型或状态码信息会被添加到这些请求属性列表中;
这些属性可以通过 request.getAttribute(String errorName) 获取,具体使用见下面实例;
Servlet 异常处理程序示例
以下简要地实现 error.ErrorHandler 类,相关的 web.xml 见上面;
1
package error
2
3
public class ErrorHandler extends GenericServlet {
4
public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException{
5
//获取异常信息
6
Throwable throwable = (Throwable)request.getAttribute("javax.servlet.error.exception");
7
Integer statusCode = (Integer)request.getAttribute("javax.servlet.error.status_code");
8
String servletName = (String)request.getAttribute("javax.servlet.error.servlet_name");
9
if (servletName == null)
10
servletName = "Unknown";
11
String requestUri = (String)request.getAttribute("javax.servlet.error.request_uri");
12
if (requestUri == null)
13
requestUri = "Unknown";
14
15
// 设置响应内容类型,也可以直接转发到JSP页面进行显示,或者直接发送到日志
16
response.setContentType("text/html;charset=UTF-8");
17
PrintWriter out = response.getWriter();
18
out.println("<!DOCTYPE html>\n" +
19
"<html>\n" +
20
"<head><title>Error</title></head>\n" +
21
"<body>\n"+
22
"<h1>Error</h1>\n");
23
if (throwable == null && statusCode == null){
24
out.println("<h2>Error message missing </h2>");
25
}else if (statusCode != null) {
26
out.println("Error code : " + statusCode);
27
}else{
28
out.println("<h2>Error Message</h2>");
29
out.println("Servlet Name : " + servletName + "</br></br>");
30
out.println("Error Type : " + throwable.getClass( ).getName( ) + "</br></br>");
31
out.println("Request URI: " + requestUri + "<br><br>");
32
out.println("Error message: " + throwable.getMessage( ));
33
}
34
out.println("</body></html>");
35
}
36
}
Servlet 消息日志
- 在进行 Servlet 的调试时,比较常用的有2种方法;
- 一种同 Java SE 一样直接使用 System.out.println() 进行简单快捷地调试;
- 另外一种是使用适当的日志记录方法,可以使用 log4j 来进行系统的日志记录,Servlet API 中提供了一种简单的日志输出方式,使用 GenericServlet 或 HttpServlet 的 log() 方法,或者 ServletContext 的 log() 方法;
- 通过 Servlet API 生成的日志记录在 【Tomcat根目录/logs目录】中可以找到;
关于 GenericServlet、HttpServlet 、ServletContext 的 log() 方法的 API
以下是简单的代码示例;
1
public class Demo extends GenericServlet {
2
public void service(ServletRequest request, ServletResponse response) throws ServletException,java.io.IOException {
3
4
String par = request.getParameter("parameter1");
5
6
ServletContext context = getServletContext( );
7
if (par == null || par.equals(""))
8
context.log("No message received:",new IllegalStateException("Missing parameter"));
9
else
10
context.log("Here is the visitor's message: " + par);
11
12
//接下去的代码流程
13
.
14
15
}
16
}
阅读全文
0 0
- 04. Servlet 异常处理&日志调试
- JS调试日志输出和异常处理
- 处理servlet异常
- Servlet异常处理
- Servlet之异常处理
- Servlet异常处理
- Servlet异常处理
- Servlet异常处理
- servlet异常处理
- Servlet异常处理
- servlet异常处理
- Servlet异常处理
- Servlet 异常处理
- servlet_13 Servlet异常处理
- Servlet异常处理
- servlet异常如何处理
- servlet异常如何处理
- servlet异常处理代码
- python 和c#共用memcached
- MyBatis Sql语句中的转义字符
- RxJava2.0使用
- windows7下硬盘安装linux
- Win10通知区域图标设置(找回win7的“通知区域图标”)
- 04. Servlet 异常处理&日志调试
- SRS(simple-rtmp-server)流媒体服务器源码分析--HLS切片
- PTA甲 1104. Sum of Number Segments (20)
- JAVASCRIPT的第二天
- 丑数
- 设计模式学习—命令模式
- 大数据入门基础:Hadoop简介
- 网易2016研发工程师编程题--完全解析
- 从概念到底层技术,一文看懂区块链架构设计(附知识图谱)