HTML中的form表单有一个关键属性 enctype=application/x-www-form-urlencoded 或multipart/form-data。
1、enctype="application/x-www-form-urlencoded"是默认的编码方式,当以这种方式提交数据时,HTTP报文中的内容是:
Html代码 <spanstyle="font-size:small;">POST/post_test.phpHTTP/1.1Accept-Language:zh-CNUser-Agent:Mozilla/4.0Content-Type:application/x-www-form-urlencodedHost:192.168.12.102Content-Length:42Connection:Keep-AliveCache-Control:no-cachetitle=test&content=%B3%AC%BC%B6%C5%AE%C9%FA&submit=post+article</span>
Servlet的API提供了对这种编码方式解码的支持,只需要调用ServletRequest 类中的getParameter()方法就可以得到表单中提交的数据。
2、在传输大数据量的二进制数据时,必须将编码方式设置成enctype="multipart/form-data",当以这种方式提交数据时,HTTP报文中的内容是:
Html代码 <spanstyle="font-size:small;">POST/post_test.php?t=1HTTP/1.1Accept-Language:zh-CNUser-Agent:Mozilla/4.0Content-Type:multipart/form-data;boundary=---------------------------7dbf514701e8Accept-Encoding:gzip,deflateHost:192.168.12.102Content-Length:345Connection:Keep-AliveCache-Control:no-cache-----------------------------7dbf514701e8Content-Disposition:form-data;name="title"test-----------------------------7dbf514701e8Content-Disposition:form-data;name="content"....-----------------------------7dbf514701e8Content-Disposition:form-data;name="submit"postarticle-----------------------------7dbf514701e8--</span>
如果以这种方式提交数据就要用request.getInputStream()或request.getReader()来获取提交的数据 ,用 request.getParameter()是获取不到提交的数据的。
最后注意request.getParameter()、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.getInputStream()和 request.getReader()在同一个响应中是不能混合使用的,如果混合使用会抛异常的。