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

时间:2015-05-10 10:12:02

标签: jquery ajax servlets

我正在学习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("<h2>Data Entry Added</h2><br>");
        out.println("<h2>"+request.getParameter("name")+"</h2>");
        out.println("<h2>"+request.getParameter("ssn")+"</h2>");
        out.println("<h2>"+request.getParameter("birth")+"</h2>");
        out.println("<h2>"+request.getParameter("xxxx")+"</h2>");
        out.flush();
        out.close();


    }
}

这是index.html:

<form id="inputForm">
<table style="width:80%;border:3px;">
    <tr>
        <td align="center"><input type="text" name="name" id="name" placeholder="First Last"></td>
        <td align="center"><input type="text" name="ssn" id="ssn" placeholder="111111111"></td>
        <td align="center"><input type="text" name="birth" id="birth" placeholder="MM/DD/YYYY"></td>
        <td align="center"><input type="text" name="xxxx" id="xxxx" placeholder="12345"></td>
        <td align="center"><button type="button" name="add" id="add" >Add</button></td>
        <td align="center"><button type="button" name="delete" id="delete">Delete</button></td>
    </tr>
</table>
</form>
$("#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:因此,网络应用程序一直工作到“添加”的$ ajax发送正确请求的程度。 JS功能运行良好。请求具有与属性对应的正确值。但是,在调用/ InsertServlet URL时,似乎Web应用程序只是忽略了servlet,而getParameter方法在doPost方法中都返回null。

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

1 个答案:

答案 0 :(得分:8)

您的错误出现在dataType选项的data$.ajax()属性中:

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

根据the $.ajax() documentationdataType属性指示jQuery将以什么格式返回响应(在您的情况下,仅通过HTML表示{ {1}}并且绝对不是text/html所指示的JSON。它并不代表您错误预期的请求参数的格式。并且,application/json属性必须表示URL编码的HTTP请求查询字符串符合data内容类型,因此不是JSON对象。

这解释了为什么请求参数为application/x-www-form-urlencoded

删除null属性。你不需要它,jQuery足够智能,可以根据响应的dataType标题自动检测它。

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

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

    <form id="yourFormId">
  2. 在JSON对象上使用$.param()

    data: $("#yourFormId").serialize(),
    
  3. 手动撰写URL编码的HTTP请求查询字符串。

    data: $.param({
            name: nameIn, 
            ssn: ssnIn, 
            birth: birthIn, 
            xxxx: xxxxIn
        }),
    
  4. 使用data: "name=" + encodeURIComponent(nameIn) + "&ssn=" + encodeURIComponent(ssnIn) + "&birth=" + encodeURIComponent(birthIn) + "&xxxx=" + encodeURIComponent(xxxxIn), 以及正确的内容类型。

    JSON.stringify()

    这只需要在servlet中进行更改:它必须将请求主体解析为JSON,而不是使用contentType: "application/json", data: JSON.stringify({ name: nameIn, ssn: ssnIn, birth: birthIn, xxxx: xxxxIn }), 等。由于这很繁琐,您最好通过JAX-RS Web服务替换servlet,该服务提供内置工具来透明地处理它。

  5. 使用$.post()代替getParameter()来解决具体问题

    无关会减少样板代码。

    $.ajax()

    另见: