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

War*_*007 2 ajax jquery 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();


    }
}
Run Code Online (Sandbox Code Playgroud)

这是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();
            }
        });
Run Code Online (Sandbox Code Playgroud)

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

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

Bal*_*usC 8

你的错误是在dataType和data属性$.ajax()选项:

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

按照该$.ajax()文件,该dataType物业在什么格式指示jQuery的响应将返回(这是在你的情况下,通过由指定的方式只是HTML text/html,绝对不是JSON所指示application/json).它并不代表您错误预期的请求参数的格式.并且,该data属性必须表示URL编码的HTTP请求查询字符串符合application/x-www-form-urlencoded内容类型,因此不是JSON对象.

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

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

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

  1. $.serialize()在表格上使用.鉴于<form id="yourFormId">:

    data: $("#yourFormId").serialize(),
    
    Run Code Online (Sandbox Code Playgroud)
  2. 使用$.param()JSON对象上:

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

    data: "name=" + encodeURIComponent(nameIn) 
       + "&ssn=" + encodeURIComponent(ssnIn)
       + "&birth=" + encodeURIComponent(birthIn)
       + "&xxxx=" + encodeURIComponent(xxxxIn),
    
    Run Code Online (Sandbox Code Playgroud)
  4. 使用JSON.stringify()适当的内容类型一起.

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

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


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

$.post("InsertServlet", $("#yourFormId").serialize(), function(responseHtml) {
    $('#state').html(responseHtml); 
});
Run Code Online (Sandbox Code Playgroud)

也可以看看: