Servlet 通过 HttpServletResponse
对象生成服务器端的HTTP响应,控制状态码、响应头和内容。本文将介绍如何在Servlet中构造不同类型的响应。
目录
1. HTTP 响应概述
- HTTP 响应:服务器对客户端请求的回答,包括状态行、头信息和响应体。
- Servlet 处理:
HttpServletResponse
:提供方法设置状态码、头和内容。- 主要元素:
- 状态码:如200(成功)、404(未找到)。
- 头信息:如
Content-Type
、Location
。 - 响应体: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/html
、application/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. 部署与测试
部署
- 编译:
javac -cp /path/to/tomcat/lib/servlet-api.jar ResponseServlet.java
- 将
.class
文件放入myapp/WEB-INF/classes/
。 - 将
response.html
放入myapp/
。 - 部署
myapp
到Tomcat的webapps
目录。 - 启动Tomcat。
测试
- 访问:
http://localhost:8080/myapp/response.html
。 - 点击链接测试:
- HTML响应:显示动态页面。
- JSON响应:返回JSON数据。
- 重定向:跳转到
/myapp/welcome
。 - 错误响应:显示403错误。
7. 参考资料
出站链接
- HttpServletResponse API – 官方API。
- Tomcat文档 – 响应处理。
- Java EE教程 – 响应生成。
其他资源
- 《Head First Servlets and JSP》 – 响应处理章节。
- X社区:搜索 #ServletResponse 获取示例。
这篇指南展示了Servlet如何生成HTTP响应,包括状态码、头和内容控制。如果需要更复杂的功能(如文件下载、自定义错误页或RESTful响应),请告诉我!
发表回复