这部分模仿了AJAX(原型/php)在脚本执行过程中获得部分状态更新,但是我正在使用JSP页面和servlet。我想做的是,当用户单击一个按钮时启动一个动作,然后显示该动作进度的更新。该操作可能需要1到10分钟才能完成,因此我不希望用户只坐在屏幕上等待响应,而是显示状态栏或某些表示事务正在进行的操作的内容。
谢谢
如果您要运行和控制一个长时间运行的流程,最好让它自己运行Thread而不是运行请求Thread。Thread在会话范围内存储对此的引用,以便客户端可以使用ajaxical请求(使用相同的会话!)向服务器端请求当前进度(并自动地使会话保持活动状态,以使其不会超时) 。
Thread
这是这种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; } }
..其映射如下:
<servlet> <servlet-name>runLongProcess</servlet-name> <servlet-class>mypackage.RunLongProcessServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>runLongProcess</servlet-name> <url-pattern>/runLongProcess</url-pattern> </servlet-mapping>
这是JSP的一个基本示例(带有一点点的jQuery和我推荐的ajaxical JS框架):
<!doctype html> <html lang="en"> <head> <title>Show progress of long running process with help of Thread and Ajax.</title> <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script> <script type="text/javascript"> $(document).ready(init); function init() { if (${not empty longProcess}) { $.progress = 0; checkProgress(); } } function checkProgress() { $.getJSON('runLongProcess', function(progress) { $('#progress').text(progress); $.progress = parseInt(progress); }); if ($.progress < 100) { setTimeout(checkProgress, 1000); } } </script> </head> <body> <form action="runLongProcess" method="post"> <p>Run long process: <input type="submit"></p> <p>Current status: <span id="progress">0</span>%</p> </form> </body> </html>
在http:// localhost:8080 / yourcontext / runLongProcess中打开它,然后单击按钮。
如果这是一个非常非常长的运行过程,则可以通过将ajax请求间隔setTimeout()增加到5秒(5000毫秒)左右来提高“效率”,这样服务器就不会感觉得到DDOS了;)
setTimeout()
希望这可以帮助。