我从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: function sendDataToServer(args ...) {
// ... Some Code...
var params = "param1=" + value1 + "¶m2=" + 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;
}
}
N.B。 null参数不是由于数据问题造成的,因为我收到的错误与几分钟前完全相同的数据用例有关。通常,当重复执行相同的步骤时,这是随机发生的。
知道为什么会这样吗?
答案 0 :(得分:1)
试
xmlhttp.open("POST","ExportServlet?param1=" + value1 + "¶m2=" + 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 + "¶m2=" + 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
答案 1 :(得分:0)
检查以下行,确定错误。
var params = "parm1=" + value1 + "&parm2=" + value2;
在javascript中
String sParam1 = request.getParameter("param1");
String sParam2 = request.getParameter("param2");
在你的servlet中
答案 2 :(得分:0)
我建议您可以使用firebug firefox插件监控网页中的每个XHR调用,并根据您的方案检查XHR发布请求发送的确切值,还有请求标头和其他一些选项,如果我是开发人员,我将首先尝试通过本机Web表单将parm1和parm2值发布到servlet,如果逻辑流程中没有空值,则切换到XHR调用。 顺便说一下,我建议你使用jQuery发送XHR请求,它更容易,检查文档: http://api.jquery.com/jquery.ajax/