全部博文(2065)
分类: 系统运维
2010-05-14 08:57:57
JQuery实现分步AJAX提交数据
[整理时间:
案例情况:
1、客户提交一个请求之后服务器需要响应的时间过长。比如五分钟。如果需要使用AJAX的方式进行提交的话那用户是需要等待非常长的时间。用户体验第一的今天这种情况似乎不太好。当然你可以选择使用异步处理服务器的内容。也可以这样来处理,服务器分三步比如说。第一步做完之后返回客户说:我完成了第一步现在开始做第二步。这样的话客户至少知道服务器没有死机。还在执行。现在就来研究一下如何实现这种服务器分批次返回数据信息的情况。我们以JSP + JQuery为例说明!
其中服务层JSP:做一个动作插入30万条记录到数据库。每插入完10万条就返回一条消息给客户端。
核心代码如下:
1、 servlets的代码如下:
public void doGet(HttpServletRequest request, HttpServletResponse
response) throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
response.setCharacterEncoding("utf-8");
int count = Integer.parseInt(request.getParameter("count"));
try {
tool.ajaxtest(count);
if (count == 1) {
out.print("THE FIRST
IS OK");
} else if (count == 2) {
out.print("THE SECOND
IS OK");
} else if (count == 3) {
out.print("THE FOUR IS
OK");
} else {
out.print("all");
}
} catch (SQLException e) {
e.printStackTrace();
}
out.flush();
out.close();
}
依据客户端传过来的变量进行变更处理!
其中ajaxtest方法如下:
public void ajaxtest(int count) throws SQLException {
long i=0;
while(true) {
init();
i++;
if (i>300) break;
}
}
在这里面我们只是简单的做一个批量插入动作即往数据库里面插入300。
3、客户端的JS代码如下
<script type="text/JavaScript" src="scripts/jquery-
<script type="text/javascript">
function ajaxtest(count) {
$.ajax({
type:"GET",
url: "/servlet/TestAjax?count="+count,
cache:false,
timeout:100000,
success:function(msg){
if(msg=="all") {
alert("全部结束");
} else {
alert(msg);
ajaxtest(parseInt(count)+1);
}
}
})
}
script>
递归调用同一个AJAX请求的方法。等回复的数据之后再次发起一个新的请求。
说明:
1、服务器的逻辑如何划分。这个是一个业务性的问题。可以依据客户端上传过来的参数值实现不同的业务逻辑。
在测试过程中发现了一个问题。
客户端将一个请求丢给服务器之后,服务器如果是开始往数据表里面做一个动作代码如下:
public void ajaxtest(int count) throws SQLException {
long
i=0;
while(true) {
init();
i++;
if
(i>100000) break;
}
}
这个时候就算你把resin服务中断,程序还是在一直跑。就算你把resin进程给KILL掉程序还是在一直跑。不知道resin与jvm之间是什么个调用关系的?这个将是下一个研究的重点对象。《解析Resin后面的JVM》发现只有将JVM进程给杀掉才可以将程序退出中断