Trong phát triển ứng dụng web Java, việc điều hướng giữa các trang là một phần quan trọng. Hai phương thức phổ biến để thực hiện điều này là sendRedirect và forward. Mặc dù cả hai đều giúp chuyển hướng người dùng đến một trang khác, nhưng chúng hoạt động theo cách rất khác nhau. Bài viết này sẽ khám phá sự khác biệt giữa chúng, cách sử dụng, và các tình huống nên áp dụng mỗi phương thức.
sendRedirect là một phương thức của lớp HttpServletResponse trong Java Servlets, cho phép bạn gửi một yêu cầu mới đến trình duyệt của người dùng, yêu cầu trình duyệt tải một URL mới. Điều này khiến trình duyệt tạo một yêu cầu HTTP mới đến địa chỉ URL được chỉ định.
forward là một phương thức của lớp RequestDispatcher, cho phép bạn chuyển tiếp yêu cầu từ một servlet hoặc JSP đến một tài nguyên khác (có thể là servlet, JSP, hoặc HTML) trên cùng một máy chủ mà không cần tạo một yêu cầu mới từ trình duyệt.
| Tiêu chí | sendRedirect | forward | 
|---|---|---|
| Yêu cầu HTTP | Gửi một yêu cầu HTTP mới từ trình duyệt. | Không tạo yêu cầu HTTP mới. | 
| Địa chỉ URL | Địa chỉ URL trên thanh địa chỉ của trình duyệt thay đổi. | Địa chỉ URL trong thanh địa chỉ không thay đổi. | 
| Thời gian thực thi | Thực thi cần thêm thời gian do yêu cầu mới. | Thực thi nhanh hơn vì không cần gửi yêu cầu mới. | 
| Khả năng truy cập | Chỉ có thể chuyển hướng đến một URL khác (có thể là bên ngoài). | Chỉ có thể chuyển tiếp đến tài nguyên trên cùng máy chủ. | 
| Dữ liệu yêu cầu | Không giữ lại dữ liệu yêu cầu ban đầu. | Có thể giữ lại dữ liệu yêu cầu ban đầu. | 
| HTTP Status Code | Thay đổi mã trạng thái HTTP thành 302. | Mã trạng thái HTTP không thay đổi (vẫn là 200). | 
Dưới đây là một ví dụ đơn giản về cách sử dụng sendRedirect trong một servlet:
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/redirectExample")
public class RedirectExampleServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.sendRedirect("http://www.example.com");
    }
}
Dưới đây là ví dụ về cách sử dụng forward trong một servlet:
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.RequestDispatcher;
@WebServlet("/forwardExample")
public class ForwardExampleServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        RequestDispatcher dispatcher = request.getRequestDispatcher("targetPage.jsp");
        dispatcher.forward(request, response);
    }
}
Tóm lại, cả hai phương thức sendRedirect và forward đều có mục đích chuyển hướng người dùng đến một trang khác, nhưng cách thức hoạt động và ứng dụng của chúng rất khác nhau. Việc hiểu rõ sự khác biệt này sẽ giúp bạn lựa chọn phương thức phù hợp trong từng tình huống cụ thể trong quá trình phát triển ứng dụng Java web.