在请求dispatcher.forward方法之后从另一个servlet调用servlet

时间:2014-09-15 18:03:00

标签: java jsp servlets

我正在使用java servlet编写网页。当用户订阅时,他将收到带有激活链接的电子邮件。目前,servlet在发送电子邮件后将用户(使用请求调度程序)重定向到感谢页面,这需要一些时间。我想在创建和发送电子邮件之前将用户重定向到页面,然后由另一个servlet执行电子邮件创建,而无需用户等待。这可能吗?在使用request dispatcher.forward方法后,如何从另一个servlet中调用servlet?那可能吗?如果没有,那么做我想做的最好的方法是什么?感谢。

3 个答案:

答案 0 :(得分:1)

你的问题实际上有两个不同的问题:

  • 您想要重定向到另一个页面
  • 您希望在重定向后继续处理

从servlet重定向到另一个URL很简单,只需调用:

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

对于第二部分,似乎可以在向客户端发送响应之后继续在servlet 中进行处理。从我在Tomcat 7 servlet容器上的测试中,如果ContentLength设置为0(因为body为空)并且输出流已关闭,则可以这样做。我永远无法从servlet规范中得到确认,但正如我上面所写,它适用于Tomcat:

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

答案 1 :(得分:0)

要从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");

编辑: 您可以使用boolean创建一个方法,该方法将用户重定向到感谢页面,成功后,然后处理电子邮件:

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

在Servlet中:

if(redirect){ processEmail(parameters); } 结束编辑

然后,在要发送电子邮件的servlet中,使用session获取添加到响应中的电子邮件。 String email = (String) session.getAttribute("email");

希望这有帮助。

答案 2 :(得分:0)

根据您的说明,您希望向用户返回消息,然后处理“在后台”电子邮件请求。它不应该通过其他servlet完成。如果您具有支持JMS的Java EE服务器,那么这是JMS和MDB的典型任务。您的servlet只是将消息电子邮件发送请求放入队列并将消息返回给用户。 MDB会接收该消息并对其进行处理,然后发送电子邮件。

产生的方法在您测试时是可行的,并且应该在大多数服务器中工作,但是不鼓励它。请参阅此处的一些讨论Why spawning threads in Java EE container is discouraged?

在Java EE 7中,您将通过并发实用程序 - Concurrency Utilities tutorial

获得对它的支持