HTML5 FormData在Java Servlet请求中使用request.getParameter()返回null。

9
我的看法是使用HTML5。我正在使用FormData将AJAX 2 POST到Servlet。在Servlet内部,我试图读取请求参数。但我无法看到任何参数。然而,Google Chrome Dev控制台显示请求有效负载。如何在Servlet代码中获取相同的内容?任何帮助将不胜感激。这里是代码。
JS代码
var xhr = new XMLHttpRequest();
var formData = new FormData();
formData.append('firstName', 'ABC');
formData.append('lastName', 'XYZ');

xhr.open("POST", targetLocation, true);
xhr.send(formData);

Servlet代码(两个参数都返回null

out.println("Hello! "+ request.getParameter("firstName")+ " "+ request.getParameter("lastName")+ ", thanks for sending your feedback." );

谷歌浏览器控制台

Content-Disposition: form-data; name="firstName"
XYZ
Content-Disposition: form-data; name="lastName"
ABC

请提供Servlet的doPost()方法的更多代码。 - Hardik Mishra
1个回答

19
HTML5的FormData API 发送一个multipart/form-data请求。它最初是为了能够通过新版本2的XMLHttpRequest通过ajax上传文件而设计的。在以前的版本中上传文件是不可能的。
默认情况下,request.getParameter()只识别application/x-www-form-urlencoded请求。但你正在发送一个multipart/form-data请求。你需要使用@MultipartConfig注释你的servlet类,这样你才能通过request.getParameter()获取它们。
@WebServlet
@MultipartConfig
public class YourServlet extends HttpServlet {}

如果您还没有使用Servlet 3.0,可以使用Apache Commons FileUpload。有关这两种方法的更详细答案,请参见:如何使用JSP / Servlet上传文件到服务器?

如果您根本不需要上传文件,请改用“标准”XMLHttpRequest方法。

var xhr = new XMLHttpRequest();
var data = "firstName=" + encodeURIComponent(firstName)
        + "&lastName=" + encodeURIComponent(lastName);
xhr.open("POST", targetLocation, true);
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xhr.send(data);

这样一来,您的Servlet就不再需要@MultipartConfig了。
另请参见:

嗨Balus,感谢您的帖子。您的答案准确简洁。FormData对于我的简单应用程序来说有些过度了。我认为使用简单的XMLHttpRequest更好。但是,我有一个简单的问题,如何使用xhr发送请求参数?我知道有一个名为send()的方法可以输入。我该如何使用它? - user655577
构建一个 URL 编码的查询字符串。例如:"name1=value1&name2=value2&name3=value3" 并将其传递给 send()。然而,更容易的方法是使用 jQuery。这样可以避免自己编写 XMLHttpRequest 样板代码(以及担心跨浏览器问题)。还可以参见文档和示例:http://api.jquery.com/jQuery.post/ - BalusC
是的,我明白了。它正在工作。我喜欢jQuery框架,因为它可以处理很多样板文件,就像你提到的那样。但是,使用jQuery,我如何检查像这样的东西: if (typeof xhr.withCredentials === undefined) { //做某事 } else { //做其他事情 } 因为我没有xhr句柄? - user655577
谢谢,讲解得非常好 :) - Adi Prasetyo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接