请求对象与响应对象
Tomcat 请求响应
Web 服务器 ** 收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象、和代表响应的response对象request和response对象。即然代表请求和响应,那我们要获取客户机提交过来的数据,只需要找request对象就行了。要向客户机输出数据,只需要找response对象就行了
HttpServletRequest基本功能
HttpServletRequest在 JavaWeb 中非常重要的一个类。它是Servlet的service()方法的参数之一request的功能可以分为以下几种:
- 封装了请求头数据;
封装时,通常需要包含以下关键字段:
- Content-Type: 告知服务器发送的数据类型。
- `application/json`: 发送 JSON 格式数据(最常用)。 - `application/x-www-form-urlencoded`: 传统的表单提交。 - `multipart/form-data`: 用于文件上传。
Authorization: 身份验证凭证。
- 常用格式:
Bearer <token>或Basic <credentials>。- User-Agent: 声明发出请求的终端信息(浏览器版本、系统等),常用于反爬虫绕过。
- Accept: 告知服务器客户端能接收的内容类型(如
application/json,text/plain)。- Custom Headers: 自定义头信息,例如
X-Request-Id用于链路追踪。- 封装了请求正文数据,如果是GET请求,那么就没有正文;
格式类型 对应 Content-Type 应用场景 JSON 对象 application/json 最主流 :前后端分离项目,传输结构化数据。 表单数据 application/x-www-form-urlencoded 传统的 HTML 表单提交,数据格式为 key1=val1&key2=val2 。 多部分表单 multipart/form-data 文件上传 :支持混合传输文本字段和二进制文件。 纯文本/XML text/plain 或 application/xml 特定遗留系统或特殊的 API 配置。 二进制流 application/octet-stream 单个文件的原始二进制传输。 - request是一个域对象,可以把它当成Map来添加获取数据; 在 Web 架构中,
request对象不仅承载了客户端发来的数据(如参数、头信息),它还是一个临时容器,允许开发者在同一个请求的处理链条中(比如从 Filter 到 Servlet,再到 JSP/模板引擎)共享数据。 - 做请求的转发(一次请求一次数据)·(重定向(两次请求,两次数据))
request获取请求头数据
所有的请求数据都是由 Tomcat 底层自动解析并封装到 request 对象中的。我们在 Servlet 的 service()(或 doGet/doPost)方法中可以直接调用 API 获取。
获取请求头数据 (Headers)
| 方法名 | 返回值类型 | 功能描述 |
|---|---|---|
| getHeader(String name) | String | 获取指定名称的请求头的值。 |
| getHeaderNames() | Enumeration | 获取所有请求头名称的枚举集合。 |
遍历所有请求头
response.setContentType("text/html;charset=utf-8");
Enumeration<String> names = request.getHeaderNames();
while(names.hasMoreElements()) {
String name = names.nextElement();
String value = request.getHeader(name);
// 控制台输出
System.out.println(name + ": " + value);
// 响应给浏览器
response.getWriter().println(name + ": " + value + "<br/>");
}
请求正文与基础信息
| 方法名 | 功能描述 | 核心注意点 / 重点 |
|---|---|---|
| getMethod() | 返回请求方法 | 常用于判断是 GET 、 POST 、 PUT 等。 |
| getContentLength() | 获取请求正文的字节数 | GET 请求没有正文,固定返回 -1 。 |
| getContentType() | 获取请求正文的数据类型 | GET 请求返回 null ;POST 默认为 application/x-www-form-urlencoded 。 |
| getCharacterEncoding() | 获取请求体编码 | 若未设置,默认返回 null(底层视为 ISO-8859-1 )。 |
| setCharacterEncoding(String) | 设置请求体编码 (如 “UTF-8”) | 只对 POST 请求的正文有效!不能用于解决 GET 请求的 URL 乱码! |
| getLocale() | 返回客户端支持的语言环境 | java.util.Locale 对象,常用于网站的 国际化/多语言 适配。 |
URL 与路径解析剖析
| 方法名 | 解析对象 | 此例中的返回值 |
|---|---|---|
| getScheme() | 协议 | http |
| getServerName() | 主机名 | localhost |
| getServerPort() | 端口号 | 8080 |
| getContextPath() | 上下文路径 | /hello |
| getServletPath() | Servlet路径 | /oneServlet |
| getRequestURI() | URI 路径 | /hello/oneServlet |
| getRequestURL() | URL 路径 | http://localhost:8080/hello/oneServlet |
| getQueryString() | URL 参数 | name=zhangSan |
客户端网络与连接信息
| 方法名 | 功能描述 | 备注说明 |
|---|---|---|
| getRemoteAddr() | 返回客户端的 IP 地址 | 最常用,用于记录访问者 IP 或限制 IP 访问。 |
| getRemoteHost() | 返回客户端的主机名 | 底层实现通常仍是返回 IP 地址。 |
| getRemotePort() | 返回客户端的端口号 | 浏览器每次发起请求时,由操作系统 随机分配 的临时端口。 |
HttpServletRequest (请求对象)
请求参数的传递与获取
无论前端是通过 GET(地址栏拼接、超链接、GET表单)还是 POST(POST表单)传递参数,后端获取参数的核心 API 是完全一致的。
参数获取核心方法大全
| 方法名 | 返回类型 | 适用场景 / 描述 |
|---|---|---|
| getParameter(String name) | String | 最常用(单值) :获取如文本框、单选按钮、隐藏域的值。 |
| getParameterValues(String name) | String[] | 多值接收 :获取如复选框(同名 checkbox )的多个值。 |
| getParameterNames() | Enumeration | 遍历参数名 :获取请求中所有参数的名称集合。 |
| getParameterMap() | Map |
全量获取 :将所有参数名作为 Key,对应的参数值数组作为 Value 封装为 Map。 |
实操提醒:若指定的参数名不存在,
getParameter会返回null;若参数存在但没填值,会返回空字符串""。使用前务必做好判空处理。
请求参数中文乱码解决方案
由于前后端编码不一致(通常 Tomcat 默认用 ISO-8859-1,而页面用 UTF-8),极易产生中文乱码。GET 和 POST 的处理机制完全不同。
| 请求类型 | 乱码原因 | 解决方案与代码示例 | 核心注意点 |
|---|---|---|---|
| POST | 请求正文(Body)编码默认不是 UTF-8 | request.setCharacterEncoding("UTF-8"); String name = request.getParameter("name"); | 必须 在所有 getParameter 方法调用 之前 设置,否则无效! |
| GET | 参数挂在 URL 上,不受 Body 编码控制 | 方案一(手动转码) : new String(name.getBytes("ISO-8859-1"), "UTF-8"); 方案二(改配置) :修改 Tomcat 的 server.xml ,在 |
避坑指南 :Tomcat 8.5 及以上版本默认已支持 URL 传递 UTF-8 中文,无需额外配置 |
请求转发 (Forward) 与 Request 作用域
Request 不仅能获取数据,还能作为一个临时数据容器(域对象)在服务器内部传递数据。
- Request 作用域:生命周期极短,仅在“一次请求和响应”范围内有效。
-
请求转发(服务器端跳转):Servlet 处理完业务后,带着 Request 域中的数据,直接跳转到另一个 JSP 或 Servlet 进行渲染。
- 特征:地址栏不会改变。
- 核心 API:
java // 1. 往域中存数据 request.setAttribute("name", "txjava"); // 2. 执行转发 (注意路径以 / 开头) request.getRequestDispatcher("/success.jsp").forward(request, response);
HttpServletResponse (响应对象)
response 用于封装服务器的处理结果,并将其发送回客户端浏览器。它的核心功能分为四大
类 **
:设置状态码、设置响应头、输出响应正文、重定向。
核心 API 功能速查表
| 功能分类 | 核心方法 | 代码示例与说明 |
|---|---|---|
| 状态控制 | setStatus(int sc) | response.setStatus(200); 设置正常响应状态码。 |
| 错误跳转 | sendError(int sc, String msg) | response.sendError(404, "资源飞到了外太空"); 触发 Tomcat 默认错误页。 |
| 响应头设置 | setHeader(String name, String value) | response.setHeader("Refresh", "5; URL=http://baidu.com"); 5秒后定时刷新跳转 。 |
| 类型与编码 | setContentType(String type) | response.setContentType("text/html;charset=utf-8"); 最常用 :同时设置响应格式和解决输出乱码。 |
响应输出中文乱码处理
往浏览器输出中文字符串前,必须且仅需执行以下两步(或者直接使用 setContentType 简写):
// 告诉浏览器用 UTF-8 解析,并设置字符流的编码为 UTF-8
response.setContentType("text/html;charset=utf-8");
response.getWriter().write("张三的测试");
请求重定向 (Redirect)
重定向是让浏览器自己“换个地址重新访问”。
- 工作原理:服务器向浏览器发送 302 状态码和新的 URL,浏览器立刻发起第二次全新请求。
-
特征:
- 浏览器的地址栏会发生改变。
- 可以跳转到当前项目外的网址(如直接跳到百度)。
- 核心痛点:因为是两次不同的请求,所以上一次 Request 域中的数据(通过 setAttribute 存的)会全部丢失! - 核心 API:
java
response.sendRedirect("/param_demo/success.html");