request对象的继承关系
1.HttpServletRequest接口继承了ServletRequest接口,对其父接口进行了扩展,可以处理满足所有http协议的请求
2.HttpServletRequest和ServletRequest都是接口,不能创建对象,因此在tomcat底层定义实现类并创建实现类对象
public class RequestFacade implements HttpServletRequest{}
tomcat底层创建门面类RequestFacade对象
ServletRequest request=new RequestFacade();多态
request对象的API方法
获取请求行
String getMethod()
Get the request method, e.g. GET, POST, etc.
获取请求方法
public String getContextPath()
访问虚拟目录(项目访问路径)就是我们在Tomcat配置的位置设置的路径,是虚拟的,就是随便定义的 如果设置虚拟路径位置是/ 那么该方法获取的内容是空字符串
public StringBuffer getRequestURL()
返回的 URL 包含一个协议、服务器名称、端口号、服务器路径,但是不包含查询字符串参数(获取的是请求资源的绝对路径,包含三要素(IP协议,IP地址,端口号)),没有请求参数
public String getRequestURI()
获取的是请求资源的绝对路径,但是不包含三要素,没有请求参数
public String getQueryString()
返回包含在请求 URL 中路径后面的查询字符串。如果 URL 没有查询字符串,则此方法返回
null
。只能获取GET请求的请求参数(因为get请求的请求参数在URL后面)
测试
浏览器页面
@WebServlet("/requestDemo1") public class requestDemo1 extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //获取请求方法 String method = request.getMethod(); System.out.println(method);//GET //访问虚拟目录 String contextPath = request.getContextPath(); System.out.println(contextPath);//如果是/ 则为空字符串 //获取URL路径(资源的URL路径,包含三要素) StringBuffer requestURL = request.getRequestURL(); //StringBufffer和StringBuilder都是字符串缓冲区 ,字符可以改变 //StringBuilder线程不安全,效率高 //StringBuffer线程安全,效率低 String rs = requestURL.toString(); System.out.println(rs);//http://localhost:8080/requestDemo1 //获取URI路径(不包含三要素的URL路径) String requestURI = request.getRequestURI(); System.out.println(requestURI);///requestDemo1 //获取请求参数(GET方式适用) String queryString = request.getQueryString(); System.out.println(queryString);//username=aa&pwd=bb } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
获取请求头
public String getHeader(String name)
以
String
的形式返回指定请求头的值。如果该请求不包含指定名称的头,则此方法返回null
。如果有多个具有相同名称的头,则此方法返回请求中的第一个头。头名称是不区分大小写的。可以将此方法与任何请求头一起使用。
name 指定头名称的 String
return 包含请求头的值的 String
,如果该请求没有该名称的头,则返回null
name就是冒号左边的标识
获取请求体(POST请求)
public ServletInputStream getInputStream()
获取字节和字符数据
public java.io.BufferedReader getReader()
获取字符数据
前端页面
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h2>POST请求</h2> <form action="/requestDemo2" method="post"> <input type="text" name="username"/> <br> <input type="text" name="password"/> <br> <input type="submit" value="提交"> <br> </form> </body> </html>
@WebServlet("/requestDemo2") public class RequestDemo2 extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //1.获取输入流对象 BufferedReader reader = request.getReader(); String line=null; while((line=reader.readLine())!=null){ System.out.println(line);//username=hhhh&password=123456 } } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
浏览器:
获取请求参数的通用方式
get请求是getQueryString()方法
post请求是getReader(),getInputStream()
目录
public String getContextPath()
public StringBuffer getRequestURL()
public String getQueryString()
public String getHeader(String name)
public ServletInputStream getInputStream()
public java.io.BufferedReader getReader()
public java.util.MapgetParameterMap(),>
String[] getParameterValues(String name)
String getParameter(String name)
通用方法
public java.util.Map<String, String[]>getParameterMap()
获取所有请求参数的map集合
String[] getParameterValues(String name)
根据参数名字获取参数值(数组)
name是前端请求参数的等号左边的key
String getParameter(String name)
根据参数名字获取参数值(单个值)
注意:如果参数name有多个值,取第一个
前端
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form action="/requestDemo3" method="post"> 用户:<input type="text" name="username"> <br> 密码:<input type="password" name="pwd"> <br> 爱好:<input type="checkbox" name="hoppy" value="1">爬山 <input type="checkbox" name="hoppy" value="2">游泳<br> <input type="submit" value="提交"> </form> </body> </html>
@WebServlet("/requestDemo3") public class requestDemo3 extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("前端提交数据的方式是"+request.getMethod()); //获取所有请求参数的map对象 Map<String, String[]> map = request.getParameterMap(); map.forEach((key,value)-> System.out.println(key+"--->"+ Arrays.toString(value))); //获取指定name的参数值(数组) String[] usernames = request.getParameterValues("username"); System.out.println(Arrays.toString(usernames)); // //获取指定name的参数值(单个值) String hoppy = request.getParameter("pwd"); System.out.println(hoppy); } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
浏览器
结果:
前端提交数据的方式是POST
username--->[hhhh]
pwd--->[aa]
hoppy--->[1, 2]
[hhhh]
aa
POST请求 如果输入的值有中文就会出现乱码的问题
前端提交数据的方式是POST
username--->[?????????]
pwd--->[qqq]
hoppy--->[1, 2]
[?????????]
qqq
解决方法
//方法一: //使用request对象调用方法 request.setCharacterEncoding("UTF-8");//告知tomcat使用UTF-8进行解码 //注意:解决请求体数据的乱码(解决POST乱码的) //方法二: //使用javase的API方法 String username = request.getParameter("username"); username = URLEncoder.encode(username, "ISO-8859-1");//编码 username = URLDecoder.decode(username,"UTF-8");//解码 System.out.println(username); //方法三: //使用javase的API解决即String类 byte[] bytes = username.getBytes("ISO-8859-1");//编码 String s = new String(bytes,"UTF-8");//解码 System.out.println(s);
request对象的生命周期
何时创建?
浏览器第一次访问tomcat服务器的时候
谁创建?
tomcat服务器
创建request对象干什么?
浏览器第一次访问tomcat服务器时,tomcat服务器创建request和reponse对象,传递给servlet中的service方法,然后我们就可以在servlet中使用request对象调用方法获取请求数据,然后处理业务逻辑,处理完毕后响应给浏览器,浏览器收到数据响应之后,tomcat会销毁request和reponse对象