HTTP 状态码是服务器在响应客户端请求时返回的三位数字代码,用于指示请求的处理状态。Servlet 通过 HttpServletResponse 对象设置状态码,以控制响应行为。


目录

  1. HTTP 状态码概述
  2. 状态码分类
  3. 在Servlet中设置状态码
  4. 常见状态码示例
  5. 完整实例
  6. 部署与测试
  7. 参考资料

1. HTTP 状态码概述

  • 定义:状态码是HTTP协议的一部分,指示请求的成功、失败或其他状态。
  • Servlet控制:使用 HttpServletResponse 的方法(如 setStatus()sendError())设置。
  • 作用
  • 通知客户端请求结果。
  • 触发特定行为(如重定向)。

2. 状态码分类

状态码分为五类(由首位数字表示):

  1. 1xx – 信息性:请求已接收,继续处理(少用)。
  • 示例:100 Continue。
  1. 2xx – 成功:请求成功处理。
  • 示例:200 OK。
  1. 3xx – 重定向:需要进一步操作。
  • 示例:302 Found。
  1. 4xx – 客户端错误:请求有误。
  • 示例:404 Not Found。
  1. 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. 部署与测试

部署

  1. 编译:
   javac -cp /path/to/tomcat/lib/servlet-api.jar StatusCodeServlet.java
  1. .class 文件放入 myapp/WEB-INF/classes/
  2. status.html 放入 myapp/
  3. 部署 myapp 到Tomcat的 webapps 目录。
  4. 启动Tomcat。

测试

  • 访问:http://localhost:8080/myapp/status.html
  • 点击链接测试:
  • 200:显示成功消息。
  • 302:重定向到 /myapp/welcome(需另行创建)。
  • 404:显示未找到错误。
  • 403:显示无权限。
  • 500:显示服务器错误。

7. 参考资料

出站链接

其他资源

  • 《Servlet & JSP: A Tutorial》 – 状态码章节。
  • X社区:搜索 #ServletStatusCode 获取示例。

这篇指南详细讲解了Servlet中HTTP状态码的使用,包括分类和实现。如果需要更深入内容(如自定义错误页面或状态码与RESTful API的结合),请告诉我!