最近做项目时,发现手机客户端通过http协议post方式上传数据到服务端,在服务器端通过request.getInputStream()能获取到相应的数据,但用request.getParameter()却获取不到数据。这是怎么回事呢,后来发现这种情况跟form表单的属性 enctype有关系。

HTML中的form表单有一个关键属性 enctype=application/x-www-form-urlencoded 或multipart/form-data。

1、enctype="application/x-www-form-urlencoded"是默认的编码方式,当以这种方式提交数据时,HTTP报文中的内容是:

POST /post_test.php HTTP/1.1
Accept-Language: zh-CN
User-Agent: Mozilla/4.0
Content-Type: application/x-www-form-urlencoded
Host: 192.168.12.102
Content-Length: 42
Connection: Keep-Alive
Cache-Control: no-cache title=test&content=%B3%AC%BC%B6%C5%AE%C9%FA&submit=post+article

Servlet的API提供了对这种编码方式解码的支持,只需要调用ServletRequest 类中的getParameter()方法就可以得到表单中提交的数据。

2、在传输大数据量的二进制数据时,必须将编码方式设置成enctype="multipart/form-data",当以这种方式提交数据时,HTTP报文中的内容是:

POST /post_test.php?t=1 HTTP/1.1
Accept-Language: zh-CN
User-Agent: Mozilla/4.0
Content-Type: multipart/form-data; boundary=---------------------------7dbf514701e8
Accept-Encoding: gzip, deflate
Host: 192.168.12.102
Content-Length: 345
Connection: Keep-Alive
Cache-Control: no-cache -----------------------------7dbf514701e8
Content-Disposition: form-data; name="title"
test
-----------------------------7dbf514701e8
Content-Disposition: form-data; name="content"
....
-----------------------------7dbf514701e8
Content-Disposition: form-data; name="submit"
post article
-----------------------------7dbf514701e8--

如果以这种方式提交数据就要用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()在同一个响应中是不能混合使用的,如果混合使用会抛异常的。

request.getParameter()获取不到数据的问题的更多相关文章

  1. request.getParameter()获取不到数据

    HTML中的form表单有一个关键属性 Content-Type=application/x-www-form-urlencoded 或multipart/form-data. 1. Content- ...

  2. ajax post 请求 ,java端使用 request.getParameter 获取不到数据问题

    js端 $.ajax({ type:'POST', data:{a:1}, url:_this.apiUrl+url, dataType:'json',//使用jsonp方式请求 contentTyp ...

  3. servlet 表单加上multipart/form-data后request.getParameter获取NULL(已解决)

    先上结论(可能不对,因为这是根据实践猜测而来,欢迎指正) 表单改为multipart/form-data传值后,数据就不能通过普通的request.getParameter获取. 文件和文件名通过Fi ...

  4. request.getparameter() 获取中文出现乱码 问题

    http请求是以ISO-8859-1的编码来传送url的 如果页面的content-type为utf-8,那么在发送请求时,会将字符转成utf-8后进行传送 如: 中 的UTF-8编码为:E4 B8 ...

  5. setCharacterEncoding 是在request.getParameter获取参数之前 设置request的编码格式 一步到位

    setCharacterEncoding 是在request.getParameter获取参数之前 设置request的编码格式 一步到位

  6. request.getParameter()获取URL中文参数乱码的解决办法

    这个问题耽误好长时间,URL传中文参数出现乱码,就算首次使用request接收就添加 request.setCharacterEncoding("UTf-8"); 依然报错不误. ...

  7. 解决当FORM的ENCTYPE="multipart/form-data" 时request.getParameter()获取不到值的方法

    部分转载于: http://blog.csdn.net/georgejin/article/details/1706647 http://www.cnblogs.com/loveyunk/p/6089 ...

  8. 过滤器中处理multipart/form-data头部的post请求request.getParameter(")获取不到参数问题

    如果不是文件类型请求,我们使用request.getParameter("");方法是可以获取到参数内容的,如果是文件类型的请求即请求的头部信息为“multipart/form-d ...

  9. jquery通过ajax-json访问java后台传递参数,通过request.getParameter获取不到参数的说明

    http://m.blog.csdn.net/blog/eyebrother/36007145 所以当后台通过request.getParameter("name");对参数值的作 ...

随机推荐

  1. node.js - 定义全局变量

    1,定义全局变量 app.set('name','八戒') 2,获取全局变量 app.get('name')

  2. node - 路由的使用

    一,服务器文件 app.js  .( 要使用路由的文件)   const express = require('express') const app = express() const swig = ...

  3. XV6操作系统代码阅读心得(五):文件系统

    Unix文件系统 当今的Unix文件系统(Unix File System, UFS)起源于Berkeley Fast File System.和所有的文件系统一样,Unix文件系统是以块(Block ...

  4. Photoshop 更换证件照底色

    1.打开photoshop CS6. 2.打开照片 (上栏)文件---->打开 或者,直接把照片拖进ps中.  3.复制图层 右击背景,点击复制图层 (复制图层的作用是,如果对图层操作错误,可以 ...

  5. JPA#Interfaces总结

    _开局一张图,内容全靠编 震惊:某小白熟练使用了JpaRepository和JpaSpecificationExecutor,就在简历上写下了,精通SpringData Jpa. 震惊,如果想熟练的使 ...

  6. 十七、SAP中使用SQL语句读取一条数据

    一.需要说明的是SAP不同类型的结构体类型之间是不能随意赋值的,如果需要赋值,可以使用CORRESPONDING FIELDS OF关键字, 不同类型结构体中同名的成员会被赋值,代码如下: 二.输出代 ...

  7. 004、mysql使用SHOW语句找出服务器上当前存在什么数据库

    SHOW DATABASES; 不忘初心,如果您认为这篇文章有价值,认同作者的付出,可以微信二维码打赏任意金额给作者(微信号:382477247)哦,谢谢.

  8. crontab 实现Linux系统上定时任务的关键命令

    附上原文链接 https://www.cnblogs.com/ftl1012/p/crontab.html 原文真是写得非常好,所谓他山之石可以攻玉~,我就不客气啦,哈哈

  9. jquery播放mp3

    $("button").on("click",function(){    $('embed').remove();            $('body'). ...

  10. Python学习——装饰器/decorator/语法糖

    装饰器 定义:本质是函数,为其他函数添加附加的功能. 原则:1.不能修改原函数的源代码 2.不能修改被原函数的调用方式 重点理解: 1.函数即“变量” 2.高阶函数:返回值中包含函数名 3.嵌套函数 ...