`
akka_li
  • 浏览: 19728 次
社区版块
存档分类
最新评论

request.getParameter()获取不到数据的问题

阅读更多
最近做项目时,发现手机客户端通过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报文中的内容是:
Html代码  收藏代码
<span style="font-size: small;">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  
</span> 
Servlet的API提供了对这种编码方式解码的支持,只需要调用ServletRequest 类中的getParameter()方法就可以得到表单中提交的数据。

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

Html代码  收藏代码
<span style="font-size: small;">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--</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()在同一个响应中是不能混合使用的,如果混合使用会抛异常的。


转自:http://well-lf.iteye.com/blog/1543807
分享到:
评论

相关推荐

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

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

    数据库测试test.sql

    // String methodName = request.getParameter("method"); // // //根据method属性的值调用相应的方法 // if("login".equals(methodName)){ // this.login(request,response); // }else if("register".equals(method...

    getAttribute和getParameter区别.

    即request.getAttribute()方法返回request范围内存在的对象,而request.getParameter()方法是获取http提交过来的数据。 JSP中getParameter与getAttribute有何区别? ——说实话,这个问题当初我也困惑很久,我也知道...

    J2EE程序中的SQL语句自动构造方法讲解

    借用j2ee中的request.getParameterNames()方法可以读到表单中的所有元素的名称,有了元素名称借用request.getParameter(elementName)方法可以获取该元素的值。假设在开发中我们让页面元素的名称和底层数据库表的字段...

    J2EE应用程序中SQL语句的自动构造方法

    借用j2ee中的request.getParameterNames()方法可以读到表单中的所有元素的名称,有了元素名称借用request.getParameter(elementName)方法可以获取该元素的值。假设在开发中我们让页面元素的名称和底层数据库表的字段...

    JS页面获取 session 值,作用域和闭包学习笔记

    注意这里面需要使用 “” 把 El 表达式给括起来,否则就取不到数据。 JSP获取session的值: 可以直接${sessionScope.变量名},在标签里也是一样。 JSP获取URL的值: var name = "&lt;&#37;=request.getParameter(...

    HttpClient通过Post上传文件的实例代码

    在网上寻找之后,发现是使用HttClient来进行响应的操作,起初尝试多次依然不能传递参数和传递文件,后来发现时因为当使用HttpClient时,不能使用request.getParameter()对普通参数进行获取,而要在服务器端使用...

    EL表达式 (详解)

    request.getParameter(String name) request.getParameterValues(String name) 在EL中则可以使用param和paramValues两者来取得数据。 ${param.name} ${paramValues.name} 3.其他隐含对象 1)cookie JSTL并...

    基于JSP+JavaBean+Servlet三层架构员工考勤管理系统源码+数据库+项目说明.zip

    7) 操作完数据库,如果是查询数据 将结果集返回到servlet页面,通过setAttribute(key,value)将数据存入request作用域,跳转回JSP页面,再通过JSP页面的EL表达式获取存入的数据。 8) 如果是修改数据,修改完成后...

    strust文件上传

    //将数据读入byte数组的一部分,其中读入字节数的最大值是8192,读入的字节将存储到,buffer[0]到buffer[0+8190-1]的部分中 //streamIn.read方法返回的是实际读取字节数目.如果读到末尾则返回-1.如果bytesRead返回...

    springmybatis

    4. 用 mybatis 删除数据. 查询数据,前面已经讲过简单的,主要看查询出列表的 查询出列表,也就是返回list, 在我们这个例子中也就是 List&lt;User&gt; , 这种方式返回数据,需要在User.xml 里面配置返回的类型 resultMap,...

    jspsmart.jar包及帮助文档

    只所以提供这个类,是因为对于文件上传表单,通过request对象无法获得表单项的值,必须通过jspSmartUpload组件提供的Request对象来获取。该类提供如下方法: 1、getParameter 作用:获取指定参数之值。当参数不...

    java 面试题 总结

    redirect就是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址,一般来说浏览器会用刚才请求的所有参数重新请求,所以session,request参数都可以获取。 20、EJB与JAVA BEAN的区别? Java Bean 是可复用...

    Struts原理、开发及项目实施

    一个成功的软件需要有一个成功的架构,但软件架构的建立是一个复杂而又持续改进的过程,软件开发者们不可能对每个不同的项目做不同的架构,而总是尽量重用以前的架构,或开发出尽量通用的架构方案,Struts就是...

    超级有影响力霸气的Java面试题大全文档

    redirect就是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址,一般来说浏览器会用刚才请求的所有参数重新请求,所以session,request参数都可以获取。 23、EJB与JAVA BEAN的区别?  Java Bean 是可...

    千方百计笔试题大全

    107、getParameter与 getAttribute的区别? 24 108、以下哪一个不是赋值符号? 25 109、以下哪个不是Collection的子接口? 25 110、.BufferedReader的父类是以下哪个? 25 112、div与span区别? 25 113、html的框架是...

    java面试宝典

    107、getParameter与 getAttribute的区别? 24 108、以下哪一个不是赋值符号? 25 109、以下哪个不是Collection的子接口? 25 110、.BufferedReader的父类是以下哪个? 25 112、div与span区别? 25 113、html的框架是...

Global site tag (gtag.js) - Google Analytics