无法在servlet问题中检索Ajax请求参数

时间:2011-10-16 21:03:22

标签: javascript ajax servlets parameters

作为学习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不起作用?

编辑II

这是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仍有同样的问题。

2 个答案:

答案 0 :(得分: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'builtin encodeURIComponent()函数:

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

对于具体的问题

无关,我知道你正在学习Ajax,但我建议你看一下现有的JavaScript库,它带来了所有令人讨厌和跨浏览器敏感的细节发送Ajax请求并遍历/操纵HTML DOM,例如jQuery。在这个相关的问题中,你可以找到一些很好的例子,如何开始使用jQuery + Servlets:How to use Servlets and Ajax?

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

答案 1 :(得分:1)

确实存在同样的问题,为了文档,解决方案是我的Javascript代码,

发送&#34;表单数据&#34;在你的AJAX帖子中,你需要像这样设置一个标题..

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

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