HttpServletRequest 与 HttpServletResponse 详解和操作
·
一、整体原理图解(先看懂流程)
1. 浏览器与服务器交互全过程
核心结论:
- 浏览器发请求 → Tomcat 自动创建 HttpServletRequest
- 服务器回响应 → Tomcat 自动创建 HttpServletResponse
- 两个对象由 Tomcat 创建,直接在 Servlet 中使用即可
二、HttpServletRequest 请求对象 详解
1. 作用
封装浏览器发送的所有 HTTP 请求报文:请求行、请求头、请求体、请求参数。
2. HTTP 请求报文结构
- 请求行:请求方式、URL、协议版本
- 请求头:浏览器信息、Cookie、编码、缓存
- 请求体:POST 提交的表单参数
3. 分类操作步骤 + 代码
① 获取请求行信息
java
运行
//1. 获取请求方式 GET/POST
String method = request.getMethod();
//2. 获取完整URL
StringBuffer url = request.getRequestURL();
//3. 获取URI(项目内资源路径)
String uri = request.getRequestURI();
//4. 获取项目部署路径
String path = request.getContextPath();
//5. 获取客户端IP
String ip = request.getRemoteAddr();
② 获取请求头信息
java
运行
//根据头名称获取
String agent = request.getHeader("User-Agent");
③ 获取请求参数(重点)
- 单个参数:
getParameter("参数名") - 多选参数(复选框):
getParameterValues("参数名") - 批量参数:
getParameterMap()
java
运行
//获取单个参数
String name = request.getParameter("username");
//获取数组参数
String[] hobbys = request.getParameterValues("hobby");
④ 解决请求中文乱码
- POST 请求(必写)
java
运行
//设置请求体编码为UTF-8
request.setCharacterEncoding("UTF-8");
- GET 请求:Tomcat
server.xml配置
xml
<Connector port="8080" URIEncoding="UTF-8"/>
⑤ 请求域 & 请求转发
- 请求域:一次请求内共享数据
java
运行
//存
request.setAttribute("key",obj);
//取
Object obj = request.getAttribute("key");
//删
request.removeAttribute("key");
- 请求转发(服务器内部跳转)
java
运行
//转发到目标资源,地址栏不变
request.getRequestDispatcher("/targetServlet").forward(request,response);
4. 转发特点图解
- 一次请求、地址栏不变、共享 request 数据、只能访问本项目资源
三、HttpServletResponse 响应对象 详解
1. 作用
封装服务器要返回给浏览器的响应报文:状态码、响应头、响应体。
2. HTTP 响应报文结构
- 响应行:状态码 200/302/404/500
- 响应头:内容类型、缓存、Cookie、重定向地址
- 响应体:页面 html、文本、json、文件
3. 分类操作步骤 + 代码
① 设置响应状态码
java
运行
response.setStatus(200); //正常
response.setStatus(302); //重定向
response.setStatus(404); //找不到资源
② 设置响应头
java
运行
//重定向(关键)
response.sendRedirect("/项目路径/资源");
③ 响应输出数据(2 种流)
- 字符流:输出文本、HTML、JSON
java
运行
//解决响应乱码【必须在获取流之前执行】
response.setContentType("text/html;charset=UTF-8");
//获取字符输出流
PrintWriter out = response.getWriter();
out.write("<h1>响应内容</h1>");
- 字节流:输出图片、文件、下载
java
运行
ServletOutputStream os = response.getOutputStream();
④ 响应中文乱码万能固定代码
java
运行
//固定两行,所有Servlet直接复制
response.setContentType("text/html;charset=UTF-8");
response.setCharacterEncoding("UTF-8");
四、高频重难点:转发 VS 重定向
1. 流程图解
- 请求转发 forward
plaintext
浏览器 → Tomcat(ServletA) → Tomcat内部 → ServletB → 响应浏览器
- 重定向 sendRedirect
plaintext
浏览器 → ServletA → 302响应头 → 浏览器再次发起新请求 → ServletB
2. 核心区别表格
表格
| 对比项 | 转发 forward | 重定向 redirect |
|---|---|---|
| 请求次数 | 1 次 | 2 次 |
| 地址栏 | 不变 | 变为目标地址 |
| 数据共享 | 共享 request 域 | 不共享 |
| 跳转范围 | 仅限本项目 | 任意网址 / 外部链接 |
| 代码 | req.getRequestDispatcher().forward() | resp.sendRedirect() |
五、完整实战 Demo(可直接运行)
1. 接收请求参数 + 响应数据
java
运行
@WebServlet("/reqResp")
public class ReqRespServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//===== 1. Request 操作 =====
//解决POST乱码
request.setCharacterEncoding("UTF-8");
//获取参数
String username = request.getParameter("username");
//存域数据
request.setAttribute("msg","请求数据成功");
//===== 2. Response 操作 =====
//解决响应乱码
response.setContentType("text/html;charset=UTF-8");
//输出内容
PrintWriter out = response.getWriter();
out.write("接收用户名:"+username);
//转发/重定向 二选一
//request.getRequestDispatcher("/index.html").forward(request,response);
//response.sendRedirect("/index.html");
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
六、核心总结(背诵版)
- HttpServletRequest
- 负责读:接收浏览器所有请求数据
- 常用:
getParameter()、setCharacterEncoding()、setAttribute()、forward()
- HttpServletResponse
- 负责写:向浏览器输出数据、控制页面跳转
- 常用:
setContentType()、getWriter()、sendRedirect()
- 乱码口诀:
- 请求 POST:
request.setCharacterEncoding("UTF-8") - 响应全局:
response.setContentType("text/html;charset=UTF-8")
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐



所有评论(0)