request概述(封裝了客戶端全部的請求數據)
request是Servlet.service()方法的一個參數,類型爲javax.servlet.http.HttpServletRequest。在客戶端發出每一個請求時,服務器都會建立一個request對象,並把請求數據封裝到request中,而後在調用Servlet.service()方法時傳遞給service()方法,這說明在service()方法中能夠經過request對象來獲取請求數據。
request對象的建立:
request是由tomcat服務器建立的。request對象是在發出請求的時候建立的,一次請求會伴着request對象的建立和失效
一、獲取網絡信息【HttpServletReuest對象】
>獲取客戶端IP:request.getRemoteAddr()
>獲取客戶端口號:request.getRemotePort()
>獲取服務端IP:request.getLocalAddr()
>獲取服務端口號:request.getLocalPort();
>請求方式,request.getMethod(),多是POST也多是GET
經過User-Agent識別用戶瀏覽器類型css
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
二、獲取請求行信息 請求的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
代碼:html
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 }
截圖
三、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相同,值不一樣的一組參數】java
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值】chrome
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 }
彙總代碼【一、獲取網絡信喜、二、獲取請求行信息、三、request獲取請求參數】瀏覽器
login.html
tomcat
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 //一、獲取指定名稱的請求參數值,適用於單值請求參數 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 //二、獲取指定名稱的請求參數值 57 // 獲取複選框的value值 ; 前端提交的參數【name相同 值不一樣 的一組參數】 58 /*String[] checkbox = request.getParameterValues("fav"); 59 for(String fav : checkbox){ 60 System.out.println("獲取愛好的值:"+fav); 61 }*/ 62 63 //三、獲取全部請求參數名稱 64 /*Enumeration<String> names = request.getParameterNames(); 65 while(names.hasMoreElements()){ 66 System.out.println(names.nextElement()); 67 }*/ 68 //四、獲取全部參數封裝到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 }
四、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 }
五、編碼集的設置注意點:
客戶端發送給服務器端的數據【設定 分爲 get/post】
一、post請求 代碼中添加編碼設置
req.setCharacterEncoding("utf-8");
二、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");