小编典典

将$ .ajax和JSON对象用作数据时,request.getParameter()返回null

ajax

我正在学习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:因此,Web应用程序一直运行到“添加”的$ajax发送适当请求的地步。JS函数运行良好。该请求具有与属性相对应的正确值。但是,当调用/InsertServlet URL时,Web应用程序似乎只是忽略了servlet,而getParameter方法在doPost方法中都返回null。

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


阅读 244

收藏
2020-07-26

共1个答案

小编典典

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

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

按照$.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(),
    
  2. 使用$.param()JSON对象上:

    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,该Web服务提供内置的功能来透明地处理此问题。


具体问题 无关
,使用$.post()代替$.ajax()可以减少样板代码。

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