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