【Servlet】getInputStream()与getParameterMap()获得Post请求的数据区别

2023-01-18 20:36:14

根据Servlet规范,如果同时满足下列条件,则请求体(Entity)中的表单数据,将被填充到request的parameter集合中(request.getParameter系列方法可以读取相关数据):
1 这是一个HTTP/HTTPS请求
2 请求方法是POST(querystring无论是否POST都将被设置到parameter中)
3 请求的类型(Content-Type头)是application/x-www-form-urlencoded
4 Servlet调用了getParameter系列方法

如果上述条件没有同时满足,则相关的表单数据不会被设置进request的parameter集合中,相关的数据可以通过request.getInputStream()来访问。反之,如果上述条件均满足,相关的表单数据将不能再通过request.getInputStream()来读取。

复制代码

Servlet Specifiaction 3.0:
3.1.1 When Parameters Are Available
The following are the conditions that mustbe met before post form data will be
populated to the parameter set:
1. The request is an HTTP or HTTPS request.
2. The HTTP method is POST.
3. The content type is application/x-www-form-urlencoded.
4. The servlet has made an initial call of any of the getParameterfamily of methods
on the request object.
If the conditions are not met and the post form data is not included in the parameter
set, the post data must still be available to the servlet via the request object’s input
stream. If the conditions are met, post form data will no longer be available for
reading directly from the request object’s input stream.

复制代码

类似的例子,还有response.getOutputStream和getWriter,它们往往也是一对矛盾体 。

从这可以看出是四个条件缺一不可的时候才能使用getParameterMap()方法来获得内容的,如果有一条不满足,就不能用这个方法。
然后我查了一下”请求的类型Content-Type“是个什么东东。于又找到一个帖子 还有很多哈,但是大概了解了一些就是:
form 中Enctype=multipart/form-data 的作用
表单中enctype=”multipart/form-data”的意思,是设置表单的MIME编码。默认情况,这个编码格式是application/x-www-form-urlencoded,不能用于文件上传;
只有使用了multipart/form-data,才能完整的传递文件数据,进行下面的操作.
在Form元素的语法中,EncType表明提交数据的格式,用 Enctype 属性指定将数据回发到服务器时浏览器使用的编码类型。
下边是说明:
(1) application/x-www-form-urlencoded:窗体数据被编码为名称/值对。这是标准的编码格式,具体的数据例子如下所示。

custname=苏林&elecontid=elecontid0001&idtype=0&idno=411303198802190512&custage=30&education=20

(2) multipart/form-data:窗体数据被编码为一条消息,页上的每个控件对应消息中的一个部分。
(3) text/plain:窗体数据以纯文本形式进行编码,其中不含任何控件或格式字符。

ENCTYPE=”multipart/form-data”用于表单里有图片上传。

<form name="userInfo" method="post" action="first_submit.jsp" ENCTYPE="multipart/form-data">

 

表单标签中设置enctype=”multipart/form-data”来确保匿名上载文件的正确编码。
如下

<tr>
<td height="30" align="right">上传企业营业执照图片:</td>
<td><INPUT TYPE="FILE" NAME="uploadfile" SIZE="34"    onChange="checkimage()"></td>
</tr>

就得加ENCTYPE=”multipart/form-data”。

表单中enctype=”multipart/form-data”的意思,是设置表单的MIME编码。默认情况,
这个编码格式是application/x-www-form-urlencoded,不能用于文件上传;
只有使用了multipart/form-data,才能完整的传递文件数据,进行下面的操作。
enctype=”multipart/form-data”是上传二进制数据; form里面的input的值以2进制的方式传过去。
form里面的input的值以2进制的方式传过去,所以request就得不到值了。

也就是说加了这段代码,用request就会传递不成功,取表单值加入数据库时,用到下面的:

SmartUpload su = new SmartUpload();//新建一个SmartUpload对象
su.getRequest().getParameterValues();取数组值
su.getRequest().getParameter( );取单个参数单个值

 

后来又查才发现如果是指上传数据的内容的话,对于不同的文件,有很多种文件,会对应各种不同的类型。只是request默认的是application/x-www-form-urlencoded,所以用getParameterMap()能获得,用getInputStream()获得不了。

  • 作者:pengzhiyuan1900
  • 原文链接:https://blog.csdn.net/pengzhiyuan1900/article/details/81667372
    更新时间:2023-01-18 20:36:14