AJAX(prototype / java)在执行期间获得部分状态更新

这部分模仿AJAX(prototype / php)在脚本执行期间获得部分状态更新 ,但是我正在使用JSP页面和servlet。 我想要做的是在用户单击按钮时启动操作,然后显示此操作进度的更新。 该操作可能需要1到10分钟才能完成,因此我不希望用户只是坐在屏幕上等待响应,而是显示状态栏或表示事务处于什么操作部分的内容。

谢谢

如果你想运行并控制一个长时间运行的进程,最好让它在自己的Thread运行,而不是在请求的Thread 。 在会话范围中存储对此Thread的引用,以便客户端可以使用ajaxical请求(使用相同的会话!)向服务器端请求当前进度(并自动保持会话处于活动状态,以便它不会超时)。

这是一个这样的servlet的基本示例:

 package mypackage; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class RunLongProcessServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { if ("XMLHttpRequest".equals(request.getHeader("x-requested-with"))) { LongProcess longProcess = (LongProcess) request.getSession().getAttribute("longProcess"); response.setContentType("application/json"); response.getWriter().write(String.valueOf(longProcess.getProgress())); } else { request.getRequestDispatcher("runLongProcess.jsp").forward(request, response); } } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { LongProcess longProcess = new LongProcess(); longProcess.setDaemon(true); longProcess.start(); request.getSession().setAttribute("longProcess", longProcess); request.getRequestDispatcher("runLongProcess.jsp").forward(request, response); } } class LongProcess extends Thread { private int progress; public void run() { while (progress < 100) { try { sleep(1000); } catch (InterruptedException ignore) {} progress++; } } public int getProgress() { return progress; } } 

..which映射如下:

  runLongProcess mypackage.RunLongProcessServlet   runLongProcess /runLongProcess  

这里是JSP的一个基本示例(带有一个小镜头jQuery ,一个ajaxical JS框架,我顺便推荐):

    Show progress of long running process with help of Thread and Ajax.     

Run long process:

Current status: 0%

在http:// localhost:8080 / yourcontext / runLongProcess打开它,然后单击按钮。

如果这是一个真正,长期运行的过程,您可以通过将setTimeout()的ajax请求间隔增加到5秒(5000毫秒)左右来提高“效率”,这样服务器就不会感觉到DDOS了;)

希望这可以帮助。

你可能喜欢DWR 。 借助DWR,您可以向服务器发出异步请求,以获取有关特定作业进度的信息。