【问题标题】:Servlet gets blank data from Javascript XHR occasionallyServlet 偶尔会从 Javascript XHR 获取空白数据
【发布时间】:2014-07-09 07:23:30
【问题描述】:

我正在从 Javascript 向 servlet 发送一些参数。有时,servlet 会接收一组空参数(通过 servlet 代码开头的System.out.println() 进行检查)。
然而,在调用 XHR.send 之前,这些参数在 Javascript 中正确生成(通过 console.log() 检查)

其他背景:
servlet 从一些数据文件生成电子表格,因此有时会有点密集。

示例代码

web.xml:

<servlet>
    <description>Export Servlet</description>
    <display-name>ExportServlet</display-name>
    <servlet-name>ExportServlet</servlet-name>
    <servlet-class>testpkg.ExportServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>ExportServlet</servlet-name>
    <url-pattern>/ExportServlet</url-pattern>
</servlet-mapping>

JAVASCRIPT:common.js: 函数 sendDataToServer(args...) {

    // ... Some Code...
    var params = "param1=" + value1 + "&param2=" + value2;
    console.log(params); // This works perfectly!

    // AJAX Code
    var xmlhttp;
    // Handling browsers
    if (window.XMLHttpRequest)
    {
        // code for IE7+, Firefox, Chrome, Opera, Safari
        xmlhttp=new XMLHttpRequest();
    }
    else
    {
        // code for IE6, IE5
        xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
    }
    xmlhttp.onreadystatechange = function()
    {
        if (xmlhttp.readyState == 4 && xmlhttp.status == 200)
        {
            // MARKER 1.0
            alert("Success");
        }
    };
    xmlhttp.open('POST', 'ExportServlet', false);
    xmlhttp.setRequestHeader('Content-type','application/x-www-form-urlencoded;charset=UTF-8');
    console.log(params); // This works perfectly!
    // Sending data...
    xmlhttp.send(params); 
}

SERVLET:ExportServlet.java

protected void doPost(HttpServletRequest request, HttpServletResponse response) 
throws ServletException, IOException 
{
    // Init Code...
    response.setHeader("Cache-Control", "no-cache");
    response.setHeader("Pragma", "no-cache");
    request.setCharacterEncoding("UTF-8");
    try
    {
        // Get paramaters
        String sParam1 = request.getParameter("param1");
        String sParam2 = request.getParameter("param2");
        // Test print params...
        System.out.println("Param1 Value = " + sParam1); // Occasionally NULL
        System.out.println("Param2 Value = " + sParam2); // Occasionally NULL

        // More Code...
    }
    catch (Exception ex)
    {
        throw ex;
    }
}

注意空参数不是由于数据问题,因为我在几分钟前工作的完全相同的数据用例中遇到了这个错误。通常这是在重复执行相同步骤时随机发生的。

知道为什么会发生这种情况吗?

【问题讨论】:

    标签: java javascript ajax servlets


    【解决方案1】:

    试试

    xmlhttp.open("POST","ExportServlet?param1=" + value1 + "&param2=" + value2,true);
    xmlhttp.send();
    

    而不是

    xmlhttp.open('POST', 'ExportServlet', false);
    xmlhttp.send(params);
    

    或者你可以使用 JQUERY AJAX

    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7/jquery.min.js"></script>
    <script>
    function sendDataToServerWithJquery(value1,value2) {
        var params ={"param1":value1,"param2":value2};
        /*
        OR
        var params = "param1=" + value1 + "&param2=" + value2;
        */
    
                 $.ajax({type: "POST",
                url:"ExportServlet",
                data:params,
                success:function(result){
                alert("Success");
                }
              });
    }
    </script>
    <form action="ExportServlet">
    
    <input type="button" onclick="sendDataToServerWithJquery('P1','P2')" value="Submit Values">
    
    </form>
    

    注意:使用input type="button" 而不是input type="submit" Refer

    【讨论】:

    • JQuery AJAX 做到了。谢谢。
    【解决方案2】:

    检查以下几行你会发现错误。

    var params = "parm1=" + value1 + "&parm2=" + value2;
    

    在 JavaScript 中

    String sParam1 = request.getParameter("param1");
    String sParam2 = request.getParameter("param2");
    

    在你的 servlet 中

    【讨论】:

    • 该代码只是一个说明性代码。我没有使用我在实际代码中使用的实际 var 名称。 parm vs param 如果你是这个意思,那只是一个疏忽。不过还是改正了。 注意这肯定不是数据问题,因为即使使用相同的数据有时也会发生这种情况
    • 我希望在您捕获变量时不会出现类型匹配错误。
    【解决方案3】:

    我建议您可以使用 firebug firefox 插件来监视网页中的每个 XHR 调用,并检查 XHR 发布请求发送的确切值,以及请求标头和其他一些选项,根据您的情况,如果我是开发者,我会先尝试通过原生Web表单将parm1和parm2值发布到servlet,如果逻辑流程中没有空值,则切换到XHR调用。 顺便说一句,我建议您使用 jQuery 发送 XHR 请求,它更容易,请查看文档: http://api.jquery.com/jquery.ajax/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-05
      • 2019-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-08
      • 1970-01-01
      • 2011-12-22
      相关资源
      最近更新 更多