目录
HttpServletRequest 简介
HttpServletRequest 是什么?
HttpServletRequest 是一个接口,其父接口是 ServletRequest
HttpServletRequest 是Tomcat 将请求报文,封装而来的一个对象,在 Tomcat 调用 service 方法时传入。
HttpServletRequest 代表客户端发来的请求,请求中的所有信息,都可以通过该对象来获得
HttpServletRequest 常见的 API
关于请求行的相关 API
关于请求头的相关 API
关于请求参数的相关 API
其他 API
代码示例:
请求行
package com.zzz.servlet;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
/*
* @author zzr
* @date: 2025/07/06 16:47
* @description: 测试 HttpServletRequest
*/
@WebServlet("/servlet8")
public class servlet8 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 行相关 GET/POST url http/1.1
System.out.println(req.getMethod()); // 获取请求方式
System.out.println(req.getScheme()); // 获取请求协议
System.out.println(req.getProtocol()); // 获取请求协议及其版本号
System.out.println(req.getRequestURI()); // 获取请求的 uri ==》 项目内的资源路径
System.out.println(req.getRequestURL()); // 获取请求 url ==》 项目内资源的完整的路径
System.out.println(req.getLocalPort()); // 本应用容器的端口号
System.out.println(req.getServerPort()); // 客户端发请求用的端口号
System.out.println(req.getRemotePort()); // 客户端软件的端口号
}
}
这里补充讲解一下 uri 和 url 的区别
URI:称为统一资源标识符 interface URI{ } 资源定位的要求和规范
URL:称为统一资源定位符 class URL implements URI{ } 一个具体的资源路径
再补充解释一下端口号的问题~
本应用容器的端口号,如果未手动设置,则为 Tomcat 的默认端口号 8080
客户端发送请求时使用的端口号,可能不是 8080,因为可能,客户端发送请求给 Tomcat 的时候,中间隔了一层代理
请求头
package com.zzz.servlet;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Enumeration;
/*
* @author zzr
* @date: 2025/07/06 16:47
* @description: 测试 HttpServletRequest
*/
@WebServlet("/servlet8")
public class servlet8 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 行相关 GET/POST url http/1.1
System.out.println(req.getMethod()); // 获取请求方式
System.out.println(req.getScheme()); // 获取请求协议
System.out.println(req.getProtocol()); // 获取请求协议及其版本号
System.out.println(req.getRequestURI()); // 获取请求的 uri ==》 项目内的资源路径
System.out.println(req.getRequestURL()); // 获取请求 url ==》 项目内资源的完整的路径
System.out.println(req.getLocalPort()); // 本应用容器的端口号
System.out.println(req.getServerPort()); // 客户端发请求用的端口号
System.out.println(req.getRemotePort()); // 客户端软件的端口号
// 头相关 key:value key:value
// 可以根据名字,来单独获取某个请求头
String accept = req.getHeader("Accept");
System.out.println("Accept" + accept);
// 也可以先获取本次请求中的所有请求头的名字
Enumeration<String> headerNames = req.getHeaderNames();
while (headerNames.hasMoreElements()) {
String hname = headerNames.nextElement();
System.out.println(hname + ":" + req.getHeader(hname));
}
}
}
请求参数
获取键值对形式的数据
先准备一个前端页面的表单:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form method = "get" action = "servlet9">
<input type = "text" name = "username"> <br />
<input type = "password" name = "userPwd"> <br />
<input type = "checkbox" name = "hobby" value = "1"> 篮球
<input type = "checkbox" name = "hobby" value = "2"> 排球
<input type = "checkbox" name = "hobby" value = "3"> 足球
<input type = "checkbox" name = "hobby" value = "4"> 游泳
<br />
<input type = "submit">
</form>
</body>
</html>
package com.zzz.servlet;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Arrays;
import java.util.Enumeration;
import java.util.Map;
import java.util.Set;
/*
* @author zzr
* @date: 2025/07/06 17:15
* @description: 测试 HttpServletRequest 的请求参数 API
*/
@WebServlet("/servlet9")
public class servlet9 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 获取键值对的参数
// 根据参数名获取单个参数值
String username = req.getParameter("username");
System.out.println(username);
String userPwd = req.getParameter("userPwd");
System.out.println(userPwd);
// 根据参数名获取多个参数值
String[] hobbies = req.getParameterValues("hobby");
System.out.println(Arrays.toString(hobbies));
// 先获取所有参数名,再分别打印
// 法 1:
Enumeration<String> parameterNames = req.getParameterNames();
while (parameterNames.hasMoreElements()) {
String pname = parameterNames.nextElement();
// 先假设每个参数名都有多个参数值
String[] parameterValues = req.getParameterValues(pname);
if (parameterValues.length > 1) {
System.out.println(pname + ":" + Arrays.toString(parameterValues));
} else {
System.out.println(pname + ":" + parameterValues[0]);
}
}
// 法 2:返回所有参数的 map 集合 key = 参数名 value = 参数值
Map<String, String[]> parameterMap = req.getParameterMap();
Set<Map.Entry<String, String[]>> entries = parameterMap.entrySet();
for (Map.Entry<String, String[]> entry : entries) {
String pname = entry.getKey();
String[] value = entry.getValue();
if (value.length > 1) {
System.out.println(pname + "=" + Arrays.toString(value));
} else {
System.out.println(pname + "=" + value[0]);
}
}
}
}
如果表单的提交方式改为 post,也是可以正常获取请求参数的。
以上 API 专门用于获取 key = value 形式的参数,无论这些参数是在 url 后,还是在请求体中(注意,这里仅仅提到的是,键值对的存放位置,但并未说是 get / post 方法)~
form 表单标签提交 get 请求的时候,参数是以键值对的形式,放在 url 后,不放在请求体中。但是! GET 方法的请求也是可以有请求体的!
获得请求体中的非键值对数据
// 获取一个从请求体中读取字符的字符输入流
BufferedReader reader = req.getReader(); // 读取 JSON 串
// 获取一个从请求体中读取二进制数据字节的输入流
ServletInputStream inputStream = req.getInputStream(); // 读取文件
HttpServletResponse 简介
HttpServletResponse 是什么?
HttpServletResponse 是一个接口,其父接口是 ServletResponse
HttpServletResponse 是 Tomcat 预先创建的,在 Tomcat 调用 service 方法时候传入
HttpServletResponse 代表服务端对客户端的响应,该对象会被转换成响应的报文,发送给客户端,通过该对象,我们可以设置响应的信息
HttpServletResponse 的常见 API
设置响应行相关
设置响应头相关
设置响应体相关
其他 API
代码示例
package com.zzz.servlet;
import jakarta.servlet.ServletException;
import jakarta.servlet.ServletOutputStream;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;
/*
* @author zzr
* @date: 2025/07/06 18:00
* @description: HttpServletResponse 测试
*/
@WebServlet("/servlet10")
public class Servlet10 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 设置相应行相关的 API
resp.setStatus(404);
// 设置响应头的相关 API
String info = "<h1>hello world</h1>";
resp.setHeader("aaa","value"); // 如果 s 不是常规的响应头,就会在响应头中给我们创建一个这样的键值对
resp.setHeader("Content-Type","text/html");
resp.setContentType("text/html");
resp.setHeader("Content-Length","1234");
resp.setContentLength(info.getBytes().length);
// 设置响应体内容的 API
// 获得一个向响应体中输入文本字符输出类流
PrintWriter writer = resp.getWriter();
writer.write(info);
// 获得一个向响应体中,输入二进制信息的字节输出流
ServletOutputStream outputStream = resp.getOutputStream();
}
}