HTML5 FormData在Java Servlet request.getParameter()中返回null

时间:2012-04-24 05:50:01

标签: ajax html5 servlets xmlhttprequest form-data

我的观点是HTML 5.我正在使用FormData对Servlet进行AJAX 2 POST。在servlet内部我正在尝试读取请求参数。我看不到任何参数。但是,Google Chrome开发者控制台会显示请求的有效负载。如何在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." );

谷歌Chrome控制台

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

1 个答案:

答案 0 :(得分:12)

HTML5 FormData API发送multipart/form-data请求。它最初设计为能够通过ajax上传文件,使用新版本2 XMLHttpRequest。以前的版本无法上传文件。

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。有关这两种方法的更详细解答,请参阅:How to upload files to server using 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了。

另见: