Servlet 异常处理是在Servlet执行过程中捕获和处理错误的技术,确保应用程序的健壮性和用户体验。本文将介绍Servlet中异常的类型、处理方法及实现方式。
目录
1. 异常处理概述
- 目的:捕获运行时错误(如参数缺失、数据库故障),提供友好的错误响应。
- 方式:
- 在Servlet代码中手动处理。
- 通过web.xml配置全局异常页面。
- 重要性:避免直接暴露堆栈跟踪,增强安全性。
2. Servlet中的异常类型
ServletException
:Servlet特定的异常,通常由初始化或请求处理失败引发。IOException
:输入输出操作(如写响应)失败时抛出。- 运行时异常:如
NullPointerException
、NumberFormatException
等。 - 自定义异常:开发者定义的业务异常。
3. 异常处理方法
在Servlet中处理
使用 try-catch
捕获异常:
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
try {
String num = request.getParameter("num");
int value = Integer.parseInt(num); // 可能抛出NumberFormatException
out.println("<h1>数字: " + value + "</h1>");
} catch (NumberFormatException e) {
response.sendError(HttpServletResponse.SC_BAD_REQUEST, "请输入有效数字");
}
}
抛出异常
让容器处理:
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String num = request.getParameter("num");
if (num == null) {
throw new ServletException("缺少参数: num");
}
int value = Integer.parseInt(num);
response.getWriter().println("<h1>数字: " + value + "</h1>");
}
4. 使用web.xml配置异常页面
全局异常处理通过 web.xml
配置错误页面。
配置示例
<web-app>
<error-page>
<error-code>400</error-code>
<location>/error400.html</location>
</error-page>
<error-page>
<error-code>404</error-code>
<location>/error404.html</location>
</error-page>
<error-page>
<exception-type>javax.servlet.ServletException</exception-type>
<location>/errorServlet.jsp</location>
</error-page>
<error-page>
<exception-type>java.lang.Exception</exception-type>
<location>/errorGeneral.jsp</location>
</error-page>
</web-app>
错误页面示例:error400.html
<!DOCTYPE html>
<html>
<head><title>400 错误</title></head>
<body>
<h1>400 - 请求错误</h1>
<p>请检查您的输入。</p>
</body>
</html>
JSP错误页面:errorServlet.jsp
<%@ page isErrorPage="true" %>
<!DOCTYPE html>
<html>
<head><title>Servlet 异常</title></head>
<body>
<h1>Servlet 异常</h1>
<p>错误信息: <%= exception.getMessage() %></p>
</body>
</html>
5. 完整示例
以下是一个展示异常处理的Servlet。
Servlet:ErrorServlet.java
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class ErrorServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
String action = request.getParameter("action");
try {
if ("divide".equals(action)) {
String num = request.getParameter("num");
int value = 10 / Integer.parseInt(num); // 可能抛出异常
out.println("<h1>结果: " + value + "</h1>");
} else {
out.println("<h1>欢迎使用</h1>");
}
} catch (NumberFormatException e) {
response.sendError(HttpServletResponse.SC_BAD_REQUEST, "请输入有效数字");
} catch (ArithmeticException e) {
throw new ServletException("除以零错误");
}
}
}
配置:web.xml
<web-app xmlns="https://jakarta.ee/xml/ns/jakartaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd"
version="5.0">
<servlet>
<servlet-name>ErrorServlet</servlet-name>
<servlet-class>ErrorServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ErrorServlet</servlet-name>
<url-pattern>/error</url-pattern>
</servlet-mapping>
<error-page>
<error-code>400</error-code>
<location>/error400.html</location>
</error-page>
<error-page>
<exception-type>javax.servlet.ServletException</exception-type>
<location>/errorServlet.jsp</location>
</error-page>
</web-app>
HTML:index.html
<!DOCTYPE html>
<html>
<head><title>异常测试</title></head>
<body>
<form method="GET" action="/myapp/error">
数字: <input type="text" name="num"><br>
<input type="hidden" name="action" value="divide">
<input type="submit" value="除以10">
</form>
</body>
</html>
6. 部署与测试
部署
- 编译:
javac -cp /path/to/tomcat/lib/servlet-api.jar ErrorServlet.java
- 将
.class
文件放入myapp/WEB-INF/classes/
。 - 将
index.html
、error400.html
和errorServlet.jsp
放入myapp/
。 - 更新
web.xml
。 - 部署
myapp
到Tomcat的webapps
目录。 - 启动Tomcat。
测试
- 访问:
http://localhost:8080/myapp/index.html
- 输入“2”:显示“结果: 5”。
- 输入“abc”:跳转到
error400.html
。 - 输入“0”:跳转到
errorServlet.jsp
,显示“除以零错误”。
7. 参考资料
出站链接
- Servlet API – ServletException文档。
- Java EE教程 – 异常处理章节。
- Tomcat错误页面 – 配置指南。
其他资源
- 《Servlet Programming》 – 异常处理章节。
- X社区:搜索 #ServletException 获取示例。
这篇指南展示了Servlet异常处理的多种方式。如果需要更复杂的内容(如日志记录异常或自定义异常类),请告诉我!
发表回复