本文总结自,B站-遇见狂神说
代表客户端的请求,用户通过Http协议访问服务器,HTTP请求中的所有信息会被封装到HttpServletRequest,通过这个HttpServletRequest方法,获取客户端的信息。
1. 常用方法
获取请求行数据
获取 | 方法 |
---|---|
请求方式:get | String getMethod() |
虚拟目录:/day12 | String getContextPath() |
Servlet路径:/demo1 | String getServletPath() |
get方式请求参数:name=zhangsan | String getQueryString() |
请求URL:http://localhost/day14/demo1 | StringBuffer getRequestURL() |
协议及版本:HTTP/1.1 | String getProtocol() |
客户机的IP地址:0:0:0:0:0:0:0:1 (ipv6地址) | String getRemoteAddr() |
获取请求消息数据
- 通过请求头的名称获取请求头的值【重点】
String getHeader(String name)
- 获取所有的请求头名称
Enumeration<String> getHeaderNames()
代码
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//演示获取请求头数据
//1.获取所有请求头名称
Enumeration<String> headerNames = request.getHeaderNames();
//2.遍历
while(headerNames.hasMoreElements()){
String name = headerNames.nextElement();
//根据名称获取请求头的值
String value = request.getHeader(name);
System.out.println(name+"---"+value);
}
}
结果:
host---localhost:8080
connection---keep-alive
upgrade-insecure-requests---1
user-agent---Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36
accept---text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
sec-fetch-site---none
sec-fetch-mode---navigate
accept-encoding---gzip, deflate, br
accept-language---zh-CN,zh;q=0.9
cookie---JSESSIONID=3EE93198598AA8F1AD69EB36BD30EAAA; Idea-7cd18826=9b14ca0c-a678-40b9-a3e6-7aa1355f37d9
获取请求体数据
只有POST请求方式,才有请求体,封装了POST请求的请求参数。获取去流对象,在从中拿到数据
- 获取字符输入流,只能操作字符数据
BufferedReader getReader()
- 获取字节输入流,可以操作所有类型数据
ServletInputStream getInputStream()
代码
regist.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>注册页面</title>
</head>
<body>
<!--必需的 action 属性规定当提交表单时,向何处发送表单数据。-->
<form action="/07_Request_Respons/requestDemo5" method="post">
<input type="text" placeholder="请输入用户名" name="username"><br>
<input type="text" placeholder="请输入密码" name="password"><br>
<input type="submit" value="注册">
</form>
</body>
</html>
servlet
@WebServlet("/requestDemo5")
public class RequestDemo5 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取请求消息体--请求参数
//1.获取字符流
BufferedReader br = request.getReader();
//2.读取数据
String line = null;
while((line = br.readLine()) != null){
System.out.println(line);
}
}
}
结果:
username=zhangsan&password=12
获取请求参数通用方式
- get和post请求方式都可以使用下列方法来获取请求参数
获取值 | 方法 |
---|---|
根据参数名称获取参数值 | String getParameter(String name) |
根据参数名称获取参数值的数组:【如复选框】 | String[] getParameterValues(String name) |
获取所有请求的参数名称 | Enumeration<String> getParameterNames() |
获取所有参数的map集合 | Map<String,String[]> getParameterMap() |
- 获取所有请求的参数名称
Enumeration<String> parameterNames = request.getParameterNames();
while(parameterNames.hasMoreElements()){
String name = parameterNames.nextElement();
System.out.println(name);
// 获取参数名称对应的值
String[] values = request.getParameterValues(name);
for (String value : values) {
System.out.println(value);
}
}
- 取所有参数的map集合
Map<String, String[]> parameterMap = request.getParameterMap();
//遍历
Set<String> keyset = parameterMap.keySet();
for (String name : keyset) {
//获取键获取值
String[] values = parameterMap.get(name);
System.out.println(name);
for (String value : values) {
System.out.println(value);
}
}
2. 中文乱码
请求方式:
- get:tomcat 8 已经将乱码问题解决了
- post:会乱码
解决方法:
- 在获取请求参数前,设置request的编码
request.setCharacterEncoding("utf-8");
3. 请求转发
一种在服务器内部的资源跳转方式
步骤
- 通过request对象获取请求转发器对象
RequestDispatcher getRequestDispatcher(String path);
- 使用
RequestDispatcher
对象来进行转发
forward(ServletRequest request, ServletResponse response);
简写
request.getRequestDispatcher("/aservlet").forward(request,response);
特点:forward
- 转发地址栏路径不变
- 转发只能访问当前服务器下的资源
- 转发是一次请求,可以使用request对象来共享数据
4. 域对象:共享数据
一个有作用范围的对象,可以在范围内共享数据
request域:只有请求转发才会有此域
代表一次请求的范围,一般用于请求转发的多个资源中共享数据。
- 存储数据
void setAttribute(String name,Object obj)
- 通过键获取值
Object getAttitude(String name)
- 通过键移除键值对
void removeAttribute(String name)
5. 获取ServletContext
ServletContext servletContext = request.getServletContext();
结果:
org.apache.catalina.core.ApplicationContextFacade@33e2b08a
案例: 获取前端传递的参数、请求转发
@Override
protected void doPost(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException {
// 后台接收中文乱码问题
request.setCharacterEncoding("utf-8");
// 发送到前端乱码问题
response.setCharacterEncoding("utf-8");
String name = request.getParameter("name");
String pwd = request.getParameter("pwd");
String[] hobbys = request.getParameterValues("hobbys");
System.out.println("===================");
System.out.println(name);
System.out.println(pwd);
System.out.println(Arrays.toString(hobbys));
System.out.println("===================");
// 请求转发(/代表当前的web应用)
request.getRequestDispatcher("/success.jsp").forward(request, response);
}