急求! 解决AJAX 异步问题! + JSP - Web 开发 / Ajax
我想用AJAX实现 异步处理的应用
问题:
我从index.jsp 提交到 AjaxServlet.java 中的servlet 但是servlet 执行需要一段时间 如10分钟, 那么我在提交了之后我要跳转到一个友好页面. 提示用户 "请等待10分钟..." . 等servlet执行完成之后再将结果返回到页面. 显示结束的页面.
index.jsp 如下:
<script type="text/javascript">
//定义异步请求对象
var xmlHttp;
//创建异步请求对象的函数
function createXMLHttpRequest() {
if(window.ActiveXObject) {//如果是微软的浏览器
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
} else if(window.XMLHttpRequest) {//如果是其他类型的浏览器
xmlHttp = new XMLHttpRequest();
}
}
//向服务器发送异步请求的函数
function startRequest() {
// var userName = document.getElementById("txtName").value; //得到登录名文本框的值
createXMLHttpRequest(); //调用创建异步请求的函数
xmlHttp.onreadystatechange = handleStateChange; //当状态发生改变时,调用处理函数
//以get方式向服务器发送请求
//请求的资源路径为servlet/CheckUserServlet,并且通过URL重写的方式向该Servlet传递了一个参数
//true表示此请求为异步请求,如果为false则表示不为异步请求
xmlHttp.open("get", "./AjaxServlet.do", true);
xmlHttp.send(null); //开始向服务器发送请求
//想在提交的过程中提示到echo.jsp --- 提示页面
document.location="echo.jsp";
window.location.href="echo.jsp"; } 但是都是不能实现跳转
//处理服务器返回结果的函数
function handleStateChange() {
//var root = XMLHttpReq.responseXML;
// var res = root.getElementsByTagName("content")[0].firstChild.data;
if(xmlHttp.readyState == 4) {//表明客户端已经成功地发送请求
if(xmlHttpRe.status == 200) { //返回200表明服务器成功处理客户端的请求
alert(xmlHttp.responseText); //responseText:获得服务器返回的字符串
// 但是 responseText 没有值
}
}
}
</script>
</head>
<body>
<form name="myform" method="get" action="./AjaxServlet.do">
<table>
<tr>
<td>请输入用户名:</td>
<td>
<input id="txtName" type="text" name="txtName" />
</td>
</tr>
<tr>
<td>请输入密码:</td>
<td><input type="password" name="txtPwd" /></td>
</tr>
<tr>
<td></td>
<td>
<input type="submit" value="注册" onclick="startRequest();"/>
<input type="reset" value="重置" />
</td>
</tr>
</table>
</form>
</body>
</html>
AjaxServlet.java 代码如下:
public class AjaxServlet extends HttpServlet {
/**
*
*/
private static final long serialVersionUID = 1L;
public void doPost(HttpServletRequest request,HttpServletResponse response)
{
String name= request.getParameter("txtName");
String pwd= request.getParameter("txtPwd");
Thread thread = new Thread();
try {
thread.sleep(10000);
response.getWriter().println(name);
response.getWriter().print(pwd);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void doGet(HttpServletRequest request,HttpServletResponse response)
{
doPost(request,response);
}
}
[解决办法]
这样一直等待可能会超时的,你可以将处理过程保存在Session里面,没10秒请求一次检查状态是否改变。
[解决办法]
如果页面没有脚本错误,
window.location.href="echo.jsp";
是应该可以的。
不过,页面都跳转了,handleStateChange里面的代码就不执行了,加这些代码就没有意义了。
另外注意缓存的问题
xmlHttp.open("get", "./AjaxServlet.do", true);
你采用Get方法,url后面都没有参数,
String name= request.getParameter("txtName");
String pwd= request.getParameter("txtPwd");
自然就是null了
[解决办法]
能不能到server端确认一下response发出来没有?我一般就是在这样两边查的。
不能跳转说实话不清楚,不过如果是我的话会按执行过程跟一下,总归有个地方有问题。
[解决办法]
var win;
当AJAX请求发出的时候
win = new Ext.Window({
layout: 'fit',
width: 800,
title: '请等待。。。',
closeAction: 'hide',
autoScroll: true,
height: 450,
resizable: false,
shadow: true,
modal: true,
closable: true,
minimizable: true,
maximizable: true,
animCollapse: true
});
win.show();
等于弄一个透明图层上面显示一个window 里面放上字体提示。 如果ajax 返回成功 或者 失败 调用win.hide();隐藏此窗口即可