Servlet
Servlet定义在jakarta.servlet包中,定义了Servlet的生命周期方法以及获取Servlet配置信息和元数据的方法。Servlet是在Web服务器上运行的Java程序,用于接收和处理来自Web客户端的请求。
主要方法
init(ServletConfig config)
- 这个方法由Servlet容器调用,以指示Servlet正在被部署到服务中。
ServletConfig对象包含了Servlet的配置和初始化参数。- Servlet容器在实例化Servlet后仅调用一次
init方法。该方法必须成功完成,Servlet才能接收请求。 - 如果
init方法抛出ServletException或者没有在服务器定义的时间内返回,则Servlet容器无法部署该Servlet。
getServletConfig()
- 返回一个
ServletConfig对象,该对象包含初始化和启动参数。 - 返回的
ServletConfig对象是传递给init方法的对象。
service(ServletRequest req, ServletResponse res)
- 由Servlet容器调用,允许Servlet响应请求。
- 这个方法在
init方法成功完成后才会被调用。 - 开发者需要注意,Servlet通常运行在支持多线程的容器中,因此需要同步对共享资源的访问。
- 如果Servlet抛出或发送错误,应该设置响应的状态码。
getServletInfo()
- 返回关于Servlet的信息,如作者、版本和版权。
- 返回的字符串应该是纯文本,不应包含任何标记语言。
destroy()
- 由Servlet容器调用,指示Servlet正在被移除服务。
- 这个方法在Servlet的所有线程退出
service方法或超时后调用。 - 给Servlet一个机会来清理持有的资源,并确保任何持久状态与内存中的当前状态同步。
生命周期
Servlet的生命周期包括以下几个阶段:
- 构造:Servlet类被实例化。
- 初始化:通过调用
init方法进行初始化。 - 请求服务:通过调用
service方法来处理客户端请求。 - 销毁:通过调用
destroy方法来结束服务,之后Servlet实例会被垃圾回收。
ServletConfig
ServletConfig接口为Servlet提供了配置信息,这些信息通常在Servlet初始化时由Servlet容器提供,这包括Servlet的名称、初始化参数以及它所在的ServletContext。
主要方法
getServletName()
- 返回当前Servlet实例的名称。
- 这个名称可能由服务器管理提供,或在Web应用程序的部署描述符中分配。
- 对于未注册(因此未命名)的Servlet实例,其名称将是Servlet的类名。
getServletContext()
- 返回当前Servlet执行的
ServletContext对象的引用。 ServletContext对象用于Servlet与它的容器进行交互,可以获取容器的信息,如初始化参数、资源等。
getInitParameter(String name)
- 返回指定名称的初始化参数的值,如果参数不存在则返回
null。 - 初始化参数通常在部署描述符(如web.xml)中设置,或者通过服务器管理界面配置。
getInitParameterNames()
- 返回Servlet的所有初始化参数名称的枚举。
- 如果Servlet没有初始化参数,则返回一个空的枚举。
使用场景
- 当Servlet初始化时,它可以通过
ServletConfig对象获取其配置信息。 - 通过
getInitParameter方法,Servlet可以读取特定的初始化参数,这些参数可以在部署描述符中设置。 - 通过
getServletContext方法,Servlet可以访问其容器的上下文信息,例如获取容器的路径、设置属性等。
GenericServlet
GenericServlet 是一个抽象类,实现了 Servlet 和 ServletConfig 接口。这个类提供了一个通用的、协议无关的Servlet实现,是编写Servlet时的一个基础类。
查看源码
/**
* 定义一个通用、协议无关的servlet。若要编写用于Web的HTTP servlet,请扩展
* jakarta.servlet.http.HttpServlet。
* GenericServlet 实现了 Servlet 和 ServletConfig 接口。
* 可以直接通过 GenericServlet 扩展一个servlet,尽管更常见的是扩展一个
* 特定协议的子类,如 HttpServlet。
* GenericServlet 使得编写servlet更加容易。它提供了简单版本的声明周期方法
* init 和 destroy,以及 ServletConfig 接口中的方法。
* GenericServlet 还实现了在 ServletContext 接口中声明的 log 方法。
* 要编写一个通用servlet,只需覆盖抽象的 service 方法。
*/
public abstract class GenericServlet implements Servlet, ServletConfig, java.io.Serializable {
private static final long serialVersionUID = 1L;
private transient ServletConfig config;
/**
* 默认构造函数,不做任何事情。所有的servlet初始化都由 init 方法之一完成。
*/
public GenericServlet() {
// 默认无操作
}
/**
* 由servlet容器调用,通知servlet该servlet正在被移出服务。
*/
@Override
public void destroy() {
// 默认无操作
}
/**
* 返回包含指定初始化参数值的字符串,如果参数不存在则返回 null。
* 此方法提供方便。它从servlet的 ServletConfig 对象获取指定参数的值。
*/
@Override
public String getInitParameter(String name) {
return getServletConfig().getInitParameter(name);
}
/**
* 返回servlet的初始化参数名称作为字符串对象的枚举,如果没有初始化参数则返回空的枚举。
* 此方法提供方便。它从servlet的 ServletConfig 对象获取参数名称。
*/
@Override
public Enumeration<String> getInitParameterNames() {
return getServletConfig().getInitParameterNames();
}
/**
* 返回此servlet的 ServletConfig 对象。
*/
@Override
public ServletConfig getServletConfig() {
return config;
}
/**
* 返回servlet运行的 ServletContext 的引用。
* 此方法提供方便。它从servlet的 ServletConfig 对象获取上下文。
*/
@Override
public ServletContext getServletContext() {
return getServletConfig().getServletContext();
}
/**
* 返回有关servlet的信息,如作者、版本和版权。默认情况下,此方法返回空字符串。覆盖此方法以使其返回有意义的价值。
*/
@Override
public String getServletInfo() {
return "";
}
/**
* 由servlet容器调用,通知servlet该servlet正在被放入服务。
* 此实现存储从servlet容器接收的 ServletConfig 对象以备后用。
* 当覆盖此形式的方法时,调用 super.init(config)。
*/
@Override
public void init(ServletConfig config) throws ServletException {
this.config = config;
this.init();
}
/**
* 一个方便的方法,可以被覆盖,这样就无需调用 super.init(config)。
* 不再覆盖 init(ServletConfig),只需覆盖此方法,它将由
* GenericServlet.init(ServletConfig config) 调用。仍然可以通过
* getServletConfig 获取 ServletConfig 对象。
*/
public void init() throws ServletException {
// 默认无操作
}
/**
* 将指定的消息写入servlet日志文件,前面加上servlet
的名称。
*/
public void log(String message) {
getServletContext().log(getServletName() + ": " + message);
}
/**
* 为给定的 Throwable 异常写入解释性消息和堆栈跟踪到servlet日志文件,前面加上servlet的名称。
*/
public void log(String message, Throwable t) {
getServletContext().log(getServletName() + ": " + message, t);
}
/**
* 由servlet容器调用,允许servlet响应请求。
* 此方法被声明为抽象,因此子类,如 HttpServlet,必须覆盖它。
*/
@Override
public abstract void service(ServletRequest req, ServletResponse res) throws ServletException, IOException;
/**
* 返回此servlet实例的名称。
*/
@Override
public String getServletName() {
return config.getServletName();
}
}类的目的
GenericServlet 的目的是为了简化Servlet的编写过程。它提供了 Servlet 和 ServletConfig 接口中方法的简单实现,允许开发者专注于实现 service 方法,这是处理客户端请求的核心方法。
主要方法
构造方法 GenericServlet()
- 默认构造方法,不执行任何操作。
destroy()
- 默认实现不执行任何操作,子类可以覆盖此方法以执行清理操作。
getInitParameter(String name)
- 返回指定名称的初始化参数值,通过委托给
ServletConfig对象实现。
getInitParameterNames()
- 返回所有初始化参数名称的枚举,通过委托给
ServletConfig对象实现。
getServletConfig()
- 返回
ServletConfig对象,该对象在init方法中被设置。
getServletContext()
- 返回
ServletContext对象,通过ServletConfig对象获取。
getServletInfo()
- 返回关于Servlet的信息,默认实现返回空字符串,子类可以覆盖以提供更多信息。
init(ServletConfig config)
- 保存
ServletConfig对象,并调用没有参数的init()方法。
init()
- 没有参数的初始化方法,子类可以覆盖此方法以执行初始化逻辑。
log(String message)
- 记录日志消息,前缀是Servlet的名称。
log(String message, Throwable t)
- 记录日志消息和一个异常的堆栈跟踪,前缀是Servlet的名称。
service(ServletRequest req, ServletResponse res)
- 抽象方法,必须由子类实现以处理客户端请求。
getServletName()
- 返回Servlet的名称,通过
ServletConfig对象获取。
ServletContext
ServletContext 为 Servlet 提供了一个全局的、应用级别的上下文环境。它不仅是 Web 应用中不同组件之间共享数据和资源的桥梁,还是管理和配置 Web 应用行为的重要工具。通过 ServletContext,开发者可以更灵活地控制 Web 应用的各个方面,包括资源访问、会话管理、日志记录和组件注册等。
常量
TEMPDIR: 这个字符串常量用来获取或设置 ServletContext 的临时目录路径,通常用于文件上传等操作。ORDERED_LIBS: 这个字符串常量用于获取或设置 ServletContext 的有序库路径。
方法
上下文路径和服务器信息
getContextPath(): 返回与此 ServletContext 关联的路径,这是 Web 应用的根路径。getContext(String uri): 获取指定路径的 ServletContext 对象,用于访问同一服务器上的其他 Web 应用。getMajorVersion(): 返回 Servlet API 的主版本号。getMinorVersion(): 返回 Servlet API 的次版本号。getEffectiveMajorVersion(): 返回当前 Web 应用实际使用的 Servlet API 的主版本号。getEffectiveMinorVersion(): 返回当前 Web 应用实际使用的 Servlet API 的次版本号。getServerInfo(): 返回服务器名和版本。
资源处理
getMimeType(String file): 根据文件名确定 MIME 类型。getResourcePaths(String path): 返回指定路径下所有资源的路径集合。getResource(String path): 返回指定路径的资源作为 URL 对象。getResourceAsStream(String path): 返回指定路径的资源作为 InputStream。
请求分发
getRequestDispatcher(String path): 返回一个用于将请求转发到另一个资源或者包含另一个资源的 RequestDispatcher。getNamedDispatcher(String name): 返回指定名称的 Servlet 的 RequestDispatcher。
日志记录
log(String msg): 记录一条信息级别的日志消息。log(String msg, Throwable t): 记录一条带有异常堆栈的错误级别的日志消息。
初始化参数和属性
getInitParameter(String name): 获取 Web 应用的初始化参数。getInitParameterNames(): 获取所有初始化参数的名称。setAttribute(String name, Object object): 在 ServletContext 中设置属性。getAttribute(String name): 获取 ServletContext 中的属性。getAttributeNames(): 获取所有属性的名称。removeAttribute(String name): 删除 ServletContext 中的属性。
Servlet、Filter 和 Listener 的注册
addServlet,addFilter,addListener: 分别用于动态注册 Servlet、Filter 和 EventListener。createServlet,createFilter,createListener: 用于实例化 Servlet、Filter 和 EventListener。getServletRegistration,getFilterRegistration: 获取已注册的 Servlet 和 Filter 的信息。
会话管理
getSessionCookieConfig(): 获取会话跟踪的 Cookie 配置。setSessionTrackingModes(Set<SessionTrackingMode> modes): 设置会话跟踪模式。getDefaultSessionTrackingModes(): 获取默认的会话跟踪模式。getEffectiveSessionTrackingModes(): 获取有效的会话跟踪模式。getSessionTimeout(): 获取会话超时时间(分钟)。setSessionTimeout(int sessionTimeout): 设置会话超时时间(分钟)。
编码设置
getRequestCharacterEncoding(): 获取请求的字符编码。setRequestCharacterEncoding(String encoding): 设置请求的字符编码。getResponseCharacterEncoding(): 获取响应的字符编码。setResponseCharacterEncoding(String encoding): 设置响应的字符编码。
其他
getRealPath(String path): 获取对应于 Web 应用中的虚拟路径的实际磁盘路径。getServletContextName(): 获取 Web 应用的名称。declareRoles(String... roles): 声明安全角色。getVirtualServerName(): 获取虚拟服务器的名称。getClassLoader(): 获取用于加载 Web 应用类和资源的 ClassLoader。
ServletContext 接口为 Servlet 提供了与 Web 容器通信的桥梁,它包含了大量的方法来管理应用的生命周期、资源、会话和日志等。通过这个接口,开发者能够更加灵活地控制 Servlet 容器的行为。
HttpServlet
public abstract class HttpServlet extends GenericServlet 这意味着 HttpServlet 是一个抽象类,它继承了 GenericServlet 类,后者实现了 Servlet 和 ServletConfig 接口。
HttpServlet 是专门为处理 HTTP 请求而设计的,它不能直接实例化,只是提供了一个框架,必须通过子类来实现具体的 HTTP 方法处理逻辑。

