Servlet 通过 HttpServletResponse 对象生成服务器端的HTTP响应,控制状态码、响应头和内容。本文将介绍如何在Servlet中构造不同类型的响应。


目录

  1. HTTP 响应概述
  2. 设置响应状态码
  3. 设置响应头
  4. 输出响应内容
  5. 综合示例
  6. 部署与测试
  7. 参考资料

1. HTTP 响应概述

  • HTTP 响应:服务器对客户端请求的回答,包括状态行、头信息和响应体。
  • Servlet 处理
  • HttpServletResponse:提供方法设置状态码、头和内容。
  • 主要元素
  • 状态码:如200(成功)、404(未找到)。
  • 头信息:如 Content-TypeLocation
  • 响应体:HTML、JSON等内容。

2. 设置响应状态码

状态码指示请求处理结果。

示例代码:StatusServlet.java

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class StatusServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        String action = request.getParameter("action");

        if ("error".equals(action)) {
            response.sendError(HttpServletResponse.SC_NOT_FOUND, "资源未找到"); // 404
        } else if ("redirect".equals(action)) {
            response.setStatus(HttpServletResponse.SC_MOVED_TEMPORARILY); // 302
            response.setHeader("Location", "/myapp/welcome");
        } else {
            response.setStatus(HttpServletResponse.SC_OK); // 200
            PrintWriter out = response.getWriter();
            out.println("<h1>请求成功</h1>");
        }
    }
}
  • 常用状态码
  • SC_OK (200):成功。
  • SC_NOT_FOUND (404):未找到。
  • SC_MOVED_TEMPORARILY (302):临时重定向。

3. 设置响应头

响应头控制客户端行为或提供元信息。

示例代码:HeaderServlet.java

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class HeaderServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        response.setHeader("Cache-Control", "no-cache"); // 禁用缓存
        response.addHeader("X-Custom-Header", "CustomValue"); // 自定义头

        PrintWriter out = response.getWriter();
        out.println("<html><body>");
        out.println("<h1>响应头示例</h1>");
        out.println("</body></html>");
    }
}
  • 常用头
  • Content-Type:指定内容类型(如 text/htmlapplication/json)。
  • Location:用于重定向。
  • Cache-Control:控制缓存行为。

4. 输出响应内容

响应体可以是HTML、文本、JSON等。

HTML响应

response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
out.println("<h1>Hello, World!</h1>");

JSON响应

response.setContentType("application/json;charset=UTF-8");
PrintWriter out = response.getWriter();
out.println("{\"status\": \"success\", \"message\": \"Hello\"}");

二进制响应(如文件)

response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition", "attachment; filename=\"test.txt\"");
OutputStream out = response.getOutputStream();
out.write("This is a file".getBytes());
out.flush();

5. 综合示例

以下是一个展示多种响应的Servlet。

HTML:response.html

<!DOCTYPE html>
<html>
<head><title>响应测试</title></head>
<body>
    <h2>测试响应</h2>
    <a href="/myapp/response?action=html">HTML响应</a><br>
    <a href="/myapp/response?action=json">JSON响应</a><br>
    <a href="/myapp/response?action=redirect">重定向</a><br>
    <a href="/myapp/response?action=error">错误响应</a>
</body>
</html>

Servlet:ResponseServlet.java

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class ResponseServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        String action = request.getParameter("action");

        if ("json".equals(action)) {
            response.setContentType("application/json;charset=UTF-8");
            PrintWriter out = response.getWriter();
            out.println("{\"status\": \"success\", \"time\": \"" + new java.util.Date() + "\"}");
        } else if ("redirect".equals(action)) {
            response.sendRedirect("/myapp/welcome"); // 重定向
        } else if ("error".equals(action)) {
            response.sendError(HttpServletResponse.SC_FORBIDDEN, "无权限访问");
        } else { // 默认HTML
            response.setContentType("text/html;charset=UTF-8");
            response.setHeader("Refresh", "5"); // 5秒刷新
            PrintWriter out = response.getWriter();
            out.println("<html><body>");
            out.println("<h1>HTML 响应</h1>");
            out.println("<p>时间: " + new java.util.Date() + "</p>");
            out.println("</body></html>");
        }
    }
}

配置: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>ResponseServlet</servlet-name>
        <servlet-class>ResponseServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>ResponseServlet</servlet-name>
        <url-pattern>/response</url-pattern>
    </servlet-mapping>
</web-app>

6. 部署与测试

部署

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

测试

  • 访问:http://localhost:8080/myapp/response.html
  • 点击链接测试:
  • HTML响应:显示动态页面。
  • JSON响应:返回JSON数据。
  • 重定向:跳转到 /myapp/welcome
  • 错误响应:显示403错误。

7. 参考资料

出站链接

其他资源

  • 《Head First Servlets and JSP》 – 响应处理章节。
  • X社区:搜索 #ServletResponse 获取示例。

这篇指南展示了Servlet如何生成HTTP响应,包括状态码、头和内容控制。如果需要更复杂的功能(如文件下载、自定义错误页或RESTful响应),请告诉我!