天天看點

HttpServletRequest對象,自己學習的心得。

1.

HttpServletRequest介紹

HttpServletRequest對象代表用戶端的請求,當用戶端通過Http超文本傳輸協定通路伺服器時,Http請求頭中的所有資訊都封裝在這個對象中,通過這個對象提供的方法,可以擷取用戶端請求的所有資訊。

2.

  2.1常用方法!!!獲得使用者機請求參數(用戶端送出得資料)

    ! getParameter(String)方法(***常用)

    ! getParameterValues(String name)方法(***常用)

    getParameterNames()方法(不常用)

    ! getParameterMap()方法(***編寫架構時常用)

   

* 擷取用戶端通過Form表單送出上來的參數
11  */
12 public class RequestDemo03 extends HttpServlet {
13 
14     public void doGet(HttpServletRequest request, HttpServletResponse response)
15             throws ServletException, IOException {
16         //用戶端是以UTF-8編碼送出表單資料的,是以需要設定伺服器端以UTF-8的編碼進行接收,否則對于中文資料就會産生亂碼
17         request.setCharacterEncoding("UTF-8");
18         /**
19          * 編  号(文本框):
20            <input type="text" name="userid" value="NO." size="2" maxlength="2">
21          */
22         String userid = request.getParameter("userid");//擷取填寫的編号,userid是文本框的名字,<input type="text" name="userid">
23         /**
24          * 使用者名(文本框):<input type="text" name="username" value="請輸入使用者名">
25          */
26         String username = request.getParameter("username");//擷取填寫的使用者名
27         /**
28          * 密&nbsp;&nbsp;碼(密碼框):<input type="password" name="userpass" value="請輸入密碼">
29          */
30         String userpass = request.getParameter("userpass");//擷取填寫的密碼
31         String sex = request.getParameter("sex");//擷取選中的性别
32         String dept = request.getParameter("dept");//擷取選中的部門
33         //擷取選中的興趣,因為可以選中多個值,是以擷取到的值是一個字元串數組,是以需要使用getParameterValues方法來擷取
34         String[] insts = request.getParameterValues("inst");
35         String note = request.getParameter("note");//擷取填寫的說明資訊
36         String hiddenField = request.getParameter("hiddenField");//擷取隐藏域的内容
37         
38         String instStr="";
39         /**
40          * 擷取數組資料的技巧,可以避免insts數組為null時引發的空指針異常錯誤!
41          */
42         for (int i = 0; insts!=null && i < insts.length; i++) {
43             if (i == insts.length-1) {
44                 instStr+=insts[i];
45             }else {
46                 instStr+=insts[i]+",";
47             }
48         }
49         
50         String htmlStr = "<table>" +
51                             "<tr><td>填寫的編号:</td><td>{0}</td></tr>" +
52                             "<tr><td>填寫的使用者名:</td><td>{1}</td></tr>" +
53                             "<tr><td>填寫的密碼:</td><td>{2}</td></tr>" +
54                             "<tr><td>選中的性别:</td><td>{3}</td></tr>" +
55                             "<tr><td>選中的部門:</td><td>{4}</td></tr>" +
56                             "<tr><td>選中的興趣:</td><td>{5}</td></tr>" +
57                             "<tr><td>填寫的說明:</td><td>{6}</td></tr>" +
58                             "<tr><td>隐藏域的内容:</td><td>{7}</td></tr>" +
59                         "</table>";
60         htmlStr = MessageFormat.format(htmlStr, userid,username,userpass,sex,dept,instStr,note,hiddenField);
61         
62         response.setCharacterEncoding("UTF-8");//設定伺服器端以UTF-8編碼輸出資料到用戶端
63         response.setContentType("text/html;charset=UTF-8");//設定用戶端浏覽器以UTF-8編碼解析資料
64         response.getWriter().write(htmlStr);//輸出htmlStr裡面的内容到用戶端浏覽器顯示
65     }
66 
67     public void doPost(HttpServletRequest request, HttpServletResponse response)
68             throws ServletException, IOException {
69         doGet(request, response);
70     }

  在服務端使用getParameterNames方法接收表單參數:代碼如下      
1 Enumeration<String> paramNames = request.getParameterNames();//擷取所有的參數名
2         while (paramNames.hasMoreElements()) {
3             String name = paramNames.nextElement();//得到參數名
4             String value = request.getParameter(name);//通過參數名擷取對應的值
5             System.out.println(MessageFormat.format("{0}={1}", name,value));
6         }      
  在伺服器端使用getParameterMap方法接收表單參數,代碼見下:
        
1 //request對象封裝的參數是以Map的形式存儲的
 2         Map<String, String[]> paramMap = request.getParameterMap();
 3         for(Map.Entry<String, String[]> entry :paramMap.entrySet()){
 4             String paramName = entry.getKey();
 5             String paramValue = "";
 6             String[] paramValueArr = entry.getValue();
 7             for (int i = 0; paramValueArr!=null && i < paramValueArr.length; i++) {
 8                 if (i == paramValueArr.length-1) {
 9                     paramValue+=paramValueArr[i];
10                 }else {
11                     paramValue+=paramValueArr[i]+",";
12                 }
13             }
14             System.out.println(MessageFormat.format("{0}={1}", paramName,paramValue));
15         }
  post方式提jiao中文資料亂碼産生的原因和解決方法【用戶端使用中文發送,伺服器使用中文接收,正常溝通】【用戶端使用中文發送,伺服器使用XXX文接收,無法溝通即亂碼】
可以知道,之是以會産生亂碼,就是因為伺服器和用戶端溝通的編碼不一緻造成的,是以解決辦法是:在用戶端和伺服器之間設定一個統一的編碼,之後就按照此編碼進行資料的傳輸和接收。

  由于用戶端是以UTF-8字元編碼将表單資料傳輸到伺服器端的,是以伺服器需要設定以UTF-8字元集進行接收,要想完成此操作,伺服器可以直接使用從ServletRequest接口繼承而來的“setCharcterEncoding(charset)”方法進行統一的編碼設定,代碼如下
        
1 public void doPost(HttpServletRequest request, HttpServletResponse response)
2             throws ServletException, IOException {
3         /**
4          * 用戶端是以UTF-8編碼傳輸資料到伺服器端的,是以需要設定伺服器端以UTF-8的編碼進行接收,否則對于中文資料就會産生亂碼
5          */
6         request.setCharacterEncoding("UTF-8");
7         String userName = request.getParameter("userName");
8         System.out.println("userName:"+userName);
9 }      
!!!注意Get請求方式這種解決亂碼的方法(post)是行不通的
get請求方式解決亂碼的方法:
  對于以get方式傳輸的資料,request即使設定了以指定的編碼接收資料也是無效的(我也很蒙這塊),預設的還是ISO8859-1這個字元編碼來接收資料,用戶端以UTF-8的編碼傳輸資料到伺服器端,而伺服器端的request對象使用的是
  ISO8859-1這個字元編碼來接收資料,伺服器和用戶端溝通的編碼不一緻是以才會産生中文亂碼的。解決辦法:在接收到資料後,先擷取request對象以ISO8859-1字元集碼接收到的原始資料的位元組數組,然後通過位元組數組以指定的編碼
  建構字元串,解決亂碼問題。【就是說擷取請求得資料(get方式)以iso8859-1字元編碼接收到的原始資料的位元組資料,然後通過直接數組以指定的編碼utf-8建構字元串,解決亂碼問題】

    !!!注意“請求資料”的預設字元編碼格式和”響應資料“字元編碼格式預設是iso8859-1字元編碼       
1 public void doGet(HttpServletRequest request, HttpServletResponse response)
 2             throws ServletException, IOException {
 3         /**
 4          *
 5          * 對于以get方式傳輸的資料,request即使設定了以指定的編碼接收資料也是無效的,預設的還是使用ISO8859-1這個字元編碼來接收資料
 6          */
 7         String name = request.getParameter("name");//接收資料
 8         name =new String(name.getBytes("ISO8859-1"), "UTF-8") ;//擷取request對象以ISO8859-1字元編碼接收到的原始資料的位元組數組,然後通過位元組數組以指定的編碼建構字元串,解決亂碼問題
 9         System.out.println("name:"+name);    
10 }      

送出中文資料亂碼問題總結

  1、如果送出方式為post,想不亂碼,隻需要在伺服器端設定request對象的編碼即可,用戶端以哪種編碼送出的,伺服器端的request對象就以對應的編碼接收,比如用戶端是以UTF-8編碼送出的,那麼伺服器端request對象就以UTF-8編碼接收(request.setCharacterEncoding("UTF-8"))

  2、如果送出方式為get,設定request對象的編碼是無效的,request對象還是以預設的ISO8859-1編碼接收資料,是以要想不亂碼,隻能在接收到資料後再手工轉換,步驟如下:

  1).擷取擷取用戶端送出上來的資料,得到的是亂碼字元串,data="???è?????"

   String data = request.getParameter("paramName");

  2).查找ISO8859-1碼表,得到客戶機送出的原始資料的位元組數組

   byte[] source = data.getBytes("ISO8859-1");

  3).通過位元組數組以指定的編碼建構字元串,解決亂碼

   data = new String(source, "UTF-8");

  通過位元組數組以指定的編碼建構字元串,這裡指定的編碼是根據用戶端那邊送出資料時使用的字元編碼來定的,如果是GB2312,那麼就設定成data = new String(source, "GB2312"),如果是UTF-8,那麼就設定成data = new String(source, "UTF-8")

  

   request對象作為一個域對象(Map容器)使用時,主要是通過以下的四個方法來操作

setAttribute(String name,Object o)方法,将資料作為request對象的一個屬性存放到request對象中,例如:request.setAttribute("data", data);

getAttribute(String name)方法,擷取request對象的name屬性的屬性值,例如:request.getAttribute("data")

removeAttribute(String name)方法,移除request對象的name屬性,例如:request.removeAttribute("data")

getAttributeNames方法,擷取request對象的所有屬性名,傳回的是一個,例如:Enumeration<String> attrNames = request.getAttributeNames();

請求重定向和請求轉發的差別

  一個web資源收到用戶端請求後,通知伺服器去調用另外一個web資源進行處理,稱之為請求轉發/307。

  一個web資源收到用戶端請求後,通知浏覽器去通路另外一個web資源進行處理,稱之為請求重定向/302。

 2.2:擷取使用者機資訊      

    getRequestURL方法傳回用戶端送出請求時的完整URL(即資源路徑資訊)。

    getRequestURI方法傳回請求行的資源名部分。

    getQueryString方法傳回請求行中的參數部分。

         getPathInfo方法傳回請求URL中的額外路徑資訊。額外路徑資訊是請求URL中的位于Servlet的路徑之後和查詢參數之前的内容,它以“/”開頭。

    getRemoteAddr方法傳回送出請求的客戶機的IP位址。

    getRemoteHost方法傳回送出請求的客戶機的完整主機名。

    getRemotePort方法傳回客戶機所使用的網絡端口号。

    getLocalAddr方法傳回WEB伺服器的IP位址。

    getLocalName方法傳回WEB伺服器的主機名。

通過request對象擷取用戶端請求資訊
1  
2 public class RequestDemo01 extends HttpServlet {
3 
4     public void doGet(HttpServletRequest request, HttpServletResponse response)
5             throws ServletException, IOException {
6         /**
7          * 1.獲得客戶機資訊
8          */
9         String requestUrl = request.getRequestURL().toString();//得到請求的URL位址
10         String requestUri = request.getRequestURI();//得到請求的資源
11         String queryString = request.getQueryString();//得到請求的URL位址中附帶的參數
12         String remoteAddr = request.getRemoteAddr();//得到來訪者的IP位址1         String remoteHost = request.getRemoteHost();
14         int remotePort = request.getRemotePort();
15         String remoteUser = request.getRemoteUser();
16         String method = request.getMethod();//得到請求URL位址時使用的方法
17         String pathInfo = request.getPathInfo();
18         String localAddr = request.getLocalAddr();//擷取WEB伺服器的IP位址
19         String localName = request.getLocalName();//擷取WEB伺服器的主機名
20         response.setCharacterEncoding("UTF-8");//設定将字元以"UTF-8"編碼輸出到用戶端浏覽器
21         //通過設定響應頭控制浏覽器以UTF-8的編碼顯示資料,如果不加這句話,那麼浏覽器顯示的将是亂碼
22         response.setHeader("content-type", "text/html;charset=UTF-8");
23         PrintWriter out = response.getWriter();
24         out.write("擷取到的客戶機資訊如下:");
25         out.write("<hr/>");
26         out.write("請求的URL位址:"+requestUrl);
27         out.write("<br/>");
28         out.write("請求的資源:"+requestUri);
29         out.write("<br/>");
30         out.write("請求的URL位址中附帶的參數:"+queryString);
31         out.write("<br/>");
32         out.write("來訪者的IP位址:"+remoteAddr);
33         out.write("<br/>");
34         out.write("來訪者的主機名:"+remoteHost);
35         out.write("<br/>");
36         out.write("使用的端口号:"+remotePort);
37         out.write("<br/>");
38         out.write("remoteUser:"+remoteUser);
39         out.write("<br/>");
40         out.write("請求使用的方法:"+method);
41         out.write("<br/>");
42         out.write("pathInfo:"+pathInfo);
43         out.write("<br/>");
44         out.write("localAddr:"+localAddr);
45         out.write("<br/>");
46         out.write("localName:"+localName);
47     }
48 
49     public void doPost(HttpServletRequest request, HttpServletResponse response)
50             throws ServletException, IOException {
51         doGet(request, response);
52     }
        

   2.3:獲得客戶機請求頭

      getHeader(string name)方法:String

      getHeaders(String name)方法:Enumeration

      getHeaderNames()方法

擷取用戶端請求頭資訊
12  * 用戶端請求頭:
13  * 
14  */
15 public class RequestDemo02 extends HttpServlet {
16 
17     public void doGet(HttpServletRequest request, HttpServletResponse response)
18             throws ServletException, IOException {
19         response.setCharacterEncoding("UTF-8");//設定将字元以"UTF-8"編碼輸出到用戶端浏覽器
20         //通過設定響應頭控制浏覽器以UTF-8的編碼顯示資料
21         response.setHeader("content-type", "text/html;charset=UTF-8");
22         PrintWriter out = response.getWriter();
23         Enumeration<String> reqHeadInfos = request.getHeaderNames();//擷取所有的請求頭
24         out.write("擷取到的用戶端所有的請求頭資訊如下:");
25         out.write("<hr/>");
26         while (reqHeadInfos.hasMoreElements()) {
27             String headName = (String) reqHeadInfos.nextElement();
28             String headValue = request.getHeader(headName);//根據請求頭的名字擷取對應的請求頭的值
29             out.write(headName+":"+headValue);
30             out.write("<br/>");
31         }
32         out.write("<br/>");
33         out.write("擷取到的用戶端Accept-Encoding請求頭的值:");
34         out.write("<hr/>");
35         String value = request.getHeader("Accept-Encoding");//擷取Accept-Encoding請求頭對應的值
36         out.write(value);
37         
38         Enumeration<String> e = request.getHeaders("Accept-Encoding");
39         while (e.hasMoreElements()) {
40             String string = (String) e.nextElement();
41             System.out.println(string);
42         }
43     }
44 
45     public void doPost(HttpServletRequest request, HttpServletResponse response)
46             throws ServletException, IOException {
47         doGet(request, response);
48     }