Bootstrap

通过HttpServletRequest获取所有请求参数

一 获取请求方式、请求内容

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()在同一个响应中是不能混合使用的,如果混合使用就会抛异常

;