【发布时间】: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