03-【request對象獲取請求的數據 & request對象存取值】

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         }
View Code


測試訪問:當別人輸入你的網絡地址就能夠獲取到是誰的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     }
View Code

截圖

三、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 }
View Code


彙總代碼【一、獲取網絡信喜、二、獲取請求行信息、三、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>
View Code

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 }
View Code

四、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>
View Code

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 }
View Code

五、編碼集的設置注意點:
客戶端發送給服務器端的數據【設定 分爲 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");
相關文章
相關標籤/搜索