2012-03-23 32 views
0

我想用ajax調用另一個JSP文件。 Ajax不會等待來自JSP的結果並重定向到下一頁。如果我通過ajax調用PHP。當JS運行重定向時,PHP文件可以使用ignore_user_abort()來避免終止。 JSP中有沒有類似的方法來做同樣的事情?jsp中有ignore_user_abort()函數嗎?

回答

3

在與請求線程不同的線程中執行任務。

你問的如何在JSP中做到這一點很奇怪。 A JSP的目的是以HTML呈現結果,而不是執行一些業務邏輯。在那裏你通常使用servlet。它還允許您更輕鬆地完成細粒度的Java任務。

好了,給一個servlet的這個基本開球例如,你必須能夠與ignore_user_abort(true)達到相同PHP:

@WebServlet("/someurl") 
public class SomeServlet extends HttpServlet { 

    private ExecutorService executor; 

    @Override 
    public void init() { 
     executor = Executors.newFixedThreadPool(10); // Create pool of 10 threads. 
    } 

    @Override 
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
     // First collect necessary request data. 
     Map<String, String> params = request.getParameterMap(); 

     // Task is your custom class which implements Callable<SomeResult> and does the job accordingly in call() method. 
     Task task = new Task(params); 

     // Task is now in a queue and will run in a separate thread of the pool as soon as possible. 
     Future<SomeResult> future = executor.submit(task); 

     // Current request will block until it's finished. If client aborts request, the task will still run in background until it's finished. 
     SomeResult someResult = future.get(); 

     // Now do your thing with SomeResult the usual way. E.g. forwarding to JSP which presents it. 
     request.setAttribute("someResult", someResult); 
     request.getRequestDispatcher("/WEB-INF/someResult.jsp").forward(request, response); 
    } 

    @Override 
    public void destroy() { 
     executor.shutdownNow(); // Very important. Or your server may hang/leak on restart/hotdeploy. 
    } 

} 

注意這一點。不要在所有的servlet上實現這個。只有那些需要這種工作的人才是絕對必要的。不要讓線程泄露給這個。

+0

感謝您的幫助!實際上,我正在使用Jquery Ajax在JSP中調用另一個URL,並且我只能編輯JSP文件以獲得結果。有什麼方法可以在JSP中做同樣的事情? – 2012-03-23 03:51:40

+0

只需將業務邏輯移出JSP到servlet即可。讓JSP根據結果動態生成HTML。 – BalusC 2012-03-23 03:57:03