HTTP 状态码是服务器在响应客户端请求时返回的三位数字代码,用于指示请求的处理状态。Servlet 通过 HttpServletResponse
对象设置状态码,以控制响应行为。
目录
1. HTTP 状态码概述
- 定义:状态码是HTTP协议的一部分,指示请求的成功、失败或其他状态。
- Servlet控制:使用
HttpServletResponse
的方法(如setStatus()
、sendError()
)设置。 - 作用:
- 通知客户端请求结果。
- 触发特定行为(如重定向)。
2. 状态码分类
状态码分为五类(由首位数字表示):
- 1xx – 信息性:请求已接收,继续处理(少用)。
- 示例:100 Continue。
- 2xx – 成功:请求成功处理。
- 示例:200 OK。
- 3xx – 重定向:需要进一步操作。
- 示例:302 Found。
- 4xx – 客户端错误:请求有误。
- 示例:404 Not Found。
- 5xx – 服务器错误:服务器处理失败。
- 示例:500 Internal Server Error。
3. 在Servlet中设置状态码
方法
setStatus(int sc)
:设置状态码,通常用于成功或自定义状态。sendError(int sc, String msg)
:设置错误状态码并返回错误信息。sendRedirect(String location)
:隐式设置302并指定重定向URL。
注意
- 在调用
getWriter()
或getOutputStream()
之前设置状态码,否则可能抛出异常。
4. 常见状态码示例
200 OK
表示请求成功:
response.setStatus(HttpServletResponse.SC_OK);
302 Found(重定向)
临时重定向:
response.setStatus(HttpServletResponse.SC_MOVED_TEMPORARILY);
response.setHeader("Location", "/myapp/newpage");
404 Not Found
资源未找到:
response.sendError(HttpServletResponse.SC_NOT_FOUND, "页面不存在");
403 Forbidden
无权限:
response.sendError(HttpServletResponse.SC_FORBIDDEN, "访问被拒绝");
500 Internal Server Error
服务器错误:
response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "服务器内部错误");
5. 完整实例
以下是一个展示多种状态码的Servlet。
HTML:status.html
<!DOCTYPE html>
<html>
<head><title>状态码测试</title></head>
<body>
<h2>测试状态码</h2>
<a href="/myapp/status?action=success">200 成功</a><br>
<a href="/myapp/status?action=redirect">302 重定向</a><br>
<a href="/myapp/status?action=notfound">404 未找到</a><br>
<a href="/myapp/status?action=forbidden">403 无权限</a><br>
<a href="/myapp/status?action=error">500 服务器错误</a>
</body>
</html>
Servlet:StatusCodeServlet.java
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class StatusCodeServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String action = request.getParameter("action");
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
if ("success".equals(action)) {
response.setStatus(HttpServletResponse.SC_OK);
out.println("<h1>200 - 请求成功</h1>");
} else if ("redirect".equals(action)) {
response.sendRedirect("/myapp/welcome"); // 302
} else if ("notfound".equals(action)) {
response.sendError(HttpServletResponse.SC_NOT_FOUND, "资源未找到");
} else if ("forbidden".equals(action)) {
response.sendError(HttpServletResponse.SC_FORBIDDEN, "无权限访问");
} else if ("error".equals(action)) {
response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "服务器出错");
} else {
response.setStatus(HttpServletResponse.SC_OK);
out.println("<h1>欢迎测试状态码</h1>");
out.println("<p>选择一个链接以查看效果</p>");
}
}
}
配置: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>StatusCodeServlet</servlet-name>
<servlet-class>StatusCodeServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>StatusCodeServlet</servlet-name>
<url-pattern>/status</url-pattern>
</servlet-mapping>
</web-app>
6. 部署与测试
部署
- 编译:
javac -cp /path/to/tomcat/lib/servlet-api.jar StatusCodeServlet.java
- 将
.class
文件放入myapp/WEB-INF/classes/
。 - 将
status.html
放入myapp/
。 - 部署
myapp
到Tomcat的webapps
目录。 - 启动Tomcat。
测试
- 访问:
http://localhost:8080/myapp/status.html
。 - 点击链接测试:
- 200:显示成功消息。
- 302:重定向到
/myapp/welcome
(需另行创建)。 - 404:显示未找到错误。
- 403:显示无权限。
- 500:显示服务器错误。
7. 参考资料
出站链接
- HTTP状态码 – MDN状态码说明。
- Servlet API – 状态码常量。
- Java EE教程 – 响应处理。
其他资源
- 《Servlet & JSP: A Tutorial》 – 状态码章节。
- X社区:搜索 #ServletStatusCode 获取示例。
这篇指南详细讲解了Servlet中HTTP状态码的使用,包括分类和实现。如果需要更深入内容(如自定义错误页面或状态码与RESTful API的结合),请告诉我!
发表回复