我刚开始使用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
//...
}
}
有什么建议吗?
答案 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()
绝对不适合,因为它会隐式创建一个全新的request
和response
,因此会废弃原始版本。
答案 1 :(得分:1)
看起来您可能需要的是每个servlet可用于执行某些工作的服务。然后servlet不依赖于彼此,而是全部使用服务。
但是,这里是forwarding or redirecting requests的解释。