分为三部分
- 请求行
- 请求头
- 请求体
1. 请求行
// String getMethod():获取请求方式: GET
String method = req.getMethod();
System.out.println(method);//GET
// String getContextPath():获取虚拟目录(项目访问路径):/request-demo
String contextPath = req.getContextPath();
System.out.println(contextPath);
// StringBuffer getRequestURL(): 获取URL(统一资源定位符):http://localhost:8080/request-demo/req1
StringBuffer url = req.getRequestURL();
System.out.println(url.toString());
// String getRequestURI():获取URI(统一资源标识符): /request-demo/req1
String uri = req.getRequestURI();
System.out.println(uri);
// String getQueryString():获取请求参数(GET方式): username=zhangsan
String queryString = req.getQueryString();
System.out.println(queryString);
控制台的输出
2. 请求头
// 获取请求头:user-agent: 浏览器的版本信息
String agent = req.getHeader("user-agent");
System.out.println(agent);
3. 请求体
针对的是Post请求
所以先建一个表单
<body>
<form action="http://localhost:8080/request-demo/req4" method="post">
<input type="text" name="username"><br>
<input type="password" name="password"><br>
<input type="checkbox" name="hobby" value="1"> 游泳
<input type="checkbox" name="hobby" value="2"> 爬山 <br>
<input type="submit">
</form>
</body>
然后重写doPost方法
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取post 请求体:请求参数
//1. 获取字符输入流
BufferedReader br = req.getReader();
//2. 读取数据
String line = br.readLine();
System.out.println(line);
}
此处的字符流不需要手动关闭,当Request对象被销毁时,字符流会自动关闭。
1.Get方式获取请求参数,是通过
getQueryString()
2.Post方式而是通过对应的输入流来获取的,
//1. 获取字符输入流 BufferedReader br = req.getReader();
//2. 读取数据 String line = br.readLine();
3. 通用方式获取请求参数
因为当重写doGet和doPost方法时,其中的代码逻辑只有在请求参数获取方式上不同。
所以可以提供一个统一获取请求参数的方式
但这里有些问题
上面是我们获取的参数字符串,我们要用Request来对其进行解析。
request对其进行分割
分割的字符串是一对对的键值对,所以request采用map集合进行存储
而避免出现一对多的情况,value值采用字符串数值类型
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//GET请求逻辑
//System.out.println("get....");
//1. 获取所有参数的Map集合
Map<String, String[]> map = req.getParameterMap();
for (String key : map.keySet()) {
// username:zhangsan lisi
System.out.print(key+":");
//获取值
String[] values = map.get(key);
for (String value : values) {
System.out.print(value + " ");
}
System.out.println();
}
System.out.println("------------");
//2. 根据key获取参数值,数组
String[] hobbies = req.getParameterValues("hobby");
for (String hobby : hobbies) {
System.out.println(hobby);
}
//3. 根据key 获取单个参数值
String username = req.getParameter("username");
String password = req.getParameter("password");
System.out.println(username);
System.out.println(password);
}
而为了提高代码的复用率,在doPost中直接调用doGet方法即可,方法逻辑是相同的
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//POST请求逻辑
this.doGet(req,resp);
}
所以底层到底是
getQueryString()
还是getReader()
就不用关心了