一、Request介绍
在计算机网络中,"Request"(请求)通常指的是客户端向服务器发送的请求消息,用于获取特定资源或执行特定操作。在Web开发中,"Request"通常指的是HTTP请求,用于客户端与服务器之间的通信。
1、以下是HTTP请求的一般结构:
1、请求行:包括请求方法(GET、POST、PUT、DELETE等)、请求的URL路径和协议版本。
2、请求头部:包括关于请求的附加信息,如Host(主机名)、User-Agent(用户代理,浏览器信息)、Accept(可接受的内容类型)、Cookie等。
3、请求体:对于POST请求,请求体中包含了向服务器提交的数据,比如表单数据、JSON数据等。GET请求通常不包含请求体。
2、 常见的HTTP请求方法有:
GET:用于请求获取特定资源的信息。
POST:用于向服务器提交数据。
PUT:用于更新或创建资源。
DELETE:用于删除指定的资源。
在Web开发中,服务器接收到请求后会根据请求中的信息进行处理,并返回相应的响应(Response)给客户端。请求和响应是Web开发中基本的通信方式,通过请求和响应可以实现网页的动态加载、数据的传输等功能。
总之,"Request"是指客户端向服务器发送的请求消息,其中包含了客户端想要执行的操作以及相关的信息,用于与服务器进行通信和交互。
3、Request对象继承体系结构
二、Request常用方法
1、请求对象常用方法-获取请求行及各种路径
返回值
方法名
说明
String
getMethod()
获得请求方式
String
getContextPath()
获取虚拟目录名称
String
getServletPath()
获取Servlet映射路径
String
getRemoteAddr()
获取访问者ip地址
String
getRequestURI()
获取统一资源标识符
StringBuffer
getRequestURL()
获取统一资源定位符
String
getProtocol()
获取协议及版本
2、代码实现方法
package com;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;/*** @author 86136*/
@WebServlet("/aa")
public class MyWeb01 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doPost(req,resp);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//获取请求方式String method = req.getMethod();System.out.println("method = " + method);//method = POST//获取虚拟目录名称String contextPath = req.getContextPath();System.out.println("contextPath = " + contextPath); //contextPath = (这里什么都没有是因为我没有设置虚拟目录名称)//获取Servlet映射目录String servletPath = req.getServletPath();System.out.println("servletPath = " + servletPath);//servletPath = /aa//获取访问者ip地址String remoteAddr = req.getRemoteAddr();System.out.println("remoteAddr = " + remoteAddr);//remoteAddr = 127.0.0.1//获取统一资源标识符String requestURI = req.getRequestURI();System.out.println("requestURI = " + requestURI);//requestURI = /aa//获取统一资源定位符StringBuffer requestURL = req.getRequestURL();System.out.println("requestURL = " + requestURL);//requestURL = http://localhost:8080/aa//获取协议及版本String protocol = req.getProtocol();System.out.println("protocol = " + protocol);//protocol = HTTP/1.1}
}
3、获取请求头信息
返回值
方法名
说明
String
getHeader(String name)
根据请求头名称获取一个值
Enumeration<String>
getHeaderNames()
获取所有请求头名称
4、代码实现
package com;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Enumeration;
/*** @author 86136*/
@WebServlet("/aa")
public class MyWeb01 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doPost(req,resp);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//获取请求头信息//根据请求头名称获取一个值String host = req.getHeader("Host");System.out.println("host = " + host);//host = localhost:8080//获取所有请求头名称Enumeration<String> headerNames = req.getHeaderNames();//headerNames = org.apache.tomcat.util.http.NamesEnumerator@727fdf5cSystem.out.println("headerNames = " + headerNames);//遍历while (headerNames.hasMoreElements()){//得到当前遍历出来的请求头名称String name = headerNames.nextElement();//根据名称获取请求头的值String value = req.getHeader(name);System.out.println(name + "== " + value);}}
}
5、获取请求参数信息
返回值
方法名
说明
String
getParameter(String name)
根据名称获取数据
String[]
getParameterValues(String name)
根据名称获取所有数据
Enumeration<String>
getParameterNames()
获取所有名称
Map<String,String[]>
getParameterMap()
获取所有参数的键值对
6、代码实现
package com;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Arrays;
import java.util.Enumeration;
import java.util.Map;
import java.util.Set;/*** @author 86136*/
@WebServlet("/aa")
public class MyWeb01 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doPost(req,resp);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//中文乱码req.setCharacterEncoding("utf-8");//获取请求参数信息//根据名称获取数据String name = req.getParameter("name");System.out.println("name = " + name);//name = 九亿少女梦//根据名称获取所有数据String[] yxs = req.getParameterValues("yx");System.out.println("yxs = " + yxs);//获取所有名称Enumeration<String> parameterNames = req.getParameterNames();//遍历while (parameterNames.hasMoreElements()){//得到当前遍历出来的参数名String s = parameterNames.nextElement();System.out.println("s = " + s); //s = name s = pass s = yxString parameter = req.getParameter(s);System.out.println("parameter = " + parameter); //parameter = 九亿少女梦 parameter = 1314520 parameter = 打游戏}//获取所有参数的键值对(map集合)Map<String, String[]> parameterMap = req.getParameterMap();Set<String> strings = parameterMap.keySet();for (String names : strings) {//获取键值对String[] values = parameterMap.get(names);System.out.println(names);System.out.println("values = " + Arrays.toString(values));}}
}
7、中文乱码问题
1、get方式
没有乱码问题,再Tomcat8.5版本后已经解决
2、post方式
有乱码问题,再获取参数前,设置request的编码req.setCharacterEncoding("utf-8")
三、Request转发
1、请求转发
1、请求转发:一种在服务器内部的资源跳转方式, 客户端的一次请求到达后,发现需要借助其他 Servlet 来实现功能。
2、请求转发函数
返回值
方法名
说明
RequestDispatcher
getRequestDispatcher(String name)
获取请求调度对象
返回值
方法名
说明
void
forward(ServletRequest req,ServletResponse resp)
实现转发
3、代码实现
package com;import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Arrays;
import java.util.Enumeration;
import java.util.Map;
import java.util.Set;/*** @author 86136*/
@WebServlet("/bb")
public class MyWeb02 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doPost(req,resp);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//中文乱码req.setCharacterEncoding("utf-8");//第一种方式//RequestDispatcher dispatcher = req.getRequestDispatcher("/aa");//dispatcher.forward(req,resp);//第二种req.getRequestDispatcher("/aa").forward(req,resp);}
}
package com;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Arrays;
import java.util.Enumeration;
import java.util.Map;
import java.util.Set;/*** @author 86136*/
@WebServlet("/aa")
public class MyWeb01 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doPost(req,resp);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//中文乱码req.setCharacterEncoding("utf-8");System.out.println("喜欢你");}
}
我访问http://localhost:8080/bb 跳转到 http://localhost:8080/aa浏览器还是显示的/bb却执行了/aa下面的
四、Request数据共享
1、共享数据
1、域对象:
一个有作用范围的对象,可以在范围内共享数据
request域:代表一次请求的范围,一般用于请求转发的多个资源中共享数据
2、方法:
1. void setAttribute(String name,Object obj):存储数据
2. Object getAttitude(String name):通过键获取值
3. void removeAttribute(String name):通过键移除键值对
3、代码实现
//往request中存数据 req.setAttribute("name","hello"); //从request中根据key获取数据 Object name = req.getAttribute("name"); System.out.println("name = " + name); //从request中根据key生成数据 req.removeAttribute("name");