[series Spring Boot] 10. Forward Và Redirect

quydtkt

Administrator
1/11/19
388
37
28
27
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
Java:
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
Java:
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

- 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​

Java:
@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
Java:
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

Java:
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


- 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

Java:
@RequestMapping(value = "rdr/page1", method = RequestMethod.GET)
public String page1(RedirectAttributes redirectAttributes) {
    redirectAttributes.addFlashAttribute("username", "quydtkt");

    return "redirect:/rdr/page2";
}


- Để 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 :)
 

Attachments

Sửa lần cuối: