1.request.getParameter(String s)

1.1 返回:
Map (String,String),当参数中存在重复的key时,用这个方法只能获取到其中一个的值。

1.2 获取参数范围:

  1. 请求url的Query String部分
    在这里插入图片描述
  2. 编码类型为application/x-www-form-urlencoded(参数被放入到Form Data)
    在这里插入图片描述

注意:当Content-Type设置为 “application/json” ,请求参数是会被放入Reqest Payload
在这里插入图片描述

2.request.getParameterMap()

2.1返回:
Map(String, String[]),当参数中存在重复的key时,这个方法会把这个key的所有值,以数组的形式接收。在使用时需要注意。

2.2 获取参数范围:
同request.getParameter(String s)

3.request.getInputStream()

3.1返回:
getInputStream方法返回一个代表实体内容的输入流对象,类型为javax.servlet.ServletInputStream,可以读取HTTP请求消息中的实体内容。如果实体内容中包含二进制数据,那么就只能使用此方法返回的输入流对象来读取。

4.request.getReader()

4.1返回:
getReader方法用于返回一个代表实体内容的BufferReader对象,返回的BufferReader对象将实体内容中的字节数据按照请求消息中指定的字符集编码转换成文本字符串。

总结

  1. Query String的参数通过request.getParameter()获取。

  2. 当content-type为application/x-www-form-urlencoded时,用request.getParameter()方法来获取请求参数值。但当请求内容不是该类型时,调用request.getInputStream()或request.getReader()方法来获取请求内容值。

    其实content-type为application/x- www-form-urlencoded时也可以直接调用request.getInputStream()或request.getReader()方法获取到请求内容再解析出具体都参数,但前提是还没调用request.getParameter()方法。此时当request.getInputStream()或request.getReader()获取到请求内容后,无法再调request.getParameter()获取请求内容。即对该类型的请求,三个方法互斥,只能调其中一个。

  3. request.getParameter()和request.getInputstream()都会从输入流读取数据(流只能读一次),request.getParameter()可以多次重复使用的原因是此方法将request的输入流数据封装到map中去了,所以可以重复获取。

  4. request.getParameter()和request.getInputstream()两个方法之间是互斥的,原因是流是不能重复读取的。而不仅request.getInputstream()会读取request的inputstream,request.getParameter()方法内部也会读取request的inputstream。

    但是当content-type为非application/x- www-form-urlencoded时,例如multipart/form-data编码时,即使先调用request.getParameter()也得不到数据,所以这时调用request.getParameter()方法对 request.getInputStream()或request.getReader()没有冲突,即使已经调用了 request.getParameter()方法也可以通过调用request.getInputStream()或request.getReader()得 到表单中的数据

  5. 当请求消息中的实体内容全部是文本数据,并且在Servlet程序中也需要以文本方式来处理这些内容时,适于使用getReader方法。如果Servlet程序不对他们进行处理,而只是存储到服务器的文件系统或数据库中,这适于使用
    getInputStream方法。

  6. 对于要处理文件上传的Servlet程序来说,只能调用getInputStream方法返回的ServletInputStream字节流对象去读取实体内容,而不能调用getReader方法。因为从ServletInputStream流对象中读取的数据是每个字节的原始内容,而从BufferedReader流对象中读取的数据是原始的内容按某种编码转换成的字符文本。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