區別request的getParameter() ,getInputStream(),getReader()

參考:http://blog.csdn.net/clam_clam/article/details/6570539html

咱們常常用servlet和jsp, 常常用request.getParameter() 來獲得數據。python

 

request.getParameter()
request.getInputStream()
request.getReader()
這三個方法都是從request對象中獲得提交的數據,可是用途不一樣。jquery

要根據<form>表單提交數據的編碼方式選擇不一樣的方法。ajax

HTML中的form表單的一個關鍵屬性 enctype:json

1. enctype=application/x- www-form-urlencoded瀏覽器

  這種編碼方式是默認的編碼方式。緩存

   編碼後的結果一般是field1=value2&field2=value2&… 的形式,如 name=aaaa&password=bbbb。服務器

   一般使用的表單也是採用這種方式編碼的,Servlet 的 API 提供了對這種 編碼方式解碼的支持,只須要調用 ServletRequest 類中的 getParameter()方法就能夠獲得用戶表單中的字段和數據。app

    不足:dom

   這種編碼方式( application/x-www-form-urlencoded )雖然簡單,但對於傳輸大塊的二進制數據顯得力不從心。

 

2. 對於傳輸大塊的二進制數這類數據,瀏覽器採用了另外一種編碼方式,即 "multipart/form-data" 的編碼方式:

   瀏覽器能夠很容易將表單內的數據和文件放在一塊兒發送。這種編碼方式先定義好一個不可能在數據中出現的字符串做爲 分界符,而後用它將各個數據段分開,而對於每一個數據段都對應着 HTML 頁面表單中的一個 Input 區,包括一個 content-disposition 屬性,說明了這個數據段的一些信息,若是這個數據段的內容是一個文件,還會有 Content-Type 屬性,而後就是數據自己,若是以這種方式提交數據就要用request.getInputStream()或request.getReader()獲得 提交的數據,用 request.getParameter()是得不到提交的數據的。

 

3.須要注意的是:

request.getParameter()、 request.getInputStream()、request.getReader()這三種方法是有衝突的,由於流只能被讀一次。
好比:
當form表單內容採用 enctype=application/x-www-form-urlencoded編碼時,先經過調用request.getParameter() 方法獲得參數後,再調用request.getInputStream()或request.getReader()已經得不到流中的內容,由於在調用 request.getParameter()時系統可能對錶單中提交的數據以流的形式讀了一次,反之亦然。

當form表單內容採用enctype=multipart/form-data編碼時,即便先調用request.getParameter()也得不到數據,因此這時調用request.getParameter()方法對 request.getInputStream()或request.getReader()沒有衝突,即便已經調用了 request.getParameter()方法也能夠經過調用request.getInputStream()或request.getReader()得 到表單中的數據,而request.getInputStream()和request.getReader()在同一個響應中是不能混合使用的,若是混合使用就會拋異常。

  如:

  1. BufferedReader reader = request.getReader();  
  2.    while ((line = reader.readLine()) != null)  
  3.      jb.append(line);  
  4.    String jbstring=jb.toString();  
  5.    String uname=request.getParameter("uname");  
  6.    System.out.println("uname:"+uname);  

  (uname 打印的值爲: uame:null) .

  (note :

    本人最近作一個項目居然還用jbstring.split("&");jbstring1.split("=");的方法把裏面的name 和password 等一串值單讀出來真是笨死了。

 

頁面端傳遞數據方式爲:

 

  1. var params={  
  2. ajaxurlwithparam:"createmail2.do",  
  3. method:"POST",  
  4. data:{uname:uname,password:password,passwordconf:passwordconf,mobile:mobile,verifycode:verifycode,domain:domain,version:version}  
  5. };  

 

注意jquery 中的datatype 指的是預期服務器返回的數據類型。 而不是發送的數據類型。如:

  1. //reg.js  
  2. var params={            ajaxurlwithparam:"createmail2.do",  
  3.                 method:"POST",  
  4.                 data:{uname:uname,password:password,passwordconf:passwordconf,mobile:mobile,verifycode:verifycode,domain:domain,version:version}  
  5.         };  
  6.   regresult=ajaxRequest(params);  
  7. //function.js  
  8. function ajaxRequest(params){  
  9.     .....  
  10.     $.ajax({  
  11.         type : method,  
  12.         url : ajaxurl,  
  13.         async : ifasync,  
  14.         data : data,  
  15.         dataType : 'json',  //  
  16.         success : function(result) {  
  17.             re=result;  
  18.         }  
  19.     });  
  20.     return re;  
  21. }  

而從sevlet 獲得的字符串是(request.getReader())爲:

(uname=aptech1&password=123456&passwordconf=123456&mobile=13277042784&verifycode=0489&domain=163.com&version=regvf1)

不是json 字符串格式。因此 Jquery .ajax {datatype:} 只是服務器返回來的數據類型不要覺得datatype:json 就覺得他也是以json 數據格式發送。

 

若是不指定,jQuery 將自動根據 HTTP 包 MIME 信息來智能判斷,好比XML MIME類型就被識別爲XML。在1.4中,JSON就會生成一個JavaScript對象,而script則會執行這個腳本。隨後服務器端返回的數據會根據這個值解析後,傳遞給回調函數。可用值:

"xml": 返回 XML 文檔,可用 jQuery 處理。

"html": 返回純文本 HTML 信息;包含的script標籤會在插入dom時執行。

"script": 返回純文本 JavaScript 代碼。不會自動緩存結果。除非設置了"cache"參數。'''注意:'''在遠程請求時(不在同一個域下),全部POST請求都將轉爲GET請求。(由於將使用DOM的script標籤來加載)

"json": 返回 JSON 數據 。

"jsonp": JSONP 格式。使用 JSONP 形式調用函數時,如 "myurl?callback=?" jQuery 將自動替換 ? 爲正確的函數名,以執行回調函數。

"text": 返回純文本字符串

 

)

相關文章
相關標籤/搜索