request获取请求数据
HTTP请求数据总共分为三部分内容,分别是:请求行、请求头、请求体。对应的获取方法如下:
获取请求行数据
获取请求方式: GET
String getMethod()
获取虚拟目录(项目访问路径): /request-demo
String getContextPath()
获取URL(统 一资源定位符): http://localhost:8080/request-demo/req1
StringBuffer getRequestURL()
获取URI(统一资源标识符): /request-demo/req1
String getRequestURI()
获取请求参数(GET方式): username=zhangsan&password=123
String getQueryString()
获取请求头数据
对于请求头的数据,格式为key: value(键值对)如下:
User-Agent:Mozilla/5.0 Chrome/91.0.4472.106
所以根据请求头名称获取对应值的方法为:
String getHeader(String name):
//获取请求头: user-agent: 浏览器的版本信息
String agent = req.getHeader("user-agent");
获取请求体数据
浏览器在发送GET请求的时候是没有请求体的,所以需要把请求方式变更为POST,请求体中的数据格式如下:
username=zhangsan&password=123
对于请求体中的数据,Request对象提供了如下两种方式来获取其中的数据,分别是:
获取字节输入流,如果前端发送的是字节数据,比如传递的是文件数据,则使用该方法
ServletInputStream getInputStream()
该方法可以获取字节
获取字符输入流,如果前端发送的是纯文本数据,则使用该方法
BufferedReader getReader()
获取请求参数的通用方式
对于请求方式GET,POST来说,代码的基本处理逻辑是相同的,所以我们可以简化一下代码,在doGET请求里面写好所有处理逻辑,在dopost里面可以调用doget方法来完成处理,如:
@WebServlet("/req1")
public class RequestDemo1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取请求方式
String method = req.getMethod();
//获取请求参数
String params = "";
if("GET".equals(method)){
params = req.getQueryString();
}else if("POST".equals(method)){
BufferedReader reader = req.getReader();
params = reader.readLine();
}
//将请求参数进行打印控制台
System.out.println(params);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req,resp);
}
}
这是第一种方法,但是这种方法相对来说比较麻烦,因为以后要每个servlet都需要这样写代码,实现起来比较麻烦,所以我们一般采用下面几种request提供的方法:
获取所有参数Map集合
Map
/**
* request 通用方式获取请求参数
*/
@WebServlet("/req2")
public class RequestDemo2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//GET请求逻辑
System.out.println("get....");
//1. 获取所有参数的Map集合
Map
for (String key : map.keySet()) {//map.keyset():获取所有键
// username:zhangsan lisi
System.out.print(key+":");
//获取值
String[] values = map.get(key);//map.get():根据键获取值
for (String value : values) {
System.out.print(value + " ");
}
System.out.println();
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
}
}
根据名称获取参数值(数组)
String[] getParameterValues(String name);
/**
* request 通用方式获取请求参数
*/
@WebServlet("/req2")
public class RequestDemo2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//GET请求逻辑
//...
System.out.println("------------");
String[] hobbies = req.getParameterValues("hobby");
for (String hobby : hobbies) {
System.out.println(hobby);
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
}
}
根据名称获取参数值(单个值)
String getParameter(String name);
/**
* request 通用方式获取请求参数
*/
@WebServlet("/req2")
public class RequestDemo2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//GET请求逻辑
//...
String username = req.getParameter("username");
String password = req.getParameter("password");
System.out.println(username);
System.out.println(password);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
}
}
request请求转发
请求转发(forward):一种在服务器内部的资源跳转方式。
(1)浏览器发送请求给服务器,服务器中对应的资源A接收到请求
(2)资源A处理完请求后将请求发给资源B
(3)资源B处理完后将结果响应给浏览器
(4)请求从资源A到资源B的过程就叫请求转发
请求转发的实现方式:
req.getRequestDispatcher("资源B路径").forward(req,resp);
请求转发资源间共享数据:使用Request对象
此处主要解决的问题是把请求从/req5转发到/req6的时候,如何传递数据给/req6。
需要使用request对象提供的三个方法:
存储数据到request域[范围,数据是存储在request对象]中
void setAttribute(String name,Object o);
根据key获取值
Object getAttribute(String name);
根据key删除该键值对
void removeAttribute(String name);