1. 程式人生 > >Servlet------RequestDispatcher請求轉發

Servlet------RequestDispatcher請求轉發

一、RequestDispatcher物件由Servlet容器建立,用於封裝一個由路徑所標識的伺服器資源,利用RequestDispatcher物件可以將請求轉發給其他的Servlet或JSP頁面,
RequestDispatcher是一個介面,得到RequestDispatcher物件有以下三種方法

  • RequestDispatcher rd = context.getNamedDispatcher("login");
-----利用ServletContext context物件,引數login是Servlet或JSP頁面的名字。
  • RequestDispatcher rd = context.getRequestDispatcher("/login");
-----利用ServletContext context物件,引數"/login"是在xml中定義的Servlet路徑,此方法的引數必須以"/"開始,被解釋為相對於當前上下文根(context root)路徑
  • RequestDispatcher rd = req.getRequestDispatcher("/login");

-----利用ServletRequest req物件,返回一個RequestDispatcher物件,此方法的引數不但可以是相對上下文的根路徑,如果路徑沒有以斜槓(/)開始,則被解釋為相對於當前Servlet的路徑

二、RequestDispatcher介面中定義了兩種方法用於將請求轉發
  • public void forward(ServletRequest request, ServletResponse response) throws ServletException, java.io.IOException

-----原Servlet呼叫此方法後將請求轉發給伺服器上的另一個Servlet、JSP或HTML檔案,且原Servlet此方法之前的程式碼將自動清除,此方法之後的程式碼也不再執行,將控制權交
由另一個Servlet

  • public void include(ServletRequest request,ServletResponse response) throws ServletException, java.io.IOException

-----原Servlet呼叫此方法後將請求轉發給伺服器上的另一個Servlet、JSP或HTML檔案,且另一個Servlet執行完之後將控制權將由原Servlet繼續執行


三、請求轉發的例項
  1. public class PortalServlet extends HttpServlet{
  2. public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException{
  3. res.setContentType("text/html;charset=gb2312");
  4. PrintWriter out = res.getWriter();
  5. out.println("<html><head>");
  6. out.println("<title>登入頁面</title>");
  7. out.println("</head><body>");
  8. String name = req.getParameter("username");
  9. String pwd = req.getParameter("password");
  10. if("ye".equals(name) && "123".equals(pwd)){
  11. ServletContext context = getServletContext();
  12. RequestDispatcher rd = context .getRequestDispatcher("/welcome");
  13. rd.forward(req, res);
    //6-8行輸出的HTML程式碼將被自動清除,23-24行程式碼也不執行,Servlet容器將控制權交給welcome這個Servlet
  14. }
  15. else{
  16. RequestDispatcher rd = req.getRequestDispatcher("login2");
  17. rd.include(req, res);
    //login2這個Servlet執行完後再從這裡接著往下執行
  18. }
  19. out.println("</body></html>");
  20. out.close();
  21. }
  22. public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException{
  23. doGet(req, res);
  24. }

四、sendRedirect()和forward()方法的區別
-----HttpServletResponse介面的sendRedirect()方法和RequestDispatcher介面的forward()方法都可以利用另外的資源(Servlet、JSP頁面或HTML檔案)來為客戶端服務,但兩種方法有本質的區別
        
1、sendRedirect()方法

  • ---->瀏覽器訪問Servlet1
  • ---->Servlet1呼叫sendRedirect()重定向到Servlet2
  • ---->瀏覽器訪問Servlet2
  • ---->Servlet2對客戶端的請求做出響應
2、forward()方法
  • ---->瀏覽器訪問Servlet1
  • ---->Servlet1呼叫forward()方法轉發給Servlet2
  • ---->Servlet2對請求做出響應