常量
serialVersionUID: 这是一个静态字段,用于序列化版本控制。HttpServlet的序列化版本标识符被设置为 1L。- HTTP 方法常量:
METHOD_DELETE: 表示 HTTP DELETE 方法。METHOD_HEAD: 表示 HTTP HEAD 方法。METHOD_GET: 表示 HTTP GET 方法。METHOD_OPTIONS: 表示 HTTP OPTIONS 方法。METHOD_POST: 表示 HTTP POST 方法。METHOD_PUT: 表示 HTTP PUT 方法。METHOD_TRACE: 表示 HTTP TRACE 方法。
- HTTP 头信息常量:
HEADER_IFMODSINCE: 表示 HTTP 请求头中的 “If-Modified-Since” 字段。HEADER_LASTMOD: 表示 HTTP 响应头中的 “Last-Modified” 字段。
- 本地化字符串资源文件名和资源包:
LSTRING_FILE: 本地化字符串资源的文件名。lStrings: 一个ResourceBundle对象,用于获取本地化的字符串。
- 敏感 HTTP 头信息列表:
SENSITIVE_HTTP_HEADERS: 一个列表,包含了在日志记录中可能被认为是敏感的 HTTP 头信息。
- 遗留的
doHead方法标记:LEGACY_DO_HEAD: 一个标记,用于指示是否使用遗留的doHead方法处理HEAD请求。这个标记自 Servlet 6.0 起被废弃,用于兼容早期版本的 Servlet API。
字段
同步锁和缓存字段:
cachedAllowHeaderValueLock: 用于同步访问cachedAllowHeaderValue字段的锁对象。cachedAllowHeaderValue: 缓存的Allow响应头的值,用于告诉客户端哪些 HTTP 方法是被支持的。cachedUseLegacyDoHead: 布尔值,用于指示是否使用遗留的doHead方法。
内部类
在 HttpServlet 类中,定义了几个内部类,这些类用于扩展 HttpServletResponse 和 ServletOutputStream,以支持一些特殊的行为,特别是与 HTTP HEAD 请求的处理相关。
NoBodyResponse
这是一个扩展了 HttpServletResponseWrapper 的内部类,用于在处理 HTTP HEAD 请求时,不实际写入响应体。这个类的主要特点包括:
noBodyOutputStream: 一个特殊的ServletOutputStream,用于记录写入的字节数,但不实际写入响应体。originalOutputStream: 保存原始的ServletOutputStream,以便在需要时恢复原始行为。noBodyWriter: 一个特殊的PrintWriter,用于在 HEAD 请求中写入响应头信息。didSetContentLength: 一个布尔值,用于标记是否已经设置了Content-Length头。
NoBodyAsyncContextListener
这是一个实现了 AsyncListener 接口的内部类,用于处理 HTTP HEAD 请求的异步事件。当 HEAD 请求完成时,它会调用 setContentLength 方法,以确保 Content-Length 头被正确设置。
TomcatHack
这是一个静态内部类,用于检测和处理特定的 Tomcat 请求对象。它包含了一个静态方法 getAllowTrace,用于检查请求是否允许 TRACE 方法。
NoBodyPrintWriter
这是一个扩展了 PrintWriter 的内部类,用于在 HEAD 请求中写入响应头信息。它使用一个特殊的 NoBodyOutputStream 来记录写入的字节数,但不实际写入响应体。
NoBodyOutputStream
这是一个扩展了 ServletOutputStream 的内部类,用于在 HEAD 请求中记录写入的字节数,但不实际写入响应体。它使用一个静态字段 writtenByteCount 来跟踪写入的字节数,并在必要时调用 checkCommit 方法来确保 Content-Length 头被正确设置。
这些内部类的主要目的是在处理 HTTP HEAD 请求时,确保响应体不被实际写入,同时正确地设置 Content-Length 头。这对于优化性能和响应缓存非常有用,因为服务器可以提前知道响应体的长度,并据此做出相应的缓存决策。
方法
HttpServlet 是一个抽象类,它扩展了 GenericServlet,用于处理 HTTP 请求。
构造函数
public HttpServlet(): 默认构造函数,没有参数。
初始化方法
public void init(ServletConfig config) throws ServletException: 该方法在 Servlet 实例化后被调用,用于初始化 Servlet。它读取了一个初始化参数来决定是否使用遗留的doHead方法处理HEAD请求。
HTTP 方法处理
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException: 抽象方法,用于处理 HTTP GET 请求。如果 GET 请求不被支持,它会调用sendMethodNotAllowed方法发送 405 错误。protected long getLastModified(HttpServletRequest req): 返回资源的最后修改时间,用于缓存控制。默认实现返回 -1L,表示不支持缓存。protected void doHead(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException: 抽象方法,用于处理 HTTP HEAD 请求。如果启用了遗留模式,它会使用NoBodyResponse来避免发送响应体。protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException: 抽象方法,用于处理 HTTP POST 请求。如果 POST 请求不被支持,它会调用sendMethodNotAllowed方法发送 405 错误。protected void doPut(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException: 抽象方法,用于处理 HTTP PUT 请求。如果 PUT 请求不被支持,它会调用sendMethodNotAllowed方法发送 405 错误。protected void doDelete(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException: 抽象方法,用于处理 HTTP DELETE 请求。如果 DELETE 请求不被支持,它会调用sendMethodNotAllowed方法发送 405 错误。protected void doOptions(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException: 抽象方法,用于处理 HTTP OPTIONS 请求。它会设置Allow响应头,列出支持的 HTTP 方法。protected void doTrace(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException: 抽象方法,用于处理 HTTP TRACE 请求。它会返回一个包含请求头信息的响应。
这些方法都是受保护的,子类可以覆盖它们以实现特定的请求处理逻辑。
服务方法
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException: 根据请求的 HTTP 方法类型调用相应的方法来处理请求。它是 HttpServlet 类的核心,负责将请求分发给正确的处理方法。
查看代码
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String method = req.getMethod();
long lastModified;
if (method.equals("GET")) {
lastModified = this.getLastModified(req);
if (lastModified == -1L) {
this.doGet(req, resp);
} else {
long ifModifiedSince;
try {
ifModifiedSince = req.getDateHeader("If-Modified-Since");
} catch (IllegalArgumentException var9) {
ifModifiedSince = -1L;
}
if (ifModifiedSince < lastModified / 1000L * 1000L) {
this.maybeSetLastModified(resp, lastModified);
this.doGet(req, resp);
} else {
resp.setStatus(304);
}
}
} else if (method.equals("HEAD")) {
lastModified = this.getLastModified(req);
this.maybeSetLastModified(resp, lastModified);
this.doHead(req, resp);
} else if (method.equals("POST")) {
this.doPost(req, resp);
} else if (method.equals("PUT")) {
this.doPut(req, resp);
} else if (method.equals("DELETE")) {
this.doDelete(req, resp);
} else if (method.equals("OPTIONS")) {
this.doOptions(req, resp);
} else if (method.equals("TRACE")) {
this.doTrace(req, resp);
} else {
String errMsg = lStrings.getString("http.method_not_implemented");
Object[] errArgs = new Object[]{method};
errMsg = MessageFormat.format(errMsg, errArgs);
resp.sendError(501, errMsg);
}
}public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException: 重写 GenericServlet 的 service 方法,确保传入的是 HttpServletRequest 和 HttpServletResponse 对象,然后调用 service(HttpServletRequest, HttpServletResponse)。
查看代码
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
HttpServletRequest request;
HttpServletResponse response;
try {
request = (HttpServletRequest)req;
response = (HttpServletResponse)res;
} catch (ClassCastException var6) {
throw new ServletException(lStrings.getString("http.non_http"));
}
this.service(request, response);
}辅助方法
private void sendMethodNotAllowed(HttpServletRequest req, HttpServletResponse resp, String msg) throws IOException: 发送一个错误响应,表明请求的方法不被允许。private String getCachedAllowHeaderValue(): 生成一个字符串,列出了所有支持的 HTTP 方法,用于Allow响应头。private static Method[] getAllDeclaredMethods(Class<?> c): 递归地获取类及其超类中声明的所有方法。private boolean isSensitiveHeader(String headerName): 检查指定的 HTTP 头是否是敏感的。
缓存和安全性
private boolean cachedUseLegacyDoHead: 布尔值,指示是否使用遗留的doHead方法。private static final List<String> SENSITIVE_HTTP_HEADERS: 包含了在日志记录中可能被认为是敏感的 HTTP 头信息的列表。
HttpServletRequest
这个类是一个接口,名为 HttpServletRequest,它位于 jakarta.servlet.http 包中。这个接口扩展了 ServletRequest 接口,并为 HTTP Servlet 提供了额外的请求信息和方法。
常量
BASIC_AUTH、FORM_AUTH、CLIENT_CERT_AUTH、DIGEST_AUTH:这些是认证方式的字符串常量,分别代表基本认证、表单认证、客户端证书认证和摘要认证。
方法
getAuthType(): 返回这次请求的认证类型,如 "BASIC"、"FORM" 等。getCookies(): 返回一个数组,包含客户端随这次请求发送的 Cookie。getDateHeader(String name): 以毫秒为单位返回指定的请求头字段的值,转换为自1970年1月1日00:00:00 GMT以来的日期。getHeader(String name): 返回指定请求头的值。getHeaders(String name): 返回一个枚举,包含所有与指定名称对应的请求头值。getHeaderNames(): 返回一个枚举,包含请求中所有头的名称。getIntHeader(String name): 以整数形式返回指定请求头的值。getHttpServletMapping(): 默认方法,返回一个HttpServletMapping对象,它提供了关于如何将请求映射到servlet的信息。getMethod(): 返回请求的 HTTP 方法,如 "GET"、"POST" 等。getPathInfo(): 返回任何额外的路径信息,以/开始,跟在 servlet 路径之后。getPathTranslated(): 将getPathInfo()返回的路径信息转换为真实路径。newPushBuilder(): 默认方法,返回一个PushBuilder实例,用于推送资源。getContextPath(): 返回请求的上下文路径。getQueryString(): 返回请求 URL 中的查询字符串。getRemoteUser(): 返回经过身份验证的远程用户。isUserInRole(String role): 检查经过身份验证的用户是否属于指定的角色。getUserPrincipal(): 返回一个Principal对象,包含经过身份验证的用户的用户名。getRequestedSessionId(): 返回请求的 session ID。getRequestURI(): 返回请求的 URI。getRequestURL(): 返回请求的完整 URL。getServletPath(): 返回请求的 servlet 路径。getSession(boolean create): 返回当前请求的HttpSession,如果create为true且没有当前会话,则创建一个。getSession(): 等同于getSession(true)。changeSessionId(): 更改当前会话的 ID。isRequestedSessionIdValid(): 检查请求的 session ID 是否有效。isRequestedSessionIdFromCookie(): 检查请求的 session ID 是否来自 cookie。isRequestedSessionIdFromURL(): 检查请求的 session ID 是否来自 URL。authenticate(HttpServletResponse response): 用于启动一个认证过程。login(String username, String password): 用于登录用户。logout(): 用于注销用户。getParts(): 返回一个集合,包含请求中的所有Part对象。getPart(String name): 返回请求中指定名称的Part对象。upgrade(Class<T> handlerClass): 用于升级协议,并返回一个升级处理器的实例。getTrailerFields(): 默认方法,返回一个不可修改的映射,包含请求的尾部字段。isTrailerFieldsReady(): 默认方法,检查是否可以安全地读取尾部字段。
HttpServletResponse
这个类是一个接口,名为 HttpServletResponse,它位于 jakarta.servlet.http 包中。这个接口扩展了 ServletResponse 接口,并为 HTTP Servlet 提供了额外的响应信息和方法。
常量

HttpServletResponse 接口中定义了 HTTP 状态码。它们代表了服务器在 HTTP 响应中发送给客户端的各种状态信息。
1xx: Informational - 通知性状态码
SC_CONTINUE: 100,表示客户端应当继续发送请求。这个临时响应是用来通知客户端的,它的请求已经收到了一部分,而且没有被服务器拒绝。SC_SWITCHING_PROTOCOLS: 101,表示服务器正在根据客户端的请求切换协议。
2xx: Success - 成功状态码
SC_OK: 200,表示请求已成功被服务器处理。SC_CREATED: 201,表示请求已经被成功处理,并且创建了一个新的资源。SC_ACCEPTED: 202,表示请求已经被接受处理,但是处理尚未完成。SC_NON_AUTHORITATIVE_INFORMATION: 203,表示服务器是一个转换代理服务器,它返回的内容可能来自另一个源。SC_NO_CONTENT: 204,表示服务器成功处理了请求,但没有返回任何内容。SC_RESET_CONTENT: 205,表示服务器成功处理了请求,并要求客户端重置文档视图。SC_PARTIAL_CONTENT: 206,表示服务器成功处理了部分 GET 请求。
3xx: Redirection - 重定向状态码
SC_MULTIPLE_CHOICES: 300,表示针对请求,服务器可执行多种操作。服务器会提供一个选项列表,用户可以选择其中一个操作。SC_MOVED_PERMANENTLY: 301,表示请求的资源已被永久移动到新位置。SC_MOVED_TEMPORARILY: 302,已过时,被SC_FOUND取代。SC_FOUND: 302,表示请求的资源被临时移动到了另一个位置。SC_SEE_OTHER: 303,表示服务器发送了一个 GET 请求的 URI,客户端应使用 GET 方法访问该 URI。SC_NOT_MODIFIED: 304,表示资源未被修改,客户端可以使用缓存的资源。SC_USE_PROXY: 305,已过时,不再使用。SC_TEMPORARY_REDIRECT: 307,表示请求的资源被临时移动到了另一个位置。
4xx: Client Error - 客户端错误状态码
SC_BAD_REQUEST: 400,表示请求格式错误,服务器无法理解。SC_UNAUTHORIZED: 401,表示请求需要用户身份验证。SC_PAYMENT_REQUIRED: 402,保留给将来使用。SC_FORBIDDEN: 403,表示服务器理解请求,但拒绝执行。SC_NOT_FOUND: 404,表示请求的资源在服务器上不存在。SC_METHOD_NOT_ALLOWED: 405,表示请求的 HTTP 方法不被允许。SC_NOT_ACCEPTABLE: 406,表示服务器无法生成符合客户端要求的响应。SC_PROXY_AUTHENTICATION_REQUIRED: 407,表示客户端必须首先使用代理服务器进行身份验证。SC_REQUEST_TIMEOUT: 408,表示客户端请求超时。SC_CONFLICT: 409,表示请求因为冲突而无法完成。SC_GONE: 410,表示请求的资源不再可用。SC_LENGTH_REQUIRED: 411,表示服务器拒绝处理没有定义Content-Length的请求。SC_PRECONDITION_FAILED: 412,表示请求的先决条件失败。SC_REQUEST_ENTITY_TOO_LARGE: 413,表示请求实体过大,服务器拒绝处理。SC_REQUEST_URI_TOO_LONG: 414,表示请求的 URI 过长,服务器拒绝处理。SC_UNSUPPORTED_MEDIA_TYPE: 415,表示请求的媒体类型不受支持。SC_REQUESTED_RANGE_NOT_SATISFIABLE: 416,表示请求的范围无效或无法满足。SC_EXPECTATION_FAILED: 417,表示服务器无法满足期望请求头字段。
5xx: Server Error - 服务器错误状态码
SC_INTERNAL_SERVER_ERROR: 500,表示服务器遇到了一个意外的情况,阻止它完成请求。SC_NOT_IMPLEMENTED: 501,表示服务器不支持请求的功能。SC_BAD_GATEWAY: 502,表示服务器作为网关或代理,从上游服务器收到了无效的响应。SC_SERVICE_UNAVAILABLE: 503,表示服务器暂时无法处理请求。SC_GATEWAY_TIMEOUT: 504,表示服务器作为网关或代理,没有及时从上游服务器收到响应。SC_HTTP_VERSION_NOT_SUPPORTED: 505,表示服务器不支持请求的 HTTP 版本。
这些状态码用于 HttpServletResponse 接口的方法中,例如 setStatus(int sc) 和 sendError(int sc),以设置响应的状态码,向客户端传达请求处理的结果。
方法
addCookie(Cookie cookie): 添加一个Cookie对象到响应中。containsHeader(String name): 检查响应中是否已存在指定名称的 HTTP 头。encodeURL(String url): 对 URL 进行编码,如果需要的话,会在 URL 中加入会话 ID。encodeRedirectURL(String url): 对重定向 URL 进行编码,如果需要的话,会在 URL 中加入会话 ID。sendError(int sc, String msg): 发送一个错误响应到客户端,包括指定的状态码和错误消息。sendError(int sc): 发送一个错误响应到客户端,只包括指定的状态码。sendRedirect(String location): 发送一个临时重定向响应到客户端,指定新的资源位置。setDateHeader(String name, long date): 设置一个日期头的值。addDateHeader(String name, long date): 添加一个日期头的值。setHeader(String name, String value): 设置一个头的值。addHeader(String name, String value): 添加一个头的值。setIntHeader(String name, int value): 设置一个整型头的值。addIntHeader(String name, int value): 添加一个整型头的值。setStatus(int sc): 设置响应的状态码。getStatus(): 返回响应的状态码。getHeader(String name): 返回指定头的值。getHeaders(String name): 返回一个不可修改的集合,包含指定名称的所有头的值。getHeaderNames(): 返回一个不可修改的集合,包含响应中所有头的名称。setTrailerFields(Supplier<Map<String, String>> supplier): 默认方法,设置一个供应商,它将在响应完成时提供尾部字段。getTrailerFields(): 默认方法,返回一个供应商,它提供了响应的尾部字段。
