Servlet 相关笔记整理
一、Servlet 基础概念
- Servlet 本质:Java 语言的服务端程序,用于接收和处理客户端请求
- 线程安全:不保证线程安全
- 实例特性:单例模式(一个 Servlet 类只有一个实例)
二、Servlet 生命周期
- 实例化时机
- 默认(
loadOnStartup = -1):第一次被访问时实例化 - 配置正整数(如
loadOnStartup = 8):项目启动时实例化,数值越小优先级越高
- 默认(
- 生命周期流程
- 实例化(调用构造方法)
- 执行
init()方法 - 执行
service()及doGet()/doPost()处理请求 - 服务器关闭时执行
destroy()方法
三、核心对象与操作
1. HttpServletRequest(请求对象)
- 获取请求参数:
request.getParameter("参数名")(无参数时返回 null) - 获取请求头:
request.getHeader("头名称") - 获取 Cookie:
request.getCookies() - 域对象操作:
request.setAttribute("key", value)/request.getAttribute("key") - 请求转发:
request.getRequestDispatcher("/路径").forward(req, resp)
2. HttpServletResponse(响应对象)
- 设置响应内容:
resp.getWriter().write("内容") - 设置编码:
resp.setCharacterEncoding("UTF-8") - 设置内容类型:
resp.setContentType("text/html;charset=UTF-8") - 添加 Cookie:
resp.addCookie(cookie) - 重定向:
resp.sendRedirect("URL")
3. HttpSession(会话对象)
- 获取方式:
request.getSession() - 作用:保持会话状态(解决 HTTP 无状态问题)
- 操作方法:
session.setAttribute("key", value)/session.getAttribute("key") - 生命周期:从会话开始到主动退出或超时(默认 30 分钟无操作)
- 实现原理:基于 SessionID 的 Cookie 机制
4. ServletContext(应用上下文对象)
- 获取方式:
request.getServletContext()或session.getServletContext() - 作用域:整个 Web 应用,所有用户共享
四、请求转发与重定向区别
| 特性 | 请求转发(forward) | 重定向(redirect) |
|---|---|---|
| 请求次数 | 1 次 | 2 次 |
| 地址栏 | 不变 | 显示新地址 |
| 数据传递 | 可通过 request 域对象传递 | 不可直接传递(需用 Session 等) |
| 访问范围 | 仅限当前项目内 | 可访问外部资源 |
| 实现方式 | request.getRequestDispatcher().forward() | response.sendRedirect() |
五、Servlet 配置方式
- 注解配置:
@WebServlet(urlPatterns = "/路径", loadOnStartup = 优先级)- 示例:
@WebServlet(urlPatterns = "/easye", loadOnStartup = 12)
- 示例:
- 路径配置:直接指定路径
@WebServlet("/easyc")
六、Cookie 操作
- 创建 Cookie:
Cookie cookie = new Cookie("键", "值") - 发送 Cookie 到客户端:
response.addCookie(cookie) - 获取客户端 Cookie:
request.getCookies()
七、常用方法总结
| 场景 | 方法示例 |
|---|---|
| 处理 GET 请求 | protected void doGet(...) |
| 处理 POST 请求 | protected void doPost(...) |
| 初始化 Servlet | public void init() |
| 销毁 Servlet | public void destroy() |
| 通用服务方法 | protected void service(...) |
| 获取会话对象 | HttpSession session = request.getSession() |
| 设置响应字符流 | PrintWriter out = response.getWriter() |
