最近做项目时,发现手机客户端通过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
分享到:
相关推荐
data'时request.getParameter()获取不到值的方法”这一主题时,我们首先需要理解为什么在特定情况下,传统的`request.getParameter()`方法无法正常工作,以及如何通过引入Apache Commons FileUpload库来解决这个问题...
例如,在一个简单的登录表单中,用户输入了中文用户名“张三”,但是后端通过`request.getParameter("username")`获取到的结果却是乱码,这显然会给系统的正常使用带来不便。 #### 二、原因分析 在Tomcat服务器中...
1. **数据来源不同**:`request.getParameter()`获取的是来自客户端的数据,而`request.setAttribute()`和`request.getAttribute()`是在服务器端操作,用于在请求范围中存储和获取数据。 2. **作用范围不同**:`...
然而,这种编码方式下,常规的`request.getParameter()`方法无法正确地获取到表单中的文本字段值,因为这些值被封装在了请求的多部分结构中。以下是一些解决这个问题的方法: 1. **使用Apache Commons FileUpload库...
这种方法可以将 request.getParameter() 获取到的字符串先用 ISO-8859-1 编码成字节流,然后再将其用 utf-8 解码成字符流。 解决方法二:Tomcat 配置 我们也可以通过 Tomcat 配置文件来设置 URL 编码集...
name属性则是提交到服务器的数据中的一部分,用于在服务器端通过`request.getParameter()`方法获取数据。 当在JavaScript中使用ID获取元素时,可以使用`document.getElementById('id')`这样的方法来操作DOM。但是,...
// String methodName = request.getParameter("method"); // // //根据method属性的值调用相应的方法 // if("login".equals(methodName)){ // this.login(request,response); // }else if("register".equals(method...
在Java Servlet和JSP开发中,`HttpServletRequest`接口提供了两种主要的方法来获取客户端发送到服务器的数据:`getAttribute()`和`getParameter()`。它们虽然都用于获取请求中的数据,但有着本质的区别,下面将详细...
1. **request.getParameter()**:这个方法用于获取客户端(通常是HTML表单)通过HTTP请求(GET或POST)传递到服务器端的参数。这些参数通常以键值对的形式出现在URL(GET)或请求体(POST)中。例如,当用户在表单中...
Java Web 学习之 Request 对象中 GET 和 POST 的差异 摘要:本文将对 Java Web 中 Request 对象中 GET 和 ...同时,我们应该注意到 servlet 作为控制器是不应该输出内容的,我们应该把要打印的内容放到 JSP 文件中。
例如,`Request.getParameter()`用于获取单个请求参数的值,`Request.getParameterValues()`用于获取多个同名参数的值,而`Request.getParameterNames()`则可以获取所有参数的名称。 2. 页面乱码: 页面乱码通常...
如果直接打开`requestdemo1.jsp`而不通过`input.html`提交表单,则`request.getParameter`将返回`null`,因为没有表单数据可供获取。 为了增强程序的健壮性,避免因空对象引发`NullPointerException`,我们在处理...
接着,我们使用`request.getParameter("id")`来获取URL参数`id`的值,并将其存储在请求作用域的属性中,便于后续JSP页面使用: ```java public class BBSServlet extends HttpServlet { private static final long...
例如,如果有一个名为"username"的表单字段,可以通过`request.getParameter("username")`来获取用户输入的用户名。返回的是一个String类型,如果参数不存在,会返回null。 **多值参数**:在HTML表单中,如果一个...
// 处理数据... } ``` 对于POST请求: ```java protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("UTF-8...
GET方法将数据附加到URL后面,适用于少量不敏感数据;POST方法将数据放在请求体中,适合大量或敏感数据。 三、Servlet处理表单数据 1. **解析请求**: 在Servlet的`doGet()`或`doPost()`方法中,我们可以获取请求...
- **文本框和密码框**:对于`<input type="text">`和`<input type="password">`,可以使用`request.getParameter()`方法获取数据。例如: ```java String username = request.getParameter("username"); String ...
`result.jsp`接收到表单数据后,可以使用`request.getParameter()`方法获取这些值,然后根据运算符执行相应的四则运算。例如,如果运算符是"+",则可以这样做: ```jsp ! int calculate(int num1, int num2, ...
对于表单提交的数据,可以通过`getParameter`方法获取单个字段的值,或者使用`getParameterValues`方法获取多个同名字段的值。例如,如果有多个复选框具有相同的名称,可以这样获取它们的值: ```java String[] ...
使用`request.getParameter("name")`获取单个参数值,对于有多值的参数,如`name[]`,可以使用`request.getParameterValues("name")`获取数组。 - **Cookie**: 通过`request.getCookies()`获取请求携带的所有...