如何在servlet中调用另一个servlet?

时间:2010-12-21 06:26:02

标签: jsp servlets

如标题所述,如何调用servlet中的另一个servlet并获取调用的servlet响应?

4 个答案:

答案 0 :(得分:3)

使用HttpServletRequest实例提供的RequestDispatcher实例。

但是,如果您正在考虑获取servlet容器所持有的单个实例[就像使用ServletContext实例中的getServlet方法一样),那就完全不同了。 servlet规范故意弃用了可能允许这种选项的操作。但是,如果确实想要在执行另一个servlet时调用一个servlet,请使用include的{​​{1}}方法而不是RequestDispatcher方法。

答案 1 :(得分:1)

See here:

getServletContext().getNamedRequestDispatcher("servletName")
    .forward(request, response);

但是我认为有更好的选择。例如,将您需要的代码移动到辅助类/实用程序方法,并调用它。

当我想到它时,你可能想要另一件事:分别调用一个servlet。为此你需要:

InputStream is = new URL(urlOfTheServlet).openStream();
IOUtils.copy(is, response.getOutputStream());

(这是使用apache commons-io将输入流复制到当前请求的输出流)

答案 2 :(得分:0)

使用ServletContext或当前请求获取RequestDispatcher,然后使用RequestDispatcher forward()或include()。

可以使用Spring MockHttpServletRequest和MockHttpServletResponse来创建新请求和响应,而不是使用当前请求。

示例:

HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
RequestDispatcher dispatcher = request.getRequestDispatcher(url);

MockHttpServletRequest servletRequest = new MockHttpServletRequest();
servletRequest.setServerName(request.getServerName() );
servletRequest.setServerPort(request.getServerPort() );
servletRequest.setSession(request.getSession() );
servletRequest.setMethod(HttpMethod.GET.name() );

servletRequest.setRequestURI(url);
servletRequest.setParameters(parameters);

MockHttpServletResponse servletResponse = new MockHttpServletResponse();
servletResponse.setCharacterEncoding("UTF-8");
// Use include() instead of forward(). Similar as client HttpClient GET
dispatcher.include(servletRequest, servletResponse);
String content = servletResponse.getContentAsString();

答案 3 :(得分:0)

String destinationBlockAccount  ="./BlockAccount";
response.sendRedirect(response.encodeRedirectURL(destinationBlockAccount));

此外,您可以直接从JSP发送参数:

response.sendRedirect(response.encodeRedirectURL("./GetAccount?accountID="+accountID));