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() |