我如何依次执行多个servlet?
我刚刚开始使用Servlet,并设法将一些servlet作为单独的URL来填充数据库以进行一些虚拟testing。 一些forms的东西:
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来设置下一个页面被redirect,但不知道这是否是正确的方法,因为redirect应该发生在插入logging之后。 具体来说,我正在寻找这样的东西:
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 //... } }
有什么build议么?
在匹配Servlet的url-pattern
的URL上使用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模式可能是有趣的。
RequestDispatcher#forward()
在这里是不合适的,因为当响应头已经被提交时它抛出IllegalStateException
exception。 当您通过多个servlet传递请求/响应,每个servlet都写入响应时,情况就会如此。
HttpServletResponse#sendRedirect()
在这里是绝对不适合的,因为它隐含地创build了一个全新的request
和response
,因此摧毁了原来的request
和response
。
也可以看看:
- 如何在第一个JSP servlet中调用第二个JSP servlet?
- RequestDispatcher.forward()vs HttpServletResponse.sendRedirect()
- 远程servlet之间的通信
看起来你可能需要的是每个servlet可以用来执行一些工作的服务。 然后servlet不依赖于另一个,而是全部使用该服务。
但是,这里是转发或redirect请求的解释。