一 获取请求方式、请求内容
request.getMethod() 获取请求提交方式,如POST、GET等
request.getContentType() 获取请求类型,示例值:application/json ,multipart/form-data, application/xml等
可能含有请求内容的字符集,如application/json;charset=UTF-8
request.getRequestURL() 获取请求URL
二 先获取key在根据key获取value(不适用于multipart/form-data)
request.getParameterNames(); 获取所有key
request.getParameter("test"); 根据key得到value
String key, name;
Enumeration<String> enumeration = request.getParameterNames();
while (enumeration.hasMoreElements()) {
key = enumeration.nextElement();
name = request.getParameter(key);
System.out.println(key + " :" + name);
}
三 multipart/form-data 可用如下方法
有遇到过一个项目用该方法不能读取到参数,而用上面第二点可以,这点我现在还是很奇怪
DiskFileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
upload.setHeaderEncoding("UTF-8");
Map<String, String> param = new HashMap<String, String>();
try {
List<FileItem> items = upload.parseRequest(request);
for (FileItem fileItem : items) {
if (fileItem.isFormField()) {
param.put(fileItem.getFieldName(), fileItem.getString("utf-8"));
}
}
} catch (Exception e) {
e.printStackTrace();
}
需增加jar包
<!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.3</version>
</dependency>
<!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
四 直接获取所有参数
request.getQueryString() 只适用于GET方法,
返回String,获取的参数形式:a=1&b=2&c=3
比如客户端发送http://localhost/testServlet?a=b&c=d&e=f,通过request.getQueryString()得到的是a=b&c=d&e=f
request.getParameterMap() 适用于GET、POST-表单
返回Map,其中Map的key是参数的名称,value(数组)是参数的值
如请求参数为a=1&b=2&c=3&c=4
则key=a value=[1]
key=c value=[3, 4]
Map<String, String[]> a = request.getParameterMap();
Set<String> keys = a.keySet();
for(String key : keys){
String[] b = a.get(key);
}
request.getReader()返回的是字符串
request.getInputStream()返回的是字符节数组
这两个方式适用于POST提交的所有类型,包括application/json(json字符串)、application/x-www-form-urlencoded表单(a=1&b=2&c=3)、multipart/form-data(含有一些杂七杂八的内容)、application/xml
int len = request.getContentLength();
ServletInputStream iii = request.getInputStream();
byte[] buffer = new byte[len];
iii.read(buffer, 0, len);
System.out.println(new String(buffer));
BufferedReader br = request.getReader();
String str, wholeStr = "";
while((str = br.readLine()) != null){
wholeStr += str;
}
System.out.println(wholeStr);
五 注意事项
@RequestBody、 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()在同一个响应中是不能混合使用的,如果混合使用就会抛异常