Java 在使用AsyncContext.startAsync()和AsyncContext.startAsync(req,res)时,无法理解AsyncContext.dispatch()如何工作

Java 在使用AsyncContext.startAsync()和AsyncContext.startAsync(req,res)时,无法理解AsyncContext.dispatch()如何工作,java,servlets,Java,Servlets,我只是通过req.getRequestDispatcher(“/Servlet2”).forward(req,res)将HttpServletRequest和HttpServletResponse对象从Servlet1分派到Servlet2 在Servlet2中,我使用req.startAsync(req,res)启动异步循环,完成它并在最后调用dispatch() 现在,根据oracle文档,“如果异步循环是从ServletRequest#startAsync(ServletRequest,S

我只是通过req.getRequestDispatcher(“/Servlet2”).forward(req,res)将HttpServletRequest和HttpServletResponse对象从Servlet1分派到Servlet2

在Servlet2中,我使用req.startAsync(req,res)启动异步循环,完成它并在最后调用dispatch()

现在,根据oracle文档,“如果异步循环是从ServletRequest#startAsync(ServletRequest,ServletResponse)开始的,并且传递的请求是HttpServletRequest的一个实例,那么调度是到HttpServletRequest.getRequestURI()返回的URI。否则,发送将被发送到容器上次发送请求时请求的URI。

但是当我调用dispatch()时,请求被调度到Servlet1

这是Servlet1

@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>");
    }
}
@WebServlet(asyncSupported=true,urlPatterns={”/servlet1})
公共类Servlet1扩展了HttpServlet
{
公共无效服务(HttpServletRequest-req、HttpServletResponse-res)
抛出IOException、ServletException
{
PrintWriter out=res.getWriter();
res.setContentType(“文本/html”);
out.println(“”);
out.println(“在requeset对象中设置属性
”; 要求设置属性(“名称”、“阿披舍克”); out.println(“转发请求
”; req.getRequestDispatcher(“/servlet2”).forward(req,res);//调度 req,res至Servlet2 out.println(“返回Servlet1
”; out.println(“getRequestURI:+req.getRequestURI()+”
”; println(“servlet1正在获取由 servlet2
”; if(req==null) out.println(“请求为空
”; 其他的 out.println(((整数)req.getAttribute(“k”)).intValue()+“
”); } }
这是Servlet2

@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>");
    }
}
@WebServlet(asyncSupported=true,urlPatterns={”/servlet2})
公共类Servlet2扩展了HttpServlet
{
公共无效数据集(HttpServletRequest-req、HttpServletResponse-res)
抛出IOException
{
res.setContentType(“文本/html”);
PrintWriter out=res.getWriter();
out.println(“”);
println(“从请求对象获取属性
”; out.println((字符串)req.getAttribute(“名称”)+“
”); out.println(“getRequestURI:+req.getRequestURI()+”
”; out.println(“启动异步循环
”; AsyncContext context=req.startAsync((ServletRequest)req, (ServletResponse)res); out.println(“是否支持异步?”+req.isAsyncSupported()+“
”; out.println(“异步启动了吗?”+req.isAsyncStarted()+“
”; println(“Servlet 2现在正在设置属性
”; 要求设置属性(“k”,9); context.complete(); context.dispatch(); out.println(“”); } }
由于req.getRequestURI()返回Servlet2URI,所以我希望它被分派到Servlet2本身。为什么要将其发送到Servlet1?请帮忙