9

我的观点是 HTML 5。我正在使用 FormData 将 AJAX 2 POST 发送到 Servlet。在 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." );

谷歌浏览器控制台

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

1 回答 1

19

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

默认情况下仅request.getParameter()识别application/x-www-form-urlencoded请求。但是您正在发送multipart/form-data请求。您需要用 注释您的 servlet 类,@MultipartConfig以便您可以通过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);

这样你就不再需要@MultipartConfig你的servlet了。

也可以看看:

于 2012-04-24T14:26:04.503 回答