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()
目录
request对象的继承关系
request对象的API方法
获取请求行
String getMethod()
public String getContextPath()
public StringBuffer getRequestURL()
public String getRequestURI()
public String getQueryString()
获取请求头
public String getHeader(String name)
获取请求体(POST请求)
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);