如果您要运行和控制一个长时间运行的流程,最好让它自己运行
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; }}..其映射如下:
<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了;)
希望这可以帮助。



