Toggle Theme Editor
Slate Blueberry Blackcurrant Watermelon Strawberry Orange Banana Apple Emerald Chocolate Charcoal

[series Spring Boot] 10. Forward Và Redirect

Discussion in 'Spring Framework' started by quydtkt, 24/11/19.

  1. quydtkt

    quydtkt Administrator

    Trong bài này, chúng ta sẽ cùng tìm hiểu về forward và redirect trong Spring Boot.
    1. Chuyển trang trong Spring Boot
    - Ở các bài trước, chúng ta đã biết, sau khi xử lý request xong thì request mapper sẽ đưa dữ liệu lên view để hiển thị ra màn hình.​
    - Tuy nhiên, đặt ra tình huống bạn muốn sau khi request mapper 1 xử lý xong thì phải gọi tiếp request mapper 2 để xử lý tiếp, sau đó mới hiển thị màn hình thì phải làm thế nào.​
    - Khi sử dụng Spring Boot có thể chuyển hướng qua lại giữa các request mapper với nhau bằng cách sử dụng 2 cơ chế forward và redirect.​
    - Cả forward và redirect đều giúp ta gọi một request mapper khác để tiếp tục xử lý request. Vậy 2 khái niệm này có gì khác nhau? Chúng ta sẽ cùng tìm hiểu trong bài viết này.​
    2. Page forward
    - Page forward, hiểu một cách đơn giản là sau khi request mapper 1 xử lý xong request, nó không trả lên view mà gọi request mapper 2 vào xử lý tiếp dữ liệu đó, sau đó mới đưa dữ liệu lên view.​
    - Số lượng request mapper tham gia forward 1 request là không giới hạn.​
    - View của request mapper cuối cùng chính là kết quả hiển thị ra màn hình.​
    ForwardController.java
    PHP:
    package vn.congdongjava.controller;
     
    import org.springframework.stereotype.Controller;
    import org.springframework.ui.Model;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
     
    @
    Controller
    public class ForwardController {
     
        @
    RequestMapping(value "frw/page1"method RequestMethod.GET)
        public 
    String page1(Model model) {
            
    model.addAttribute("username""quydtkt");
     
            return 
    "forward:/frw/page2";
        }
     
        @
    RequestMapping(value "frw/page2"method RequestMethod.GET)
        public 
    String page2() {
            return 
    "forward";
        }
    }
    - Tại ForwardController có 2 request mapper​
    • page1: Sau khi xử lý xong, request mapper này không đưa dữ liệu lên view mà sẽ forward sang request mapper page2. Trước khi forward sang page2, nó có put một attribute có tên username vào model.
      • Có thể forward request mới bằng cú pháp
    PHP:
    return "forward:/{forward url} ";
    • page2: Đổ dữ liệu lên view có tên “forward” để hiển thị ra màn hình
    forward.html
    HTML:
    <!DOCTYPE html>
    <html lang="en">
    <head>
    	<meta charset="UTF-8">
    	<title>Login</ttle>
    </head>
    <body>
    Forward data from page 1: [[${username}]]
    </body>
    </html>
    </html>
    - Tại view forward.html có thực hiện in ra màn hình model attribute username.​
    Chạy project và truy cập vào link http://localhost:8080/frw/page1
    [​IMG]
    - Cùng nhìn lại code, các bạn có thể thấy, tại request mapper page2, chúng ta không hề thực hiện đưa model attribute username vào model. Tuy nhiên tại màn hình vẫn hiển thị được giá trị này.​
    - Vậy model attribute username được đưa vào model từ lúc nào. Câu trả lời là tại xử lý của request mapper page1​
    PHP:
    @RequestMapping(value "frw/page1"method RequestMethod.GET)
    public 
    String page1(Model model) {
        
    model.addAttribute("username""quydtkt");
     
        return 
    "forward:/frw/page2";
    }
    - Có thể truyền dữ liệu giữa các request mapper khi thực hiện forward request bằng model attribute hoặc request.​
    2. Page redirect
    - Giống như page forward, page redirect cũng là gọi 1 request mapper khác để xử lý request, chứ không đưa dữ liệu lên view.​
    - Tuy nhiên khác với page forward, page redirect là nhượng quyền xử lý request hoàn toàn cho request mapper sau, chứ không phải chỉ gọi tham gia xử lý request. Có nghĩa là request sẽ kết thúc khi bị redirect và sẽ có một request khác được tạo ra để tiếp tục xử lý dữ liệu.​
    - Số lượng request mapper tham gia redirect request là không giới hạn.​
    - View của request mapper cuối cùng chính là kết quả hiển thị ra màn hình.​
    RedirectController.java
    PHP:
    package vn.congdongjava.controller;
     
    import org.springframework.stereotype.Controller;
    import org.springframework.ui.Model;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
     
    @
    Controller
    public class RedirectController {
     
        @
    RequestMapping(value "rdr/page1"method RequestMethod.GET)
        public 
    String page1(Model model) {
            
    model.addAttribute("username""quydtkt");
     
            return 
    "redirect:/rdr/page2";
        }
     
        @
    RequestMapping(value "rdr/page2"method RequestMethod.GET)
        public 
    String page2() {
            return 
    "redirect";
        }
    }
    - Tại RedirectController có 2 request mapper​
    • page1: Sau khi xử lý xong, request mapper này không đưa dữ liệu lên view mà sẽ redirect sang request mapper page2. Trước khi redirect sang page2, nó có put một attribute có tên username vào model.
      • Có thể redirect request bằng cú pháp
    PHP:
    return "redirect:/{forward url} ";
    • page2: Đổ dữ liệu lên view có tên “redirect” để hiển thị ra màn hình
    redirect.html
    HTML:
    <!DOCTYPE html>
    <html lang="en">
    <head>
    	<meta charset="UTF-8">
    	<title>Login</ttle>
    </head>
    <body>
    Redirect data from page 1: [[${username}]]
    </body>
    </html>
    </html>
    - Tại view redirect.html có thực hiện in ra màn hình model attribute username.​
    Chạy project và truy cập vào link http://localhost:8080/rdr/page1
    [​IMG]

    - Các bạn có thể thấy trên màn hình, kết quả in ra model attribute username là “”​
    - Không thể dùng model attribute để truyền dữ liệu khi redirect request​
    - Chỉnh sửa lại request mapper page1 và truy cập lại link http://localhost:8080/rdr/page1
    PHP:
    @RequestMapping(value "rdr/page1"method RequestMethod.GET)
    public 
    String page1(RedirectAttributes redirectAttributes) {
        
    redirectAttributes.addFlashAttribute("username""quydtkt");
     
        return 
    "redirect:/rdr/page2";
    }
    [​IMG]
    - Để truyền dữ liệu giữa các request mapper khi thực hiện page redirect, ta dùng RedirectAttributes​
    Cám ơn các bạn đã theo dõi. Hẹn gặp lại trong bài viết tiếp theo :)
     

    Attached Files:

Chia sẻ trang này

Loading...