当使用带有JSON对象的$ .ajax作为数据时,request.getParameter()返回null

我正在学习Java servlet,我为“GET”和“POST”编写了两个单独的servlet。 当向服务器发送“GET”请求时,servlet访问数据库并检索所有内容并将结果转换为Google Charts可识别的格式。 当向服务器发送“POST”请求时,servlet获取参数并将它们添加到Java对象,然后DAO将数据添加到数据库。 但是,当我在输入后点击“添加”按钮时,Web应用程序根本找不到servlet。 它只是“跳过”ajax函数并继续。 所以这是插入的servlet:

@WebServlet("/InsertServlet") public class InsertServlet extends HttpServlet { private static final long serialVersionUID = 1L; private EmployeeDao dao; public InsertServlet() throws SQLException { super(); dao = new EmployeeDao(); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("doPost"); Employee e = new Employee(); e.setName(request.getParameter("name")); e.setSSN(request.getParameter("ssn")); e.setDob(request.getParameter("birth")); e.setIncome(request.getParameter("xxxx")); dao.addEmployee(e); response.setContentType("text/html;charset=utf-8"); PrintWriter out = response.getWriter(); out.println("

Data Entry Added


"); out.println("

"+request.getParameter("name")+"

"); out.println("

"+request.getParameter("ssn")+"

"); out.println("

"+request.getParameter("birth")+"

"); out.println("

"+request.getParameter("xxxx")+"

"); out.flush(); out.close(); } }

这是index.html:

 
$("#add").click(function() { var nameIn = $('#name').val(); var ssnIn = $('#ssn').val(); var birthIn = $('#birth').val(); var xxxxIn = $('#xxxx').val(); if (validate(nameIn, ssnIn, birthIn, xxxxIn) === true) { xxxxIn = "\$" + xxxxIn; var ssn1 = ssnIn.substring(0, 3); var ssn2 = ssnIn.substring(3, 5); var ssn3 = ssnIn.substring(5); ssnIn = ssn1 + '-' + ssn2 + '-' + ssn3; $.post("InsertServlet", $("#inputForm").serialize(), function(responseHtml) { $('#state').html(responseHtml); }); window.setTimeout(redraw, 1000); redraw(); } });

编辑1:因此,Web应用程序一直工作到“add”的$ ajax发送正确请求的位置。 JSfunction运行良好。 请求具有与属性对应的正确值。 但是,在调用/ InsertServlet URL时,似乎Web应用程序只是忽略了servlet,而getParameter方法在doPost方法中都返回null。

编辑2:Tomcat版本:7.0.61。 JDK版本:1.7.0_45。 Servlet版本:3.0

您的错误在$.ajax()选项的dataTypedata属性中:

  $.ajax({ type:"POST", url:"InsertServlet", dataType:"json", data: { name: nameIn, ssn: ssnIn, birth: birthIn, xxxx: xxxxIn }, // ... 

根据$.ajax()文档 , dataType属性指示jQuery以何种格式返回响应 (在你的情况下,就像text/html所指示的那样只是HTML,而不是application/json指示的application/json )。 它并不代表您错误预期的请求参数的格式。 并且, data属性必须表示URL编码的HTTP请求查询字符串符合application/x-www-form-urlencoded内容类型,因此不是JSON对象。

这解释了为什么请求参数为null

删除dataType属性。 你在这里不需要它,jQuery足够聪明,可以根据响应的Content-Type标头自动检测它。

data属性修复为真正的URL编码的HTTP请求查询字符串。 您可以通过以下方式之一执行此操作:

  1. 在表单上使用$.serialize() 。 给定

     data: $("#yourFormId").serialize(), 
  2. 在JSON对象上使用$.param()

     data: $.param({ name: nameIn, ssn: ssnIn, birth: birthIn, xxxx: xxxxIn }), 
  3. 手动编写URL编码的HTTP请求查询字符串。

     data: "name=" + encodeURIComponent(nameIn) + "&ssn=" + encodeURIComponent(ssnIn) + "&birth=" + encodeURIComponent(birthIn) + "&xxxx=" + encodeURIComponent(xxxxIn), 
  4. 使用JSON.stringify()以及适当的内容类型。

     contentType: "application/json", data: JSON.stringify({ name: nameIn, ssn: ssnIn, birth: birthIn, xxxx: xxxxIn }), 

    这只需要在servlet中进行更改:它必须将请求体解析为JSON,而不是使用getParameter()等。 由于这很繁琐,您最好用JAX-RS Web服务替换servlet,它提供内置工具来透明地处理这个问题。


具体问题无关 ,使用$.post()而不是$.ajax()会减少样板代码。

 $.post("InsertServlet", $("#yourFormId").serialize(), function(responseHtml) { $('#state').html(responseHtml); }); 

也可以看看:

  • 如何使用Servlets和Ajax?