gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 20:14:24 24 4
gpt4 key购买 nike

作为学习 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);

}

}

编辑三

这是我的 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"/>

编辑四

将我的 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 仍然有同样的问题。

最佳答案

您正在创建一个 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 + Servlet:How to use Servlets and Ajax?

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

关于javascript - 无法在 servlet 问题中检索 Ajax 请求参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7787310/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com