Servlet之HttpServletRequest
概述:
1、HttpServletRequest接口来自于Servlet规范中,在Tomcat中存在servlet-api.jar。
2、HttpServletRequest接口实现类由Http服务器负责提供。
3、HttpServletRequest接口负责在doGet/doPost方法运行时读取Http请求协议包中信息。
4、开发人员习惯于将HttpServletRequest接口修饰的对象称为请求对象。
作用:
1、可以读取Http请求协议包中请求行信息。
2、可以读取保存在Http请求协议包中请求头或者请求体中请求参数信息。
3、可以代替浏览器向Http服务器申请资源文件调用。
代码示例
1、可以读取Http请求协议包中请求行信息。
package com.zyh.contrller;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class OneServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, java.io.IOException {
//1、通过请求对象,读取请求行中的URL信息
/*StringBuffer sb = request.getRequestURL();
String url = sb.toString();*/
//合并
String url = request.getRequestURL().toString();
//2、通过请求对象,读取请求行中的method信息
String method = request.getMethod();
//3、通过请求对象,读取请求行中的URI信息
/*
* URI:资源文件精准定位地址。
* 在请求行并没有URI这个属性,
* 实际上是从URL中截取的一个字符串。
*
* URI用于:
* 让Http服务器对被访问的资源文件进行定位。
*/
String uri = request.getRequestURI();
System.out.println("URL:" + url);
System.out.println("Method:" + method);
System.out.println("URI:" + uri);
}
}
2、可以读取保存在Http请求协议包中请求头或者请求体中请求参数信息。
2.1
package com.zyh.contrller;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Enumeration;
public class TwoServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1、通过请求对象获得请求头中的所有的请求参数名
//将所有的请求参数名称保存到一个枚举对象进行返回
Enumeration paramNames = request.getParameterNames();
//遍历枚举
while (paramNames.hasMoreElements()){
String paramName = (String) paramNames.nextElement();
//2、通过请求对象读取指定的请求参数的值
String value = request.getParameter(paramName);
System.out.println("请求参数名:" + paramName + " 请求参数值:" + value);
}
}
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<center>
<a href="/qwer/two?userName=aa&password=123">
通过超链接访问TwoServlet并携带请求参数
</a>
</center>
</body>
</html>
点击链接:
2.2
package com.zyh.contrller;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class ThreeServlet extends HttpServlet {
/*
* 问题:
* 1、GET方式发送中文参数内容时,得到正常结果;
* 2、以POST方式发送中文参数内容时,得到乱码。
*
* 原因:
* 1、浏览器以GET方式发送请求,请求参数保存在【请求头】,
* 在Http请求协议包到达Http服务器之后,
* 请求头二进制内容由Tomcat负责解码,
* Tomcat9.0默认使用[utf-8]字符集,可以解释一切国家文字。
*
* 2、浏览器以POST方式发送请求,请求参数保存在【请求体],
* 在Http请求协议包到达Http服务器之后,
* 请求体二进制内容由当前请求对象(request)负责解码。
* request默认使用[IS0-8859-1]字符集,
* 此时如果请求体参数内容是中文,将无法解码只能得到乱码。
* */
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//通知请求对象,使用UTF-8字符集对请求体的内容进行一次重新解码
request.setCharacterEncoding("UTF-8");
//通过请求对象,读取【请求体】参数
String value = request.getParameter("userName");
System.out.println("从请求体得到参数值:" + value);
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//通过请求对象,读取【请求头】参数
String userName = request.getParameter("userName");
System.out.println("从请求头得到参数值:" + userName);
}
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>three</title>
</head>
<body>
<center>
<form action="/qwer/three" method="get">
请求参数:<input type="text" name="userName" /><br/>
<input type="submit" value="get方式访问ThreeServlet">
</form>
<form action="/qwer/three" method="post">
请求参数:<input type="text" name="userName" /><br/>
<input type="submit" value="post方式访问ThreeServlet">
</form>
</center>
</body>
</html>
设置字符集前,post请求的乱码情况:
重新设置字符集后: