一、不管是哪一种请求(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 方法时要注意,由于 首先判断的就是数据类型。