如标题所述,如何调用servlet中的另一个servlet并获取调用的servlet响应?
答案 0 :(得分:3)
使用HttpServletRequest
实例提供的RequestDispatcher
实例。
但是,如果您正在考虑获取servlet容器所持有的单个实例[就像使用ServletContext
实例中的getServlet
方法一样),那就完全不同了。 servlet规范故意弃用了可能允许这种选项的操作。但是,如果确实想要在执行另一个servlet时调用一个servlet,请使用include
的{{1}}方法而不是RequestDispatcher
方法。
答案 1 :(得分:1)
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));