前言
本章节主要学习HttpServletRequest请求对象、HttpServletResponse响应对象相关方法,收录于JavaWeb基础专栏,该专栏主要学习JavaWeb开发原生框架、Servlet、JSP、请求对象、响应对象、Session会话对象、Filter过滤器、三层开发等知识点,欢迎童鞋们互相交流。觉得不错可以三连订阅喔。
目标
内容
一、概念
在之前的文章中,我们学习了Servlet相关知识点,了解了Servlet运行流程和原理。
当我们需要在Servlet中获取HTTP请求的相关信息时,需要使用HttpServletRequest接口,该接口定义的方法可以获取请求中的信息(请求头信息、请求行信息、请求正文信息)。
每个Servlet在接收到请求后,都会产生对应的请求对象和响应对象,request表示当前请求对象,我们可以使用该对象的方法获取请求中的信息。
二、HttpServletRequest请求
1. 获取请求行信息
以下方法可以获取web客户端发送的请求行信息,包括 URL、协议、请求格式、端口等。
API | 功能解释 |
---|---|
String getMethod() | 获取请求的 HTTP 方法(如 GET、POST)。 |
StringBuffer getRequestURL() | 获取客户端请求的完整 URL。 |
String getRequestURI() | 获取客户端请求的项目目录的具体资源。 |
int getServerPort() | 获取客户端发送请求时使用的服务器端口。 |
int getLocalPort() | 获取应用程序所在容器的端口。 |
int getRemotePort() | 获取客户端程序所使用的端口。 |
String getScheme() | 获取请求的协议(如 HTTP、HTTPS)。 |
String getProtocol() | 获取请求使用的协议及版本号(如 HTTP/1.1)。 |
1.1 代码案例
@WebServlet("/demo")
public class RequestDemo extends HttpServlet{
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//使用request对象,获取本次请求的请求行信息
//本次请求:Get http://localhost:8080/ServletDemo2/demo?id=1 http/1.1
//获取本次请求的请求格式
String method = request.getMethod();
System.out.println("本次请求的请求格式为:" + method);
//本次请求的请求格式为:GET
//获取本次请求的URL
StringBuffer url = request.getRequestURL();
System.out.println("本次请求的请求地址为:" + url);
//本次请求的请求地址为:http://localhost:8080/ServletDemo2/demo
//获取本次请求的URI
String uri = request.getRequestURI();
System.out.println("本次请求的资源地址为:" + uri);
//本次请求的资源地址为:/ServletDemo2/demo
}
}
2. 获取请求头信息
以下方法可以获取web客户端发送的请求头信息。
API | 功能解释 |
---|---|
String getHeader(String headerName) | 根据头名称获取请求头的值。 |
Enumeration getHeaderNames() | 获取所有的请求头名称。 |
String getContentType() | 获取 Content-Type 请求头。 |
2.1 代码案例
@WebServlet("/demo")
public class RequestDemo extends HttpServlet{
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//本次请求:Get http://localhost:8080/ServletDemo2/demo?id=1 http/1.1
//使用request对象,获取本次请求头信息
//获取所有请求头信息
Enumeration<String> names = request.getHeaderNames();
//遍历
while (names.hasMoreElements()) {
String name = names.nextElement();
String value = request.getHeader(name);
System.out.println(name + ": " + value);
}
}
}
2.2 执行效果
3. 获取请求正文信息
以下方法可以获取web客户端发送的请求正文信息,请求正文中包含客户数据。这些数据通常通过 URL、表单提交或查询字符串的形式发送。
API | 功能解释 |
---|---|
String getParameter(String parameterName) | 根据请求参数名获取请求单个参数值。 根据表单中name属性的名,获取value属性值 |
String[] getParameterValues(String parameterName) | 根据请求参数名获取请求多个参数值数组。 获取表单中复选框的数据 |
Enumeration getParameterNames() | 获取所有请求参数名。 获取表单提交的所有name |
Map<String, String[]> getParameterMap() | 获取所有请求参数的键值对集合。 获取表单提交的所有值 |
BufferedReader getReader() throws IOException | 获取读取请求体的字符输入流。(JSON串) |
ServletInputStream getInputStream() throws IOException | 获取读取请求体的字节输入流。(读文件) 以字节流的方式得到表单所有数据 |
int getContentLength() | 获取请求体长度的字节数。 |
3.1 代码案例
@WebServlet("/demo")
public class RequestDemo extends HttpServlet{
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//本次请求:Get http://localhost:8080/ServletDemo2/demo?id=1&username='123' http/1.1
//使用request对象,获取本次请求的请求正文信息
//获取请求正文中的数据,通过key获取value
String id = request.getParameter("id");
System.out.println("本次请求正文中的id值为:" + id);
//本次请求正文中的id值为:1
//获取表单中的数据,通过name属性名获取name属性值
String username = request.getParameter("username");
System.out.println("本次请求表单中username值为:" + username);
//本次请求表单中username值为:123
//获取表单中的多选框数据
String[] hobbies = req.getParameterValues("hobby");
System.out.println(Arrays.toString(hobbies));
//获取所有的参数名
Enumeration<String> pnames = req.getParameterNames();
//遍历
while(pnames.hasMoreElements()){
String pname = pnames.nextElement();
String[] values = req.getParameterValues(pname);
if(values.length > 1){
System.out.println(Arrays.toString(values));
}else System.out.println(pname + " = " + values[0]);
}
}
}
4. 请求转发
请求转发是指将一个HTTP请求从一个Servlet转发到另一个Servlet或其他web资源的过程。它允许在Web应用程序中的不同web资源之间共享请求和响应对象。
API | 功能解释 |
---|---|
getRequestDispatche(String path) | 该方法返回一个RequestDispatcher对象,调用这个对象的forward方法可以实现请求转发,将本次请求转发到其他web资源中。 |
request.getRequestDispatcher("/Servlet/demo").forward(request, response); | 请求转发 |
request.getRequestDispatcher("/Servlet/demo").include(request, response); | 请求包含 |
4.1 请求转发与重定向
蓝色为请求转发: 客户端只发送一次请求,业务逻辑由一个或多个Servlet处理
红色为重定向: 客户端发送两次请求,第一次请求Servlet未果,Servlet响应客户端重定向一个连接地址,客户端再次请求该连接地址,得到处理结果。
5. 作用域
request对象也叫“请求域”对象,web客户端发送请求时,创建请求对象开启请求域,请求域的生命周期只在一次请求内有效, 一次请求结束之后请求域就销毁了。
5.1 生命周期
创建:客户端向服务器发送一次请求,服务器就会创建request对象
销毁:服务器对这次请求作出响应后就会销毁request对象
有效:仅在当前请求中有效,如果web资源之间需要共享同一个请求中的数据,只能使用请求转发
5.2 常用方法
API | 功能解释 |
---|---|
request.getAttribute(String name); | 获取名字为name的属性值 |
request.setAttribute(String name,Object object); | 在请求中保存名称为name的属性 |
request.removeAttribute(String name); | 清除请求中名字为name的属性 |
request.getParameter(String name); | 返回指定请求参数的值 |
5.3 代码案例
//在 ServeltA 中向请求域中存储数据
@WebServlet("/a")
public class ServletA extends HttpServlet{
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException,ServletException{
// 获取用户数据
String username = request.getParameter("username");
// 存入request请求域中
request.setAttribute("username", username);
//将请求转发至ServletB
request.getRequestDispatcher("/b").forward(request, response);
}
}
//在 SevletB 取出请求域中存储的数据
@WebServlet("/b")
public class ServletB extends HttpServlet{
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException,ServletException{
// 从request域中取出数据
String username = request.getAttribute("username");
// 输出
System.out.println(username);
}
}
标签:HttpServletRequest,username,请求,request,就够,name,获取,详解,String
From: https://blog.csdn.net/weixin_55584739/article/details/145000451