如何按顺序执行多个servlet?

时间:2010-06-11 17:42:19

标签: servlets sequence

我刚开始使用Servlets,并设法将一些servlet作为单独的URL来填充数据库以进行一些虚拟测试。形式的东西:

public class Populate_ServletName extends HttpServlet {
  public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
     resp.setContentType("text/plain");
     //Insert records
     //Print confirmation
  }
}

我有大约6个这样的servlet,我想按顺序执行。我正在考虑使用setLocation来设置要重定向的下一页,但不确定这是否是正确的方法,因为重定向应该在插入记录之后发生。具体来说,我正在寻找这样的东西:

public class Populate_ALL extends HttpServlet {
  public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
     resp.setContentType("text/plain");
     //Call Populate_1
     //Call Populate_2
     //Call Populate_3
     //...
  }
}

有什么建议吗?

2 个答案:

答案 0 :(得分:6)

在与Servlet的url-pattern匹配的网址上使用RequestDispatcher#include()

public class Populate_ALL extends HttpServlet {
  public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
     response.setContentType("text/plain");
     request.getRequestDispatcher("/populateServlet1").include(request, response);
     request.getRequestDispatcher("/populateServlet2").include(request, response);
     request.getRequestDispatcher("/populateServlet3").include(request, response);
     //...
  }
}

注意:如果这些servlet不能单独使用 ,那么这是错误的方法,你应该使用独立的Java类,而不扩展HttpServlet。在您的具体情况下,我认为Builder Pattern可能会引起您的兴趣。

此处RequestDispatcher#forward()不合适,因为它已在提交响应标头时抛出IllegalStateException。当您通过多个servlet传递请求/响应时,无疑会出现这种情况,每个servlet都写入响应。

HttpServletResponse#sendRedirect()绝对不适合,因为它会隐式创建一个全新的requestresponse,因此会废弃原始版本。

另见:

答案 1 :(得分:1)

看起来您可能需要的是每个servlet可用于执行某些工作的服务。然后servlet不依赖于彼此,而是全部使用服务。

但是,这里是forwarding or redirecting requests的解释。