request概述(封装了客户端所有的请求数据)
request是Servlet.service()方法的一个参数,类型为javax.servlet.http.HttpServletRequest。在客户端发出每个请求时,服务器都会创建一个request对象,并把请求数据封装到request中,然后在调用Servlet.service()方法时传递给service()方法,这说明在service()方法中可以通过request对象来获取请求数据。
request对象的创建:
request是由tomcat服务器创建的。request对象是在发出请求的时候创建的,一次请求会伴着request对象的创建和失效
1、获取网络信息【HttpServletReuest对象】
>获取客户端IP:request.getRemoteAddr()
>获取客户端口号:request.getRemotePort()
>获取服务端IP:request.getLocalAddr()
>获取服务端口号:request.getLocalPort();
>请求方式,request.getMethod(),可能是POST也可能是GET
通过User-Agent识别用户浏览器类型
1 public void getNetInfo(HttpServletRequest request, 2 HttpServletResponse response){ 3 //获取客户端的ip 4 String remoteAddr = request.getRemoteAddr(); 5 //获取客户端的端口号 6 int remotePort = request.getRemotePort(); 7 //获取服务器的ip 8 String localAddr = request.getLocalAddr(); 9 //获取服务器的端口号 10 int localPort = request.getLocalPort(); 11 System.out.println("客户端ip和端口号:"+remoteAddr +"---"+remotePort); 12 System.out.println("服务器的ip和端口号:"+localAddr +"---"+localPort); 13 // 获取请求方法 14 String method = request.getMethod(); 15 System.out.println("获取请求方式:"+method); 16 // 获取请求头信息 17 String userAgent = request.getHeader("User-Agent"); 18 System.out.println(userAgent);// 获取名为User-Agent请求头 19 // 判断浏览器的类型 20 if(userAgent.toLowerCase().contains("chrome")){ 21 System.out.println("注意:"+remoteAddr+"正在使用Google浏览器访问您的服务器"); 22 }else if(userAgent.toLowerCase().contains("firefox")){ 23 System.out.println("注意:"+remoteAddr+"正在使用火狐浏览器访问您的服务器"); 24 }else if(userAgent.toLowerCase().contains("msie")){ 25 System.out.println("注意:"+remoteAddr+"正在使用Internet Explorer浏览器访问您的服务器"); 26 }else{ 27 System.out.println("不知名的浏览器正在访问您的服务器"); 28 }
测试访问:当别人输入你的网络地址就可以获取到是谁的IP访问的:http://192.168.58.82:8080/servlet02/login.html
2、获取请求行信息 请求的url
http://127.0.0.1:8080/servlet02/request01?uname=zhangsan&pwd=123456
>String getScheme():返回请求协议:http
>String getServerName():返回主机名:127.0.0.1
>int getServerPort():返回服务器端口号:8080
>String getContextPath():返回上下文路径(获取项目名):/servlet02
>String getServletPath():返回Servlet路径(对应的是url-pattern):/request01
>String getQueryString():返回请求URL中的参数:uname=zhangsan&pwd=123456
>String getRequestURI():返回请求URI路径(等于项目名+Servlet路径):/servlet02/request01
>StringBuffer getRequestURL():返回请求URL路径(除了参数以外的路径信息):http://127.0.0.1:8080/servlet02/request01
>String getMethod():返回请求方式:GET
代码:
1 private void getRequestLine(HttpServletRequest request, 2 HttpServletResponse response) { 3 //request获取URL的相关信息 4 // 获取请求协议 5 String scheme = request.getScheme(); 6 System.out.println("返回请求协议:"+scheme); 7 // 获取主机名 8 String serverName = request.getServerName(); 9 System.out.println("返回请求协议:"+serverName); 10 // 获取服务器端口号 11 int serverPort = request.getServerPort(); 12 System.out.println("返回获取端口号:"+serverPort); 13 // 获取上下文路径 14 String contextPath = request.getContextPath(); 15 System.out.println("返回上下文路径(获取项目名):"+contextPath); 16 // 获取servlet路径 17 String servletPath = request.getServletPath(); 18 System.out.println("返回Servlet路径(对应的是url-pattern):"+servletPath); 19 // 获取URL中的参数 20 String queryString = request.getQueryString(); 21 System.out.println("参数信息(?后面的参数):"+queryString); 22 // 获取URI的路径 23 String requestURI = request.getRequestURI(); 24 System.out.println("URI路径(等于项目名+Servlet路径):"+requestURI); 25 // 获取URL路径 26 StringBuffer requestURL = request.getRequestURL(); 27 System.out.println("URL路径(除了参数以外的路径信息):"+requestURL); 28 // 获取请求方法 29 String method = request.getMethod(); 30 System.out.println("获取请求方式:"+method); 31 }
截图
3、request获取请求参数
请求参数是由客户端发送给服务器的!有可能是在请求体中(POST),也可能是在URL之后(GET)请求参数:有一个参数一个值的,还有一个参数多个值!
>String getParameter(String name):获取指定名称的请求参数值,适用于单值请求参数
1 String uname = request.getParameter("uname"); 2 String pwd = request.getParameter("pwd"); 3 // 会出现乱码的现象,设置请求编码:必须在获取数据之前,login.html改成post请求 4 System.out.println("用户名:" + uname + "--->" + "密码:" + pwd);
获取所得的结果信息:用户名:小云云--->密码:123456
>String[] getParameterValues(String name):获取指定名称的请求参数值【当多个参数名称相同时】
eg:获取复选框的value值,前端提交的参数【name相同,值不同的一组参数】
1 // 获取复选框的value值 ; 前端提交的参数【name相同 值不同 的一组参数】 2 String[] checkbox = request.getParameterValues("fav"); 3 for(String fav : checkbox){ 4 System.out.println("获取爱好的值:"+fav); 5 } 6
获得所得的结果信息
>Enumeration<String> getParameterNames():获取所有请求参数名称【表单的name值】
1 Enumeration<String> names = request.getParameterNames(); 2 while(names.hasMoreElements()){ 3 System.out.println(names.nextElement()); 4 }
获得所得的结果信息
>Map<String,String[]> getParameterMap():获取所有参数封装到Map中,其中key为参数名,value为参数值,因为一个参数名称可能有多个值,所以参数值是String[],而不是String
1 Map<String, String[]> map = request.getParameterMap(); 2 for(String value:map.keySet()){ 3 String[] strings = map.get(value); 4 System.out.println(value+":"+Arrays.toString(strings)); 5 }
汇总代码【1、获取网络信喜、2、获取请求行信息、3、request获取请求参数】
login.html
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <title>login.html</title> 5 <!-- 设置编码集 --> 6 <meta charset="utf-8"> 7 <meta name="keywords" content="keyword1,keyword2,keyword3"> 8 <meta name="description" content="this is my page"> 9 <meta name="content-type" content="text/html; charset=UTF-8"> 10 11 <!--<link rel="stylesheet" type="text/css" href="./styles.css">--> 12 13 </head> 14 15 <body> 16 This is my HTML page. <br><hr> 17 <!-- 提交服务器URL--> 18 <form action="request01" method="post"> 19 用户名:<input type="text" id="uname" name="uname" /> <br /> 20 密码:<input type="password" id="pwd" name="pwd" /> <br /> 21 爱好: 22 <input type="checkbox" name="fav" value="001">看电影 23 <input type="checkbox" name="fav" value="002">听小曲 24 <input type="checkbox" name="fav" value="003">打游戏 25 <input type="checkbox" name="fav" value="004" checked="checked">抽烟、喝酒、烫头 26 <br> 27 <input type="submit" value="登录" /> <br /> 28 </form> 29 </body> 30 </html>
request01.java
1 package boom.request; 2 3 import java.io.IOException; 4 import java.io.UnsupportedEncodingException; 5 import java.util.Arrays; 6 import java.util.Map; 7 8 import javax.servlet.ServletException; 9 import javax.servlet.http.HttpServlet; 10 import javax.servlet.http.HttpServletRequest; 11 import javax.servlet.http.HttpServletResponse; 12 /** 13 * 测试 request对象 14 * @author Administrator 15 * 16 */ 17 public class request01 extends HttpServlet { 18 @Override 19 protected void service(HttpServletRequest request, HttpServletResponse response) 20 throws ServletException, IOException { 21 // 设置编码集 22 request.setCharacterEncoding("utf-8"); 23 // 1 获取网络连接信息 24 //getNetInfo(request, response); 25 26 // 2获取请求行的信息 27 getRequestLine(request,response); 28 29 // 3获取请求参数 30 //getRequestData(request, response); 31 32 // service方法会调用 父类的doGet方法 33 response.getWriter().println("test request....."); 34 } 35 36 /** 37 * 3,获取请求参数 例如 form表单提交的内容 38 * @param request 39 * @param response 40 * @throws UnsupportedEncodingException 41 */ 42 private void getRequestData(HttpServletRequest request, 43 HttpServletResponse response) throws UnsupportedEncodingException { 44 45 //获取请求参数 前端页面发送的请求参数 46 //form表单提交的参数 用户名:name="uname" 密码 :name="pwd" 47 //注意: form表单域 用户名和密码 必须有name属性 48 49 //1、获取指定名称的请求参数值,适用于单值请求参数 50 /*String uname = request.getParameter("uname"); 51 String pwd = request.getParameter("pwd"); 52 // 会出现乱码的现象,设置请求编码:必须在获取数据之前,login.html改成post请求 53 System.out.println("用户名:" + uname + "--->" + "密码:" + pwd);*/ 54 55 56 //2、获取指定名称的请求参数值 57 // 获取复选框的value值 ; 前端提交的参数【name相同 值不同 的一组参数】 58 /*String[] checkbox = request.getParameterValues("fav"); 59 for(String fav : checkbox){ 60 System.out.println("获取爱好的值:"+fav); 61 }*/ 62 63 //3、获取所有请求参数名称 64 /*Enumeration<String> names = request.getParameterNames(); 65 while(names.hasMoreElements()){ 66 System.out.println(names.nextElement()); 67 }*/ 68 //4、获取所有参数封装到Map中 69 Map<String, String[]> map = request.getParameterMap(); 70 for(String value:map.keySet()){ 71 String[] strings = map.get(value); 72 System.out.println(value+":"+Arrays.toString(strings)); 73 } 74 //获取父页面的url 75 String Referer = request.getHeader("Referer"); 76 System.out.println("防止别人盗链我们的网址:"+Referer); 77 } 78 79 /** 80 * 2,请求行信息 请求的url 81 */ 82 83 private void getRequestLine(HttpServletRequest request, 84 HttpServletResponse response) { 85 //request获取URL的相关信息 86 // 获取请求协议 87 String scheme = request.getScheme(); 88 System.out.println("返回请求协议:"+scheme); 89 // 获取主机名 90 String serverName = request.getServerName(); 91 System.out.println("返回请求协议:"+serverName); 92 // 获取服务器端口号 93 int serverPort = request.getServerPort(); 94 System.out.println("返回获取端口号:"+serverPort); 95 // 获取上下文路径 96 String contextPath = request.getContextPath(); 97 System.out.println("返回上下文路径(获取项目名):"+contextPath); 98 // 获取servlet路径 99 String servletPath = request.getServletPath(); 100 System.out.println("返回Servlet路径(对应的是url-pattern):"+servletPath); 101 // 获取URL中的参数 102 String queryString = request.getQueryString(); 103 System.out.println("参数信息(?后面的参数):"+queryString); 104 // 获取URI的路径 105 String requestURI = request.getRequestURI(); 106 System.out.println("URI路径(等于项目名+Servlet路径):"+requestURI); 107 // 获取URL路径 108 StringBuffer requestURL = request.getRequestURL(); 109 System.out.println("URL路径(除了参数以外的路径信息):"+requestURL); 110 } 111 112 /** 113 * 1,获取网络信息【当别人输入你的网络地址就可以获取到是谁的IP访问的】 114 * http://192.168.58.82:8080/servlet02/login.html 115 * 116 */ 117 public void getNetInfo(HttpServletRequest request, 118 HttpServletResponse response){ 119 //获取客户端的ip 120 String remoteAddr = request.getRemoteAddr(); 121 //获取客户端的端口号 122 int remotePort = request.getRemotePort(); 123 //获取服务器的ip 124 String localAddr = request.getLocalAddr(); 125 //获取服务器的端口号 126 int localPort = request.getLocalPort(); 127 System.out.println("客户端ip和端口号:"+remoteAddr +"---"+remotePort); 128 System.out.println("服务器的ip和端口号:"+localAddr +"---"+localPort); 129 // 获取请求方法 130 String method = request.getMethod(); 131 System.out.println("获取请求方式:"+method); 132 // 获取请求头信息 133 String userAgent = request.getHeader("User-Agent"); 134 System.out.println(userAgent);// 获取名为User-Agent请求头 135 // 判断浏览器的类型 136 if(userAgent.toLowerCase().contains("chrome")){ 137 System.out.println("注意:"+remoteAddr+"正在使用Google浏览器访问您的服务器"); 138 }else if(userAgent.toLowerCase().contains("firefox")){ 139 System.out.println("注意:"+remoteAddr+"正在使用火狐浏览器访问您的服务器"); 140 }else if(userAgent.toLowerCase().contains("msie")){ 141 System.out.println("注意:"+remoteAddr+"正在使用Internet Explorer浏览器访问您的服务器"); 142 }else{ 143 System.out.println("不知名的浏览器正在访问您的服务器"); 144 } 145 } 146 }
4、request域【request对象存取数据】
Servlet中三大域对象:request、session、application
request的域方法:
>void setAttribute(String name, Object value):用来存储一个对象,也可以称之为存储一个域属性
>object getAttribute(String name):用来获取request中的数据,当前在获取之前需要先去存储。
>void removeAttribute(String name):用来移除request中的域属性,如果参数name指定的域属性不存在,那么本方法什么都不做
>Enumeration getAttributeNames():获取所有域属性的名称;
注:同一请求范围内使用request.setAttribute()、request.getAttribute()来传值!前一个Servlet调用setAttribute()保存值,后一个Servlet调用getAttribute()获取值。
1 //request对象 进行存取值 2 //request对象 对应的一次请求和响应 ,对象也可以存取数据 3 4 // 存对象 5 request.setAttribute("name", "zhangsan"); 6 // 取对象【获取参数取值】 7 Object name = request.getAttribute("name"); 8 System.out.println("删除属性前name:"+name); 9 10 //移除属性值 ,是 在request对象中存取 11 request.removeAttribute("name"); 12 13 Object removeName = request.getAttribute("name"); 14 System.out.println("删除属性后name:"+removeName);
测试request对象存取值
requset.html
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <title>request.html</title> 5 <meta charset="utf-8"> 6 <meta name="keywords" content="keyword1,keyword2,keyword3"> 7 <meta name="description" content="this is my page"> 8 <meta name="content-type" content="text/html; charset=UTF-8"> 9 10 <!--<link rel="stylesheet" type="text/css" href="./styles.css">--> 11 12 </head> 13 14 <body> 15 <div> 16 <a href="request02">测试request对象存取值</a> 17 <hr> 18 </div> 19 </body> 20 </html>
request02.java
1 package boom.request; 2 3 import java.io.IOException; 4 5 import javax.servlet.ServletException; 6 import javax.servlet.http.HttpServlet; 7 import javax.servlet.http.HttpServletRequest; 8 import javax.servlet.http.HttpServletResponse; 9 10 public class request02 extends HttpServlet { 11 @Override 12 protected void service(HttpServletRequest request, HttpServletResponse response) 13 throws ServletException, IOException { 14 15 // 设置响应编码 16 response.setContentType("text/html;charset=utf-8"); 17 //request对象 进行存取值 18 //request对象 对应的一次请求和响应 ,对象也可以存取数据 19 20 // 存对象 21 request.setAttribute("name", "zhangsan"); 22 // 取对象【获取参数取值】 23 Object name = request.getAttribute("name"); 24 System.out.println("删除属性前name:"+name); 25 26 //移除属性值 ,是 在request对象中存取 27 request.removeAttribute("name"); 28 29 Object removeName = request.getAttribute("name"); 30 System.out.println("删除属性后name:"+removeName); 31 32 response.getWriter().println("这是乱码的。。。。。haha。。。。已解决"); 33 //3 秒后跳转到index.jsp页面 34 response.addHeader("refresh","3;http://www.baidu.com"); 35 } 36 37 }
5、编码集的设置注意点:
客户端发送给服务器端的数据【设定 分为 get/post】
1、post请求 代码中添加编码设置
req.setCharacterEncoding("utf-8");
2、get请求 req.setCharacterEncoding("utf-8");
tomcat ----conf -----server.xml 文件 端口号后 + 设置 URIEncoding="utf-8" useBodyEncodingForURI="true"
<Connector connectionTimeout="20000" port="8080" URIEncoding="utf-8" useBodyEncodingForURI="true" protocol="HTTP/1.1" redirectPort="8443" />
提交的服务器地址 url
get请求 url 后边的参数 会被 form表单的参数值覆盖 ,但是直接在地址栏 添加 url?cmd=add 在后端servlet是可以获取到的
<a href ="url?cmd=add">地址栏直接输入url</a> 超链接是get请求
post请求:url后边的参数会提交,form表单的参数会在请求体中也会提交 。一般form表单提交用post请求
服务器端响应给客户端的数据:
设定浏览器打开文件的方式 text/html
设定编码集 charset=utf-8
// 设置响应编码
response.setContentType("text/html;charset=utf-8");
注:所有的请求编码设置必须在获取数据之前
补充:定时刷新:
1 //3 秒后跳转到index.jsp页面 2 response.addHeader("refresh","3;http://www.baidu.com");