繁体   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