当前位置: 首页 > news >正文

Servlet API 详解

Servlet API 是 Java EE(现 Jakarta EE)的核心组件,它为开发者提供了构建 Web 应用程序的基础框架。理解 Servlet API 的工作原理对掌握 Java Web 开发至关重要。

Servlet 基础与核心概念

Servlet 是在服务器端运行的小程序,用于处理客户端请求并生成动态响应。它通过 javax.servlet 和 javax.servlet.http 包中的接口和类实现功能。所有自定义 Servlet 都需继承 HttpServlet 类,并覆盖关键方法处理 HTTP 请求。

核心类关系​​:

  • Servlet 接口定义生命周期方法
  • GenericServlet 提供协议无关的实现
  • HttpServlet 扩展自 GenericServlet,专用于 HTTP 协议

Servlet的生命周期

想象一下 Servlet 就是 web 应用里某个专门负责处理某种请求的小模块。它的命基本就三部分:出生干活、每次服务、最后退休。首先呢,当 Web 服务器(或者叫容器,比如 Tomcat)一启动,或者第一次有请求来找你这个 Servlet 的时候,服务器就会把这个 Servlet 加载到内存里,然后调用它一个叫 init() 的方法。这个方法就像出生后的第一次准备动作,它就执行这么一次,一般在这里做些准备工作,比如连个数据库啊,读点配置文件之类的,为后面的请求处理打好基础。

准备好之后,Servlet 就在那里等着了。然后呢,每次有匹配的用户请求过来,服务器会交到 Servlet 手里处理。这时 Servlet 的核心服务方法(最常见的是 service(),或者是 doGet()doPost 这些)就会被调用。这个方法才是真正干活的主力,它接收用户的请求数据(比如填了个表单),根据业务逻辑做些处理(比如查数据库),然后把生成的响应(比如网页结果)发回给浏览器。关键来了,一个 Servlet 实例在出生准备好之后,会​​一直存在​​,每次有新的请求来,服务器都会用这个​​同一个实例​​来处理,只不过会给每个请求分配一个单独的小帮手(线程)来调用服务方法。所以它能高效地服务一大波请求,避免了每次请求都重新生娃初始化那么费劲。

最后,当服务器要关闭了,或者 Web 应用需要被卸载的时候,服务器就会给 Servlet 发送一个“退休通知”,调用它的 destroy() 方法。这个方法也只会被执行一次。Servlet 同志接到通知,就知道自己要退休了,就把当年在 init() 里打开的东西(像数据库连接)关一关,把占用的资源清理清理,打扫收拾一下场地,然后优雅地离开。这之后,这个 Servlet 实例就被服务器清出内存了。这就是一个 Servlet 从出生、服务、到退休的完整流程了,核心就是只做一次初始化和清理,中间的服务是复用的。

HttpServlet

我们写 Servlet 代码的时候, 首先第一步就是先创建类, 继承自 HttpServlet, 并重写其中的某些方法.

​方法名称​​调用时机​​主要功能​​常用重写场景​
init()Servlet 实例化后仅调用一次执行初始化逻辑(非线程安全)加载配置文件、建立数据库连接池
init(ServletConfig config)在 init() 前调用获取容器配置信息,需调用 super.init(config)需要直接访问 ServletConfig 的场景
service(ServletRequest, ServletResponse)每次收到请求时调用请求入口,将请求派发给对应的 doXxx() 方法极少重写,用于统一预处理
doGet(HttpServletRequest, HttpServletResponse)收到 HTTP GET 请求时处理资源获取请求(读取操作)查询数据、展示页面
doPost(HttpServletRequest, HttpServletResponse)收到 HTTP POST 请求时处理资源创建请求(写操作)表单提交、新建数据
doPut(HttpServletRequest, HttpServletResponse)收到 HTTP PUT 请求时处理完整资源更新请求RESTful API 资源替换
doDelete(HttpServletRequest, HttpServletResponse)收到 HTTP DELETE 请求时处理资源删除请求RESTful API 删除资源
doHead(HttpServletRequest, HttpServletResponse)收到 HTTP HEAD 请求时返回与 GET 相同的头部信息(无body)极少重写,默认为 doGet() 头部
doOptions(HttpServletRequest, HttpServletResponse)收到 HTTP OPTIONS 请求时返回服务器支持的 HTTP 方法CORS 跨域配置
doTrace(HttpServletRequest, HttpServletResponse)收到 HTTP TRACE 请求时返回请求的完整回显(用于诊断)极少使用
destroy()Servlet 销毁前调用(一次)释放资源、保存状态等清理工作关闭数据库连接、释放线程池
代码示例
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;/*** HTTP方法演示Servlet* 展示如何处理不同的HTTP请求方法(GET/POST/PUT/DELETE)* 注意:类名拼写应为MethodServlet(原类名保留Servelt拼写)*/
@WebServlet("/method")
public class MethodServelt extends HttpServlet {/*** 处理HTTP GET请求* 适用于资源查询操作(幂等操作)*/@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("处理GET请求");// 设置响应内容类型为纯文本resp.setContentType("text/plain");// 向客户端返回"doGet"文本resp.getWriter().write("doGet");}/*** 处理HTTP POST请求* 适用于创建新资源(非幂等操作)*/@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("处理POST请求");resp.setContentType("text/plain");// 使用println自动添加换行符resp.getWriter().println("doPost");}/*** 处理HTTP PUT请求* 适用于更新整个资源(幂等操作)*/@Overrideprotected void doPut(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("处理PUT请求");resp.setContentType("text/plain");resp.getWriter().write("doPut");}/*** 处理HTTP DELETE请求* 适用于删除资源(幂等操作)*/@Overrideprotected void doDelete(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("处理DELETE请求");resp.setContentType("text/plain");resp.getWriter().write("doDelete");}
}
处理GET请求
处理 POST请求

 

通过类似的方式还可以验证 doPut, doDelete 等方法,这里就不一一演示了

HttpServletRequest 

Tomcat 通过 Socket API 读取 HTTP 请求(字符串), 并且按照 HTTP 协议的格式把字符串解析成
HttpServletRequest 对象.
​方法签名​​返回类型​​描述​
String getParameter(String name)String获取请求中指定名称的参数值(如 URL 查询参数或表单数据)。若参数不存在则返回 null
Map<String, String[]> getParameterMap()Map<String, String[]>返回所有请求参数的键值对集合。键为参数名,值为字符串数组(支持多值参数)。
String[] getParameterValues(String name)String[]获取指定参数名的所有值数组(用于多选框等场景)。若无此参数则返回 null
String getHeader(String name)String获取指定名称的请求头值(如 User-Agent)。若头信息不存在则返回 null
Enumeration<String> getHeaderNames()Enumeration<String>返回所有请求头名称的枚举。
String getMethod()String返回 HTTP 请求方法(如 GETPOSTPUT)。
String getRequestURI()String获取请求的 URI(不包含协议、域名和端口,如 /app/login)。
StringBuffer getRequestURL()StringBuffer返回完整的请求 URL(包含协议和主机名,如 http://example.com/app/login)。
String getContextPath()String返回 Web 应用的上下文路径(如 /myapp)。部署在根路径时返回空字符串 ""
String getServletPath()String返回 Servlet 的映射路径(如 /login)。
HttpSession getSession()HttpSession获取当前会话,若不存在则​​创建新会话​​。
HttpSession getSession(boolean create)HttpSession获取当前会话,若 create=false 且不存在会话则返回 null
Object getAttribute(String name)Object获取请求域中存储的属性值(通过 setAttribute() 设置)。
void setAttribute(String name, Object value)void在请求域中设置属性(可用于转发时传递数据)。
void removeAttribute(String name)void移除请求域中指定属性。
String getQueryString()String返回 URL 中的查询字符串(如 ?id=123),若无则返回 null
String getRemoteAddr()String获取客户端 IP 地址。
int getServerPort()int返回服务器接收请求的端口号。
ServletInputStream getInputStream()ServletInputStream获取用于读取请求 ​​Body 原始数据​​的输入流(如处理文件上传)。
BufferedReader getReader()BufferedReader获取用于读取请求 ​​Body 文本​​的 Reader。与 getInputStream() 互斥,不可同时调用。
String getContentType()String返回请求的 Content-Type 头(如 application/json)。
int getContentLength()int获取请求 Body 的字节长度(已废弃,推荐 getContentLengthLong())。
通过这些方法可以获取到一个请求中的各个方面的信息.
注意: 请求对象是服务器收到的内容, 不应该修改. 因此上面的方法也都只是 "" 方法, 而不是 ""
方法.
代码示例

打印请求信息
创建 ShowRequest
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Enumeration;/*** 请求信息展示Servlet* 用于显示HTTP请求的详细信息(协议、方法、URI、头信息等)* 返回格式:HTML文本(使用<br>标签分隔)*/
@WebServlet("/show")
public class ShowRequestServlet extends HttpServlet {/*** 处理HTTP GET请求* 显示当前请求的详细信息* * @param req HTTP请求对象* @param resp HTTP响应对象*/@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 创建StringBuilder构建HTML响应内容StringBuilder stringBuilder = new StringBuilder();// 添加HTML文档类型声明stringBuilder.append("<!DOCTYPE html><html><head><title>Request Details</title></head><body>");stringBuilder.append("<h2>HTTP请求详细信息</h2>");// 获取并添加协议版本(如HTTP/1.1)stringBuilder.append("协议版本: ").append(req.getProtocol()).append("<br>");// 获取并添加HTTP方法(GET/POST等)stringBuilder.append("请求方法: ").append(req.getMethod()).append("<br>");// 获取并添加请求URI(不包括协议和域名)stringBuilder.append("请求URI: ").append(req.getRequestURI()).append("<br>");// 获取并添加查询字符串(GET参数部分)stringBuilder.append("查询字符串: ").append(req.getQueryString()).append("<br>");// 获取并添加上下文路径(应用根路径)stringBuilder.append("上下文路径: ").append(req.getContextPath()).append("<br>");stringBuilder.append("<h3>请求头信息</h3>");// 获取所有请求头的名称枚举Enumeration<String> headerNames = req.getHeaderNames();// 遍历所有请求头while (headerNames.hasMoreElements()) {String key = headerNames.nextElement();String value = req.getHeader(key); // 获取对应请求头的值stringBuilder.append(key).append(": ").append(value).append("<br>");}stringBuilder.append("</body></html>");// 设置响应内容类型为HTMLresp.setContentType("text/html; charset=utf-8");// 将构建的HTML内容写入响应resp.getWriter().println(stringBuilder.toString());}
}

获取 GET 请求中的参数
GET 请求中的参数一般都是通过 query string 传递给服务器的. 形如
https://v.bitedu.vip/personInf/student?userId=1111&classId=100
此时浏览器通过 query string 给服务器传递了两个参数, userId classId, 值分别是 1111 100
在服务器端就可以通过 getParameter 来获取到参数的值.
创建 GetParameter
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/getparameter")
public class GetParameterServlet extends HttpServlet {public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {String username = req.getParameter("username");String password = req.getParameter("password");System.out.println(username + " " + password);resp.getWriter().write("ok");}
}

 获取 POST 请求中的参数

POST 请求的参数一般通过 body 传递给服务器. body 中的数据格式有很多种. 如果是采用 form 表单的
形式, 仍然可以通过 getParameter 获取参数的值.
创建类 PostParameter
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;/*** 表单参数处理Servlet* 演示传统HTML表单参数(application/x-www-form-urlencoded)的处理方式*/
@WebServlet("/postparameter")
public class PostParameterServlet extends HttpServlet {/*** 处理HTTP POST请求* 用于接收标准的HTML表单提交数据(application/x-www-form-urlencoded格式)* * @param request HTTP请求对象,包含客户端提交的参数* @param response HTTP响应对象,用于向客户端返回数据*/@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// 从请求中获取名为"username"的表单参数// 相当于处理<input type="text" name="username">String username = request.getParameter("username");// 从请求中获取名为"password"的表单参数// 相当于处理<input type="password" name="password">String password = request.getParameter("password");// 打印接收到的用户名和密码(生产环境应移除此输出)System.out.println("Received credentials - " + username + ":" + password);// 设置响应内容类型为纯文本response.setContentType("text/plain");// 向客户端返回"ok"响应文本response.getWriter().println("ok");}
}

如果 POST 请求中的 body 是按照 JSON 的格式来传递, 那么获取参数的代码就要发生调整.
创建 PostParameterJson
import com.fasterxml.jackson.databind.ObjectMapper;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;/*** 请求体JSON映射类* 用于接收客户端提交的JSON数据*/
class Request {public String username; // 用户名字段public String password; // 密码字段
}/*** 响应体JSON映射类* 用于向客户端返回JSON格式的响应*/
class Response {public boolean ok; // 操作状态标识
}/*** JSON参数处理Servlet* 通过@WebServlet注解声明Servlet的访问路径*/
@WebServlet("/json")
public class JsonParameterServlet extends HttpServlet {/*** 处理HTTP POST请求* @param req HTTP请求对象* @param resp HTTP响应对象*/@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 创建Jackson的JSON对象映射器ObjectMapper mapper = new ObjectMapper();// 从请求输入流中读取JSON数据并反序列化为Request对象Request request = mapper.readValue(req.getInputStream(), Request.class);// 打印接收到的用户名和密码(实际生产环境应移除)System.out.println(request.username + " " + request.password);// 创建响应对象Response response = new Response();response.ok = true; // 设置操作成功状态// 将响应对象序列化为JSON字符串String responseJson = mapper.writeValueAsString(response);// 设置响应内容类型为JSON(UTF-8编码)resp.setContentType("application/json; charset=utf-8");// 将JSON字符串写入响应体resp.getWriter().write(responseJson);}
}

 ps:这些示例有些细节我没进行说明,所以如果你要复现的话可能有点困难,不过重点其实还是这些方法的用法

HttpServletResponse

Servlet 中的 doXXX 方法的目的就是根据请求计算得到相应, 然后把响应的数据设置到
HttpServletResponse 对象中.
然后 Tomcat 就会把这个 HttpServletResponse 对象按照 HTTP 协议的格式, 转成一个字符串, 并通过
Socket 写回给浏览器.
核心方法
方法签名​​功能描述​
void setStatus(int sc)设置 HTTP 响应状态码(如 200, 404, 500)
void sendError(int sc, String msg)发送错误状态码和自定义错误消息到客户端
void sendError(int sc)发送错误状态码(无自定义消息)
void sendRedirect(String location)重定向客户端到指定 URL(状态码 302)
void setHeader(String name, String value)设置响应头(如 setHeader("Content-Type", "text/html")
void addHeader(String name, String value)追加响应头(不覆盖同名 Header)
void setContentType(String type)快捷设置 Content-Type 响应头(如 text/html;charset=UTF-8
void setCharacterEncoding(String charset)设置响应体编码(如 UTF-8),需在 setContentType() 前调用
ServletOutputStream getOutputStream()获取二进制输出流(用于图片/文件等)
PrintWriter getWriter()获取字符输出流(用于文本内容)
void setContentLength(int len)设置响应体长度(字节数,HTTP 头 Content-Length
void addCookie(Cookie cookie)添加 Cookie 到响应头(Set-Cookie
void setBufferSize(int size)设置响应缓冲区大小(字节)
void resetBuffer()清除缓冲区数据(保持状态码和 Headers)
void flushBuffer()强制将缓冲区内容发送到客户端
boolean isCommitted()检查响应是否已提交(数据是否已发送给客户端)
void reset()重置状态码、Headers 和缓冲区内容
代码示例: 设置状态码
实现一个程序, 用户在浏览器通过参数指定要返回响应的状态码
创建 StatusServlet

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;/*** HTTP 状态码演示 Servlet* * 功能:演示如何设置 HTTP 响应状态码* 访问路径:http://<服务器地址>:<端口>/<应用上下文>/status* * 示例:客户端访问时将收到状态码为200的空响应*/
@WebServlet("/status")  // Servlet 注解配置,定义访问路径
public class StatusServlet extends HttpServlet {/*** 处理 HTTP GET 请求* * @param req HttpServletRequest 对象,包含客户端请求信息* @param resp HttpServletResponse 对象,用于设置服务器响应*/@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 设置 HTTP 响应状态码为 200 (OK)// 说明:// 1. 200 状态码表示请求已成功处理// 2. 对于 GET 请求,通常表示请求的资源已返回在响应体中// 3. 在默认配置下,空响应体将被发送(长度为0)resp.setStatus(200);// 💡 注意事项:// - 仅设置状态码不会自动生成响应内容// - 如果需要返回内容,应搭配输出流使用://   resp.getWriter().print("成功请求内容");//   resp.getOutputStream().write(bytes);//// 🔧 状态码常量:推荐使用 HttpServletResponse 内置常量//   resp.setStatus(HttpServletResponse.SC_OK); // 等同于200//// ❌ 常见错误:// 1. 同时设置状态码和调用 sendError()/sendRedirect() 会导致冲突// 2. 在响应提交(数据发送到客户端)后修改状态码无效//// 📌 最佳实践:// - 2xx 成功状态: setStatus() + 实体内容// - 3xx 重定向: 使用更简洁的 sendRedirect(location)// - 4xx/5xx 错误: 使用 sendError(sc) 方便自动处理错误页面}
}

 设置错误页面

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;/*** HTTP 错误状态码演示 Servlet* * 功能:演示如何使用 sendError() 方法返回错误状态码* 访问路径:http://<服务器地址>:<端口>/<应用上下文>/status* * 示例:客户端访问时将收到 404 错误响应*/
@WebServlet("/status")  // Servlet 注解配置,定义访问路径
public class StatusServlet extends HttpServlet {/*** 处理 HTTP GET 请求* * @param req HttpServletRequest 对象,包含客户端请求信息* @param resp HttpServletResponse 对象,用于设置服务器响应*/@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 发送 404 错误状态码和自定义错误消息// 说明:// 1. sendError() 方法会://    a) 设置指定的 HTTP 错误状态码(此处为 404)//    b) 清空响应缓冲区(丢弃之前写入的任何内容)//    c) 设置 Content-Type 为 text/html//    d) 使用服务器默认错误页面模板输出响应体// 2. 自定义消息 "这是一个错误页面" 可能被忽略,取决于服务器实现//    - Tomcat 中会在错误页面内显示此消息//    - 其他服务器可能忽略而显示内置页面resp.sendError(404, "这是一个错误页面");/** 实际输出效果(示例):* HTTP/1.1 404 Not Found* Content-Type: text/html;charset=UTF-8* * <!DOCTYPE html>* <html>* <head><title>404 - 这是一个错误页面</title></head>* <body>...</body>* </html>*//* * 🔍 原理与细节:* 1. 状态码设置:*    - sendError() 会自动设置状态码,不能与其他状态码方法(setStatus/sendRedirect)混用*    - 实际状态码包含在 HTTP 响应的起始行中* * 2. 缓冲区处理:*    - 调用后立即清除已写入缓冲区的任何内容*    - 响应被提交(isCommitted()返回true)* * 3. 错误消息处理:*    - 错误消息在 HttpServletRequest 中设置为属性:*        javax.servlet.error.status_code → 404*        javax.servlet.error.message   → "这是一个错误页面"*    - 服务器使用这些属性生成错误页面** 4. 错误页面优先级:*    a) web.xml 配置的自定义错误页面*    b) 服务器默认错误页面(如显示消息)*    c) 无处理时浏览器自带错误页面*//** 📌 最佳实践:* 1. RESTful API:避免使用 sendError(),推荐手动设置状态码:*    resp.setStatus(404);*    resp.getWriter().print("{\"error\":\"资源不存在\"}");* * 2. 自定义错误页面:*    // web.xml 配置*    <error-page>*        <error-code>404</error-code>*        <location>/error-404.html</location>*    </error-page>* * 3. 控制错误格式:*    // 使用请求分发器到错误处理页面*    req.setAttribute("errorMessage", "自定义错误详情");*    req.getRequestDispatcher("/error-handler.jsp").forward(req, resp);** 4. 替代常量写法(推荐):*    resp.sendError(HttpServletResponse.SC_NOT_FOUND, "资源未找到");*/}
}

 

代码示例: 自动刷新
实现一个程序, 让浏览器每秒钟自动刷新一次. 并显示当前的时间戳.
创建 AutoRefreshServlet
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;/*** 页面自动刷新演示 Servlet* * 功能:通过设置 Refresh 响应头实现页面定时刷新* 访问路径:http://<服务器地址>:<端口>/<应用上下文>/refresh* * 效果:浏览器每隔1秒自动刷新页面,显示当前时间戳*/
@WebServlet("/refresh")  // Servlet 注解配置,定义访问路径
public class RefreshServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 设置 Refresh 响应头实现自动刷新// 参数说明:刷新时间间隔(秒) + 可选重定向URL// 当前配置:"1" 表示每秒刷新一次,不跳转到其他URLresp.setHeader("Refresh", "1");/** Refresh 响应头详解:* 格式: <间隔秒数>[; url=<重定向地址>]* * 常见用法:* 1. 纯刷新当前页面: resp.setHeader("Refresh", "3");* 2. 定时跳转到新页面: *    resp.setHeader("Refresh", "5; url=https://example.com");* 3. 相对路径跳转:*    resp.setHeader("Refresh", "2; url=/newpage.html");* * 🔔 注意:*    - Refresh 是非标准 HTTP 头,已被 W3C 推荐的标准替代方案(HTML <meta> 标签)取代*    - 但主流浏览器仍广泛支持此特性*/// 获取当前系统时间戳long currentTime = System.currentTimeMillis();// 向响应体写入时间戳// 说明:每次刷新都会重新执行 doGet() 方法,生成最新时间resp.getWriter().write("当前时间戳: " + currentTime);/** 效果说明:* 1. 客户端首次访问时:*   a) 设置响应头: Refresh: 1*   b) 响应体包含当前时间戳* 2. 1秒后浏览器自动刷新页面* 3. 每次刷新显示最新的时间戳* * 输出示例:*   当前时间戳: 1721372170000*   1秒后显示:当前时间戳: 1721372171000*//** 💡 替代方案(HTML5 标准方式):*   1. 返回包含 <meta http-equiv="Refresh"> 的 HTML*   2. 示例代码:*      String html = """*          <!DOCTYPE html>*          <html>*          <head>*              <meta http-equiv="Refresh" content="1">*          </head>*          <body>"""+ currentTime + """</body>*          </html>""";*      resp.getWriter().print(html);*   3. 优势:兼容性更好,遵循 W3C 规范* * ⚠️ 安全提醒:*   1. 高频率刷新(<1秒)可能导致客户端性能问题*   2. 避免无限刷新导致资源浪费* * 🚀 实用场景:*   - 实时监控仪表盘(简易版)*   - 页面维护倒计时跳转*   - 长轮询的替代方案*/}
}

 

代码示例: 重定向
实现一个程序, 返回一个重定向 HTTP 响应, 自动跳转到另外一个页面.
创建 RedirectServlet
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;/*** Servlet 实现类:重定向请求到指定 URL* 通过 @WebServlet 注解声明 Servlet 的访问路径为 "/redirect"*/
@WebServlet("/redirect")
public class RedirectServlet extends HttpServlet {/*** 处理 HTTP GET 请求* @param req  客户端请求对象* @param resp 服务器响应对象*/@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 设置 HTTP 状态码为 302 (临时重定向)// 等效常量:HttpServletResponse.SC_FOUNDresp.setStatus(302);// 设置重定向的目标 URL (强制浏览器跳转到搜狗主页)// 注意:URL 必须包含完整的协议和域名resp.setHeader("Location", "http://www.sogou.com");/* 备注:* 1. 也可以直接使用更便捷的发送重定向方法:*    resp.sendRedirect("http://www.sogou.com");*    此方法会自动设置状态码和 Location 头* * 2. 实际开发中建议使用常量 HttpServletResponse.SC_FOUND 代替数字 302*/}
}

 

 

 

http://www.dtcms.com/a/289379.html

相关文章:

  • 佛经个人阅读(二)《金刚经》解析
  • git fork的项目远端标准协作流程 仓库设置[设置成upstream]
  • 基于自定义数据集微调SigLIP2-分类任务
  • C语言:深入理解指针(2)
  • FreeRTOS学习笔记之内存管理
  • Spring MVC上下文容器在Web容器中是如何启动的(源码深入剖析)?
  • LeetCode 121. 买卖股票的最佳时机
  • Docker安装mysql、redis
  • 学习日志15 python
  • 深入理解Graphite协议:数据采集、存储与可视化的核心技术
  • [硬件电路-57]:根据电子元器件的受控程度,可以把电子元器件分为:不受控、半受控、完全受控三种大类
  • 65-OVP保护电路
  • 医学图像超分辨率重建深度学习模型开发报告
  • [硬件电路-58]:根据电子元器件的控制信号的类型分为:电平控制型和脉冲控制型两大类。
  • FNAF同人:简陋的测试
  • Pact 合约测试框架
  • 民法学学习笔记(个人向) Part.4
  • 20250720-5-Kubernetes 调度-污点与污点容忍_笔记
  • 力扣(LeetCode)第 459 场周赛
  • pthread_detach与pthread_join区别及使用场景
  • MySQL EXPLAIN 解读
  • 奥比中光双目摄像头实现物品抓取的机器人系统
  • 算法-递推
  • golang踩坑之url不会decode问题
  • 物联网安装调试-继电器
  • Google-多代理设计:用更好的提示和拓扑优化代理
  • 可视化技术如何拯救柔性生产?小批量定制化订单的排产仿真与产能透视
  • Navicat Premium:一站式数据库管理解决方案
  • Codeforces Round 1037 (Div. 3)(A,B,C,D,E,F,G1)
  • Centos卷挂载失败系统无法启动