簡體   English   中英

在請求dispatcher.forward方法之后,從另一個servlet調用一個servlet。

[英]Calling a servlet from another servlet after the request dispatcher.forward method

我正在使用Java Servlet編寫網頁。 當用戶訂閱時,他將收到一封帶有激活鏈接的電子郵件。 當前,該servlet在發送電子郵件后將用戶(使用請求分配器)重定向到“謝謝”頁面,這需要一些時間。 我想在創建和發送電子郵件之前將用戶重定向到頁面,然后由另一個servlet執行電子郵件創建,而無需用戶等待。 這可能嗎? 使用請求dispatcher.forward方法后,如何在另一個servlet中調用一個servlet? 那可能嗎? 如果沒有,那么做我想要的最好的方法是什么? 謝謝。

實際上,您的問題中有2個不同的問題:

  • 您想重定向到另一個頁面
  • 您想在重定向后繼續處理

從servlet重定向到另一個URL很簡單,只需調用:

response.sendRedirect("url?param=value");

對於第二部分,似乎可以將響應發送到客戶端之后繼續在servlet中進行處理。 根據我在Tomcat 7 Servlet容器上的測試,如果ContentLength設置為0(因為主體為空)並且關閉了輸出流,則可以這樣做。 我永遠無法從servlet規范中得到確認,但是正如我上面所寫的,它在Tomcat上有效:

response.sendRedirect("url?param=value");
response.setContentLength(0);
response.getOutputStream().close();
// continue after connection with client is closed
// generate and send email

要從Servlet調用另一個Servlet,請不要使用request.getRequestDispatcher("xxx").forward(req,res); 但是您可以使用response.sendRedirect("servletname or path to the servlet");

您還可以將參數添加到response.SendRedirect("xxx"); 這樣接收者將使用該參數發送電子郵件。 向response.sendRedirect添加參數response.sendRedirect("<servletname>?email="+email); 這將使用新的網址公開用戶的電子郵件地址。

根據您的問題,您可以執行以下操作: request.getRequestDispatcher("page/to/display/user").forward(req,res); session.setAttribute("email","username of user"); response.sendRedirect("servlet/to/redirect"); request.getRequestDispatcher("page/to/display/user").forward(req,res); session.setAttribute("email","username of user"); response.sendRedirect("servlet/to/redirect");

編輯:您可以使用boolean創建一個方法,該方法將成功時將用戶重定向到“謝謝”頁面,然后處理電子郵件:

public boolean redirect(HttpServlet request, HttpServlet){ response.sendRedirect("<servletname>"); return true; }

在Servlet中:

if(redirect){ processEmail(parameters); } if(redirect){ processEmail(parameters); }結束編輯

然后,在要發送電子郵件的servlet中,使用session獲取添加到響應中的電子郵件。 String email = (String) session.getAttribute("email");

希望這可以幫助。

根據您的描述,您希望將消息返回給用戶,然后處理“后台”電子郵件請求。 不應通過其他servlet完成。 如果您具有支持JMS的Java EE服務器,則這是JMS和MDB的典型任務。 您的servlet會將消息電子郵件發送請求放入隊列,然后將消息返回給用戶。 MDB將提取該消息並進行處理,然后發送電子郵件。

經過測試,可以使用生成工具的方法可行,並且可以在大多數服務器中使用,但是不建議使用。 為什么不鼓勵在Java EE容器中生成線程?

在Java EE 7中,您將通過並發實用程序來支持它-Concurrency Utilities教程

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM