【问题标题】:Ajax request parameter cannot be retrieved within servlet issue无法在 servlet 问题中检索 Ajax 请求参数
【发布时间】:2011-12-08 21:28:09
【问题描述】:

作为学习 Ajax 的一部分,我创建了一个小 servlet + 一些 HTML 页面 + Javascript 代码。该页面包含几个按钮。这个想法是根据按下的按钮在请求中传递一个参数值,并在响应中返回该值。没什么疯狂的。

这是发出请求的函数(按钮在点击时链接到此函数):

function loadXMLDoc2() {
    var xmlhttp;
    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) {
            document.getElementById("myDiv").innerHTML=xmlhttp.responseText;
        }
    }
    xmlhttp.open("GET","/WebFront/Ajaxlet",true);
    var retr = this.id;
    var param = "cmd=" + retr;
    document.getElementById("L1_LEFT").innerHTML = param;
    xmlhttp.send(param);
}

L1_LEFT 元素允许我检查构造的参数(例如:cmd=bd_info)。

在servlet端调用以下方法进行请求和响应:

private void setAnswer2(HttpServletRequest req, HttpServletResponse res) throws IOException {

    Enumeration<String> iter = req.getParameterNames();

    System.out.println("Parameters=");
    while (iter.hasMoreElements()) {
        String next = iter.nextElement();
        System.out.println(next);
    }

    ...

}

但是,每次单击按钮时,都会打印出额外的参数行:

Parameters=
Parameters=
Parameters=
Parameters=
...

为什么?我做错了什么?

编辑

按照 BalusC 的解决方案,我将代码修改如下:

var retr = this.id;
var param = "cmd=" + encodeURIComponent(retr);
document.getElementById("L1_LEFT").innerHTML = param;
xmlhttp.open("POST","/WebFront/Ajaxlet",true);
xmlhttp.send(param);

    Map<String, String[]> en = req.getParameterMap();

    System.out.println("Parameters=");
    for (String next : en.keySet()) {
        System.out.println(next);
    }

GET 解决方案有效,但 POST 解决方案无效(同样的问题)。我读到 POST 比 GET 更可取。任何人都知道为什么 POST 不起作用?

编辑二

这里是servlet代码:

@WebServlet(name="Ajaxlet", urlPatterns={"/Ajaxlet"}, asyncSupported=false)
public class Ajaxlet extends HttpServlet {

    private void setAnswer2(HttpServletRequest req, HttpServletResponse res) throws IOException {

        Map<String, String[]> en = req.getParameterMap();

        System.out.println("Parameters=");
        for (String next : en.keySet()) {
            System.out.println(next);
        }

        res.setContentType("text/html");
        PrintWriter out = res.getWriter();
        out.println(System.currentTimeMillis());
        out.close();        

    }

    @Override
    public void doPost(HttpServletRequest req, HttpServletResponse res)
            throws ServletException, IOException {

        System.out.println("doPost");
        setAnswer2(req, res);

    }

}

编辑 III

这是我的web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_5.xsd">
    <servlet>
        <display-name>Ajaxlet</display-name>
        <servlet-name>Ajaxlet</servlet-name>
        <servlet-class>net.test.Ajaxlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>Ajaxlet</servlet-name>
        <url-pattern>/Ajaxlet/*</url-pattern>
    </servlet-mapping>
    <welcome-file-list>
            <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>
</web-app>

还有我的 context.xml:

<?xml version="1.0" encoding="UTF-8"?>
<Context antiJARLocking="true" path="/WebFront"/>

编辑 IV

将我的web.xml 更新为:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
      version="3.0"> 

    <welcome-file-list>
            <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>

</web-app>

POST 仍然有同样的问题。

【问题讨论】:

  • 我知道你刚才问过这个问题,但你找到答案了吗?因为现在,我正在努力解决同样的问题。
  • 不,还没有。从那以后我一直在做其他事情。

标签: javascript ajax servlets parameters


【解决方案1】:

遇到同样的问题,为了文档,解决方案在我的 Javascript 代码中,

在您的 AJAX 帖子中发送“表单数据”时,您需要像这样设置标题..

xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded") xmlhttp.send("paramName=paramValue")

来源:http://www.w3schools.com/ajax/ajax_xmlhttprequest_send.asp

【讨论】:

    【解决方案2】:

    您正在创建一个 GET 请求,然后在请求正文中发送参数。这是行不通的。为了在请求正文中发送数据,您必须创建一个 POST 请求(并在 servlet 的 doPost() 方法而不是 doGet() 中执行服务器端请求处理工作):

    xmlhttp.open("POST", "/WebFront/Ajaxlet", true);
    xmlhttp.send(param);
    

    在 GET 请求中,您通常将带有参数的查询字符串附加到请求 URL,而不是请求正文:

    xmlhttp.open("GET", "/WebFront/Ajaxlet?" + param, true);
    xmlhttp.send(null);
    

    无论请求方法如何,您都应确保参数名称和值正确地进行 URL 编码!您可以为此使用 JS 的内置 encodeURIComponent() 函数:

    var param = "cmd=" + encodeURIComponent(retr);
    

    与具体问题无关,我知道您正在学习 Ajax,但我还是建议您看看现有的 JavaScript 库,该库包含所有令人讨厌的和跨浏览器敏感的细节发送 Ajax 请求并从您的手中遍历/操作 HTML DOM,例如 jQuery。在这个相关问题中,您可以找到一些很好的示例,如何开始使用 jQuery + Servlets:How to use Servlets and Ajax?

    另一个不相关的注释,您应该更喜欢getParameterMap() 来迭代参数名称和值。它返回一个Map 而不是老式的EnumerationMap 允许您使用增强的 for 循环。

    【讨论】:

    • 我也在使用/学习 JQuery。我得到了你的 GET 解决方案,但 POST 仍然不起作用。我已经更新了我的问题。如果你或任何人知道为什么,我很感兴趣。谢谢。
    • 你实现doPost()方法了吗?
    • 是的,我仔细检查了它是通过添加显式打印语句来调用的。我一直在谷歌搜索其他代码示例,看来你的是正确的。在 Tomcat/NetBeans 级别可能有所不同。
    • 你的方法上有@Override注解吗?它是否与该注释一起编译?编辑 servlet 类后是否重新构建/重新部署/重新启动?
    • 是的,我有覆盖,它编译,我清理/重建/重新部署并重新启动 Tomcat。还是同样的问题。我将我的 servlet 代码放在我的问题中。
    猜你喜欢
    • 2012-04-11
    • 1970-01-01
    • 2019-04-04
    • 2020-08-18
    • 1970-01-01
    • 1970-01-01
    • 2015-05-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多