ServletContext.getRequestDispatcher()vs ServletRequest.getRequestDispatcher()

为什么

ServletRequest接口的getRequestDispatcher(String path)不能扩展到当前servlet上下文之外

在哪里

ServletContext的getRequestDispatcher(String path)可以使用getContext(String uripath)方法为外部上下文中的资源获取RequestDispatcher。

如何??

请帮忙

如果使用绝对路径,例如( "/index.jsp" ),则没有区别。

如果使用相对路径,则必须使用HttpServletRequest.getRequestDispatcher()ServletContext.getRequestDispatcher()不允许它。

例如,如果您在http://example.com/myapp/subdir上收到了您的请求,

  RequestDispatcher dispatcher = request.getRequestDispatcher("index.jsp"); dispatcher.forward( request, response ); 

将请求转发到http://example.com/myapp/subdir/index.jsp页面。

在任何情况下,您都不能将请求转发到上下文之外的资源。

请求方法getRequestDispatcher()可用于引用单个webapp中的本地servlet。

基于Servlet上下文的getRequestDispatcher()方法可用于从SAME服务器上部署的其他Web应用程序引用Servlet。

request.getRequestDispatcher(“url”)表示调度是相对于当前HTTP请求的。这是用于在同一Web应用程序中链接两个servlet的示例

 RequestDispatcher reqDispObj = request.getRequestDispatcher("/home.jsp"); 

getServletContext()。getRequestDispatcher(“url”)表示调度是相对于ServletContext的根目录。这是用于在同一服务器/两个不同服务器中链接两个Web应用程序

 RequestDispatcher reqDispObj = getServletContext().getRequestDispatcher("/ContextRoot/home.jsp"); 

我认为你的第一个问题只是范围问题。 ServletContext是一个比ServletRequest更宽泛的范围对象(整个servlet上下文),它只是一个请求。 您可以查看Servlet规范本身以获取更多详细信息。

关于如何,我很抱歉,但此时我将不得不留下让其他人回答。

上下文存储在应用程序级别范围内,其中请求存储在页面级别即即

Web容器逐个启动应用程序并在其JVM中运行它们。 它在单独的jvm中存储一个单独的对象,它注册放在其中的任何对象。这个单例在它内部运行的所有应用程序中共享,因为它存储在容器本身的JVM中。

但是对于请求,容器创建一个请求对象,该请求对象填充了来自请求的数据,并从一个线程传递到另一个线程(每个线程是一个新的请求即将到达服务器),请求也传递给线程相同的申请。