Не удалось понять, как работает AsyncContext.dispatch () при использовании AsyncContext.startAsync () и AsyncContext.startAsync (req, res) - PullRequest
0 голосов
/ 28 мая 2019

Я просто отправляю объекты 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? Пожалуйста, помогите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...