ServletRequest.getRequestDispatcher和ServletContext.getRequestDispatcher的區(qū)別

本節(jié)介紹以下幾種跳轉(zhuǎn)方法。
1.用RequestDispatcher跳轉(zhuǎn):
馬克- to-win:馬克 java社區(qū):防盜版實名手機尾號: 73203。
馬克-to-win: javax.servlet.RequestDispatcher是Sun公司編寫的一個Interface,顧名思義,它可以把用戶請求"a資源"的 request派遣(dispatch)到"b資源"上,從而實現(xiàn)跳轉(zhuǎn)。(本來人家要訪問'a資源",你的程序卻讓人家自動的跳轉(zhuǎn)到"b資源"上。)注意:RequestDispatcher有兩種形式:這兩種形式都能達(dá)到跳轉(zhuǎn)的目的。一種是 ServletRequest.getRequestDispatcher(String url)。一種是ServletContext.getRequestDispatcher(String url)。但正常來講,二者都只能訪問同一web應(yīng)用的資源。見下面理論論述和實驗。

馬克-to-win:注意以下兩者的而區(qū)別:ServletContext.getRequestDispatcher(String
url)中的url只能使用絕對路徑; 而ServletRequest.getRequestDispatcher(String
url)中的url可以使用相對路徑(兩個資源在同一個目錄下,所以省去路徑),也可以絕對路徑。假如你寫成相對路徑時,比如
request.getRequestDispatcher("add").forward(request, response);
系統(tǒng)會在同一目錄下找add,見后面的例子。

但是假如你寫成request.getRequestDispatcher(/WebModule1/jsp1.jsp).forward
(request, response); 系統(tǒng)也會傻傻的變成:request.getRequestDispatcher(http://localhost:
8080/WebModule1/WebModule1/jsp1.jsp).forward(request, response);
當(dāng)然你更不要寫成:request.getRequestDispatcher(http://localhost:
8083/WebModule1/jsp1.jsp).forward(request, response).道理是一樣的。<


下面這段話來自于Sun公司的官方文檔,大家可以參考一下。對于初學(xué)者來講,沒必要完全搞懂。

from documentation: request.getRequestDispatcher: The pathname specified may be relative, although it cannot extend outside the current servlet context. If the path begins with a "/" it is interpreted as relative to the current context root.(馬克-to-win:上面的翻譯就是相對時不能訪問到當(dāng)前servlet的外面,用/就代表當(dāng)前應(yīng)用的根目錄,見我下面的例子)

底下我們就通過一個實驗來說明這二者的區(qū)別在。本個實驗中,web.xml主要內(nèi)容是這樣的:

    <servlet>
        <servlet-name>ServletHello1</servlet-name>
        <servlet-class>com.ServletHello1</servlet-class>
    </servlet>
    <servlet>
        <servlet-name>AddCookie</servlet-name>
        <servlet-class>com.AddCookie</servlet-class>
    </servlet>
    <servlet>
        <description>
        </description>
        <servlet-name>DeleteCookie</servlet-name>
        <servlet-class>com.DeleteCookie</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>ServletHello1</servlet-name>
        <url-pattern>/Hello/MarkToWinServletHello1</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>AddCookie</servlet-name>
        <url-pattern>/Cookie/AddCookie</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>DeleteCookie</servlet-name>
        <url-pattern>/Cookie/DeleteCookie</url-pattern>
    </servlet-mapping>


AddCookie.java:




package com;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class AddCookie extends HttpServlet {
    protected void doGet(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException {
            String rav=(String)request.getAttribute("requestkey");
            String scs=(String)this.getServletContext().getAttribute("ServletContextKey");
            System.out.println(rav+" "+scs);
    }
}




package com;
import java.io.IOException;
import java.io.InputStream;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ServletHello1 extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        String rav=(String)request.getAttribute("requestkey");
        String scs=(String)this.getServletContext().getAttribute("ServletContextKey");
        System.out.println(rav+" "+scs);
    }
}


1.html是這樣的:

test




例:3.1.1

package com;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class DeleteCookie extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setAttribute("requestkey","requstvalue1");
        getServletContext().setAttribute("ServletContextKey","ServletContextValue");
/*下面任意一種方法都能正確執(zhí)行。*/       
        request.getRequestDispatcher("/Cookie/AddCookie").forward(request, response);
 //       request.getRequestDispatcher("AddCookie").forward(request, response);
 //       request.getRequestDispatcher("/WEB-INF/1.html").forward(request, response);
 //       request.getRequestDispatcher("/Hello/MarkToWinServletHello1").forward(request, response);
 //       getServletContext().getRequestDispatcher("/Hello/MarkToWinServletHello1").forward(request, response);
 //       getServletContext().getRequestDispatcher("/WEB-INF/1.html").forward(request, response);

/*下面的寫法錯誤,找不到AddCookie*/
//      request.getRequestDispatcher("/AddCookie").forward(request, response);
// getServletContext().getRequestDispatcher("http://localhost:8080/ServletHello/Hello/MarkToWinServletHello1").forward(request, response);
    }
}

輸出結(jié)果是:





























例:3.1.2

package com;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class DeleteCookie extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setAttribute("requestkey","requstvalue1");
getServletContext().setAttribute("ServletContextKey","ServletContextValue");
/*下面任意一種方法都能正確執(zhí)行。*/
// request.getRequestDispatcher("/Cookie/AddCookie").forward(request, response);
// request.getRequestDispatcher("AddCookie").forward(request, response);
// request.getRequestDispatcher("/WEB-INF/1.html").forward(request, response);
// request.getRequestDispatcher("/Hello/MarkToWinServletHello1").forward(request, response);
// getServletContext().getRequestDispatcher("/Hello/MarkToWinServletHello1").forward(request, response);
getServletContext().getRequestDispatcher("/WEB-INF/1.html").forward(request, response);

/*下面的寫法錯誤,找不到AddCookie*/
// request.getRequestDispatcher("/AddCookie").forward(request, response);
// getServletContext().getRequestDispatcher("http://localhost:8080/ServletHello/Hello/MarkToWinServletHello1").forward(request, response);
}
}

輸出結(jié)果是: