Я просто отправляю объекты HttpServletRequest и HttpServletResponse из Servlet1 в Servlet2 через req.getRequestDispatcher ("/ servlet2"). Forward (req, res).
В Servlet2 я запускаю асинхронный цикл с использованием req.startAsync (req, res), завершаю его и вызываю dispatch () в конце.
Теперь, согласно документации Oracle, " Если асинхронный цикл был запущен с ServletRequest # startAsync (ServletRequest, ServletResponse), и переданный запрос является экземпляром HttpServletRequest, то отправка осуществляется в URI возвращается HttpServletRequest.getRequestURI (). В противном случае отправка осуществляется по URI запроса, когда он последний раз отправлялся контейнером.
».
Но когда я вызываю dispatch (), запрос отправляется сервлету 1.
Это сервлет1
@WebServlet(asyncSupported=true, urlPatterns={"/servlet1"})
public class Servlet1 extends HttpServlet
{
public void service(HttpServletRequest req, HttpServletResponse res)
throws IOException, ServletException
{
PrintWriter out = res.getWriter();
res.setContentType("text/html");
out.println("<html><center><body>");
out.println("Setting attributes in requeset object<br>");
req.setAttribute("name", "Abhishek");
out.println("forwarding request<br>");
req.getRequestDispatcher("/servlet2").forward(req, res); // dispatch
req, res to Servlet2
out.println("back in Servlet1<br>");
out.println("getRequestURI:"+req.getRequestURI()+"<br>");
out.println("servlet1 is getting attribute that was set by
servlet2<br>");
if(req == null)
out.println("req is null<br>");
else
out.println(((Integer)req.getAttribute("k")).intValue()+"<br>");
}
}
Это сервлет2
@WebServlet(asyncSupported=true, urlPatterns={"/servlet2"})
public class Servlet2 extends HttpServlet
{
public void doGet(HttpServletRequest req, HttpServletResponse res)
throws IOException
{
res.setContentType("text/html");
PrintWriter out = res.getWriter();
out.println("<html><center><body>");
out.println("getting attributes from request object<br>");
out.println((String)req.getAttribute("name")+"<br>");
out.println("getRequestURI:"+req.getRequestURI()+"<br>");
out.println("Starting asynchronous cycle<br>");
AsyncContext context = req.startAsync((ServletRequest)req,
(ServletResponse)res);
out.println("Is Async Supported? "+ req.isAsyncSupported()+"<br>");
out.println("Is Async Started? "+ req.isAsyncStarted()+"<br>");
out.println("Servlet 2 is now setting attributes<br>");
req.setAttribute("k", 9);
context.complete();
context.dispatch();
out.println("</body></center></html>");
}
}
Я ожидаю, что он будет отправлен самому Servlet2, так как req.getRequestURI () возвращает URI Servlet2. Почему он отправляется в Servlet1? Пожалуйста, помогите.