当前位置: 首页 > 面试题库 >

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

许高峻
2023-03-14
问题内容

我正在学习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


问题答案:

您的错误在于选项的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); 
    });


 类似资料:
  • 问题内容: 我正在尝试检索JSON对象(我已验证的文件格式正确)中的数据,并将数据输出到firebug控制台中。我使用JSONLint(http://jsonlint.com/)验证了JSON,并且知道数据没有在JSON对象中返回,因为当我记录它时,它是以文本而不是对象的形式记录的。当我查看ajax帖子时,有一个JSON选项卡,其中显示了该对象,出于某种原因,我只是无法检索它。 我的ajax电话是

  • 问题内容: 我有这个ajax请求,可从服务器获取数据,并且默认情况下始终是。但是有时它会从服务器返回json,所以我想检查返回的数据是否为html,然后执行A,否则执行B。可能吗? 我的jQuery 当返回的数据为时,出现此错误, 语法错误:JSON.parse:意外字符 那么如何使此代码 通用 ? 问题答案: 我不确定是否有更好的方法,但是您可以尝试…

  • 问题内容: 我不确定是否有任何方法可以这样做,但是如果有一个简单的解决方案,这将解决我的很多问题。 我需要/想要做的是在我的ajax请求成功后返回HTML和JSON。原因是,我想请求一个文件并返回该页面的所有内容,但是我还希望能够从json页面中返回指定的一组信息,因此我可以将其用于其他用途。 这就是我现在正在做的: 这就是我想要做的: 在返回的页面上,我将指定标题名称。(例如,如果是个人资料,我

  • 本文向大家介绍jQuery通过Ajax返回JSON数据,包括了jQuery通过Ajax返回JSON数据的使用技巧和注意事项,需要的朋友参考一下 服务端PHP读取MYSQL数据,并转换成JSON数据,传递给前端Javascript,并操作JSON数据。本文将通过实例演示了jQuery通过Ajax向PHP服务端发送请求并返回JSON数据。 JSON(JavaScript Object Notation

  • 问题内容: 我正在将数据发布到MVC控制器,并且试图维护状态以及乐观并发性。我目前正在回发JSON请求,但可以接受其他可行的选择吗? 我已经使用以下命令发布了名称/值集合: 我还想传递回一个(加密的)ID和时间戳数组,以便服务器可以对其进行解密,然后在保存数据之前验证数据是否仍然新鲜。 非常重要的一点是,数据对象是独立的,并且不是一个或另一个的子对象,也不是包装器数组中的子对象(由于服务器端的反射

  • 问题内容: 基本上我想做的是返回mysql查询的结果。我知道如何将查询结果的每一行放入其自己的JSON对象中,现在我正在努力寻找一种方法,以便在有多行结果将其返回给我的jquery时使用。在我的jquery中,我调用了$ .ajax()函数,对此我没有任何问题。我的问题在于成功部分,我希望能够执行以下操作: 我希望能够像JSON对象数组一样遍历结果变量。结果变量是一个字符串,由php文件的所有输出