Spring MVC 請求參數

一、不管是哪一種請求(GET、POST、PUT、DELETE)都能經過以下方式獲取攜帶在URL上的參數前端

URL:host:port/webapp/address?param=value&..web

Map<String, String[]> requestParameterMap = request.getParameterMap();app

這種獲取參數的方式並且能夠獲取屢次,也就是在調用Service以前或者以後均可以調用 request的方法獲取參數,並且參數的值是和之前徹底同樣的。webapp

 

二、POST、PUT 請求方式是經過請求體發送參數的,因此咱們如何想要獲取請求體中的參數使用request.getParameterMap(); 是不可行的,它只能獲取 URL上的參數,如何獲取請求體的參數呢,請求體的參數都是放在request的輸入流當中,只要讀流,一樣輸入流裏也不會有URL攜帶的參數,使用以下方式:.net

try{字符串

if(request.getMethod().toLowerCase().equals("put")){get

InputStream is = request.getInputStream();it

byte[] buffer = new byte[1024];io

StringBuffer rs = new StringBuffer();class

int len;

while ( (len = is.read(buffer)) != -1 ){

rs.append(new String(buffer,0,len));

}

System.out.println(rs);

}

}catch (Exception e){

e.printStackTrace();

}

可是他有一個很大的缺陷就是流只能讀一次,由於讀流的過程當中index一直在移動,然而又不能reset,因此讀完了以後就沒有了,並且讀完以後再去讀均可能是 stream is closed. 因此通常若是是手動經過流的方式獲取參數,獲得參數以後應該把它放在 request.setAttribute 裏面,方便下次獲取,固然也可使用 ThreadLocal,這樣就能夠處處使用。

 

三、Spring @RequestBody 能夠幫咱們從流中獲取參數,可是他不會從URL中獲取參數,若是須要從URL中獲取參數應該是 @Param , 若是是 URL的address中有參數,如 webapp/{item}/list 須要獲取 item這個參數的值應該是 @PathVariable 。

 

四、由於系統中不想有太多的代碼,因此咱們都是使用 request.getParameterMap(); 來替代 @Param可是 request.getParameterMap(); 有個很大的缺點,那就是獲取的值的數據類型都是字符串,理論上URL攜帶的參數都應該都是字符串。但是若是你使用Spring的註解則能夠自動轉換對應的參數,尤爲是使用 @RequestBody Map<String,Object> params 的時候,裏面的參數類型是自動判斷的,好比前端傳來的 {"status":1} 和 {"status":"1"} 兩者是不一樣的,前者被解析爲Integer,後者則是 String,那麼在咱們使用Java 的 equals 方法時要注意,由於 首先判斷的就是數據類型。

相關文章
相關標籤/搜索