一、Servlet和请求、响应体系

java
HttpServletRequest extends ServletRequest
HttpServletResponse extends ServletResponse
HttpServlet extends GenericServlet implements Serializable
public abstract class GenericServlet implements Servlet, ServletConfig, Serializable

Servlet:顶层生命周期接口,协议无关;
HttpServlet 是它的 HTTP 实现类。
ServletRequest/ServletResponse:通用父接口,只有基础参数和输出流。
HttpServletRequest/HttpServletResponse:子接口,适配 HTTP;
·转发属于 Request,重定向属于 Response
二、定义
- Servlet(接口)
javax.servlet.Servlet
✅作用:JavaWeb 组件顶层规范,和 HTTP 协议无关
定义生命周期 5 个方法:
init()、service()、destroy()、getServletConfig()、getServletInfo()
service 方法参数:ServletRequest,ServletResponse(通用对象)
没有 GET/POST 自动分发逻辑
一般不直接实现 - HttpServet(拓展回顾)
继承 GenericServlet,专门适配 HTTP;
重写 service 方法,把 ServletRequest 强转为 HttpServletRequest,自动区分 GET/POST,调用 doGet/doPost。 - ServletRequest(父接口)
通用请求对象,协议无关
提供基础能力:
获取请求参数 getParameter()
请求域 setAttribute() / getAttribute()
设置请求编码、获取输入流
❌没有:请求方式、URI、Session、Cookie、请求头等 HTTP 专属方法 - HttpServletRequest(ServletRequest 子接口)
专为 HTTP 协议拓展
在父接口基础上新增 HTTP 特有功能:
getMethod() 获取 GET/POST
getRequestURI()、getContextPath()
getSession() 获取会话
getCookies() 获取 Cookie
getRequestDispatcher().forward() 请求转发 - ServletResponse(父接口)
通用响应对象,协议无关
基础能力:
设置编码
获取打印输出流 getWriter()
❌没有:状态码、响应头、Cookie、重定向 - HttpServletResponse(ServletResponse 子接口)
HTTP 协议专属响应对象
拓展功能:
setStatus() 设置响应状态码
setHeader() 设置响应头
addCookie()
sendRedirect() 重定向
总结:
Servlet:顶层生命周期接口,协议无关;HttpServlet 是它的 HTTP 实现类。
ServletRequest/ServletResponse:通用父接口,只有基础参数和输出流。
HttpServletRequest/HttpServletResponse:子接口,适配 HTTP;
转发属于 Request,重定向属于 Response。
扩展:
- ServletRequest 和 HttpServletRequest 区别
HttpServletRequest 是 ServletRequest 的子接口。
ServletRequest 是通用规范,可以支持任意通信协议;
HttpServletRequest 针对 HTTP 扩展了浏览器相关 API。
在 HttpServlet 中使用时,可以向下转型。 - forward 和 sendRedirect 归属
请求转发 forward() → HttpServletRequest
重定向 sendRedirect() → HttpServletResponse - 转发与重定向关键区别
转发:一次请求,地址栏不变,共享 request 域数据
重定向:两次请求,地址栏改变,request 域数据丢失