ServletContext.getRequestDispatcher()vs ServletRequest.getRequestDispatcher()

时间:2009-09-11 14:11:41

标签: java servlets

为什么

  

getRequestDispatcher(String path)   ServletRequest接口不能   延伸到当前servlet之外   上下文

其中

  

getRequestDispatcher(String path)   ServletContext可以使用   getContext(String uripath)方法   获取资源的RequestDispatcher   在国外。

以及如何

请帮忙

6 个答案:

答案 0 :(得分:37)

如果使用绝对路径,例如("/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

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

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

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

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

答案 4 :(得分:0)

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

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

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

实施例

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

答案 5 :(得分:0)

我想您会通过下面的示例了解它。

源代码结构:

/src/main/webapp/subdir/sample.jsp
/src/main/webapp/sample.jsp

上下文是:TestApp
所以入口点是:http://yourhostname-and-port/TestApp


转到相对路径:

使用servletRequest.getRequestDispatcher("sample.jsp")

http://yourhostname-and-port/TestApp/subdir/fwdServlet  ==> \subdir\sample.jsp
http://yourhostname-and-port/TestApp/fwdServlet ==> /sample.jsp

使用servletContext.getRequestDispatcher("sample.jsp")

http://yourhostname-and-port/TestApp/subdir/fwdServlet ==> java.lang.IllegalArgumentException: Path sample.jsp does not start with a "/" character
http://yourhostname-and-port/TestApp/fwdServlet ==> java.lang.IllegalArgumentException: Path sample.jsp does not start with a "/" character


转到绝对路径:

使用servletRequest.getRequestDispatcher("/sample.jsp")

http://yourhostname-and-port/TestApp/subdir/fwdServlet  ==> /sample.jsp
http://yourhostname-and-port/TestApp/fwdServlet ==> /sample.jsp

使用servletContext.getRequestDispatcher("/sample.jsp")

http://yourhostname-and-port/TestApp/subdir/fwdServlet ==> /sample.jsp
http://yourhostname-and-port/TestApp/fwdServlet ==> /sample.jsp