iT邦幫忙

2024 iThome 鐵人賽

DAY 12
0
Software Development

從Servlet到Spring MVC系列 第 12

Day11 Servlet - RequestDispatcher and SendRedirect

  • 分享至 

  • xImage
  •  

前言

請求轉發(RequestDispatcher),與請求重導(SendRedirect)都是Web應用程式間接訪問資源的手段,請求轉發透過HttpServletRequest執行;請求重導透過HttpServletResponse執行。相關應用場景例如login完成後重導到欲訪問的頁面或是一個請求需要多個Servlet調用才能完成時,就會透過請求轉發的方式交由下一個Servlet處理。

0、創建module

請參考Day05創建module

一、RequestDispatcher

https://ithelp.ithome.com.tw/upload/images/20240926/201280841zjrHlYX18.png

特點

  1. 請求轉發是透過HttpServletRequest實現
  2. 請求轉發是Server端的行為,client端不會知道,故URL網址不變
  3. 請求參數是可以傳遞的
  4. 請求資源可以是動態資源也可以是靜態資源
  5. 目標資源可以是WEB-INF下受保護資源
  6. 目標資源不可以訪問外部的資源

創建案例

create DemoRequestDispatcherServlet

@WebServlet("/DemoRequestDispatcherServlet")
public class DemoRequestDispatcherServlet extends HttpServlet{
    public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
        System.out.println("====request DemoRequestDispatcherServlet====");
        String username = req.getParameter("username");
        System.out.println("req.getParameter(username):"+username);

        //1.請求轉發是透過HttpServletRequest實現
        //4. 請求資源可以是動態資源也可以是靜態資源
        //req.getRequestDispatcher("ServletA").forward(req, res);
        //5. 目標資源可以是WEB-INF下受保護資源
        //req.getRequestDispatcher("public.html").forward(req, res);
        //req.getRequestDispatcher("WEB-INF/protected.html").forward(req, res);
        //6. 目標資源不可以訪問外部的資源
        req.getRequestDispatcher("https://google.com.tw").forward(req, res);


    }
}

create ServletA

@WebServlet("/ServletA")
public class ServletA extends HttpServlet {
    public void doGet(HttpServletRequest req, HttpServletResponse res){
        System.out.println("====request ServletA=====");
        String username = req.getParameter("username");
        System.out.println("req.getParameter(username):"+username);

    }
}

創建靜態資源
https://ithelp.ithome.com.tw/upload/images/20240926/20128084hrVVHiiQ3C.png

Demo

  1. 請求轉發是Server端的行為,client端不會知道,故URL網址不變
    https://ithelp.ithome.com.tw/upload/images/20240926/201280841ns9K9uGFa.png
  2. 請求參數是可以傳遞的
    https://ithelp.ithome.com.tw/upload/images/20240926/20128084bNpNqiGZN2.png
  3. 請求資源可以是動態資源也可以是靜態資源public.html
    https://ithelp.ithome.com.tw/upload/images/20240926/20128084YW7jBzVzOl.png
  4. 目標資源可以是WEB-INF下受保護資源protect.html
    https://ithelp.ithome.com.tw/upload/images/20240926/20128084X2wH46KhUt.png
  5. 目標資源不可以訪問外部的資源
    https://ithelp.ithome.com.tw/upload/images/20240926/20128084zuMSJ6jKeC.png

二、SendRedirect

https://ithelp.ithome.com.tw/upload/images/20240926/20128084ct8yLsgCgg.png

特點

  1. 請求重導是透過HttpServletResponse實現
  2. 請求重導是Server端提示下,client端行為,所以網址會變
  3. client端至少發兩次請求
  4. 請求參數無法傳遞
  5. 可以訪問靜態資源
  6. 無法訪問WEB-INF下受保護資源
  7. 目標資源可以是外部資源

創建案例

創建DemoSendRedirectServlet

@WebServlet("/DemoSendRedirectServlet")
public class DemoSendRedirectServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
        System.out.println("=====DemoSendRedirectServlet=====");

        String username = req.getParameter("username");
        System.out.println("req.getParameter(username):"+username);

        //請求重導另一種設置方式等同於SendRedirect
//        res.setStatus(302);
//        res.setHeader("Location", "ServletB");

        //1. 請求重導是透過HttpServletResponse實現
        res.sendRedirect("ServletB");
        //5. 可以訪問靜態資源
        //res.sendRedirect("public.html");
        //6. 無法訪問WEB-INF下受保護資源
        //res.sendRedirect("WEB-INF/protected.html");
        //7. 目標資源可以是外部資源
        //res.sendRedirect("https://www.google.com");

    }
}
@WebServlet("/ServletB")
public class ServletB extends HttpServlet {
    public void doGet(HttpServletRequest req, HttpServletResponse res){
        System.out.println("====request ServletB=====");
        String username = req.getParameter("username");
        System.out.println("req.getParameter(username):"+username);
    }
}

Demo

  1. 請求重導是Server端提示下,client端行為,所以網址會變
    client端至少發兩次請求
    https://ithelp.ithome.com.tw/upload/images/20240926/20128084X7NhXEVvYc.png
  2. 請求參數無法傳遞
    https://ithelp.ithome.com.tw/upload/images/20240926/20128084jBocBvPnbA.png
  3. 可以訪問靜態資源
    https://ithelp.ithome.com.tw/upload/images/20240926/20128084qG5tAZYb02.png
  4. 無法訪問WEB-INF下受保護資源protect.html
    https://ithelp.ithome.com.tw/upload/images/20240926/20128084lOPgR7FaUy.png
  5. 目標資源可以訪問外部的資源
    https://ithelp.ithome.com.tw/upload/images/20240926/20128084BqaDhg92t6.png

Reference


上一篇
Day10 Servlet - HttpServletRequest and HttpServletResponse
下一篇
Day12 Servlet - Garbled characters
系列文
從Servlet到Spring MVC36
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言