[Servlet/JSP] Lập trình Java Servlet cơ bản P5: Forward (Chuyển tiếp) và Redirect (Chuyển hướng) Servlet

Đăng bởi: Admin | Lượt xem: 436 | Chuyên mục: Servlet/JSP

Trong bài viết này chúng ta sẽ tìm hiểu cách Servlet Forward (Chuyển tiếp) và Servlet Redirect (Chuyển hướng). Phân biệt giữa Forward và Redirect cùng các ví dụ minh họa.


Để thực hiện được hướng dẫn này, bạn cần đọc và thực hiện những hướng dẫn ở bài viết trước:

1. Tạo WebProject đầu tiên

2. Cấu hình eclipse

3. Tạo và chạy Servlet đầu tiên

Xem bài viết trước tại đây

1. Forward (Chuyển tiếp)

Chuyển tiếp (Forward): Khi một yêu cầu (request) của trình duyệt gửi tới một Servlet, nó có thể chuyển tiếp yêu cầu tới một trang khác (hoặc một servlet khác). Địa chỉ trên trình duyệt của người dùng vẫn là đường dẫn của trang đầu tiên, nhưng nội dung của trang do trang được chuyển tiếp tới tạo ra.

Trang được chuyển tiếp tới bắt buộc phải là môt trang (hoặc Servlet) nằm trong ứng dụng web của bạn.

Với Forward bạn có thể sử dụng request.setAttribute() để truyền dữ liệu từ trang 1 sang trang thứ 2.

ForwardDemoServlet.java

package org.o7planning.tutorial.servlet.other;
 
import java.io.IOException;
 
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
import org.o7planning.tutorial.beans.Constants;
 
@WebServlet("/other/forwardDemo")
public class ForwardDemoServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
 
    // Request:
    // http://localhost:8080/ServletTutorial/other/forwardDemo?forward=true
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
 
        // Lấy giá trị tham số (parameter) trên URL.
        String forward = request.getParameter("forward");
 
        if ("true".equals(forward)) {
            System.out.println("Forward to ShowMeServlet");
 
            // Sét dữ liệu vào thuộc tính (attribute) của request.
            request.setAttribute(Constants.ATTRIBUTE_USER_NAME_KEY, //
                    "Hi, I'm Tom come from Walt Disney !");
 
            RequestDispatcher dispatcher //
                    = request.getServletContext().getRequestDispatcher("/showMe");
            dispatcher.forward(request, response);
 
            return;
        }
        ServletOutputStream out = response.getOutputStream();
        out.println("<h3>Text of ForwardDemoServlet</h3>");
        out.println("- servletPath=" + request.getServletPath());
    }
 
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        this.doGet(request, response);
    }
 
}

Chạy lại Webserver và chạy lần lượt 2 URL:

  1. http://localhost:8080/ServletTutorial/other/forwardDemo
  2. http://localhost:8080/ServletTutorial/other/forwardDemo?forward=true

Trong trường hợp 1: Không có forward, dữ liệu nhìn thấy trên trang là của ForwardDemoServlet tạo ra.

Trường hợp 2: Có chuyển tiếp (forward) sang servlet ShowMeServlet. Trong trường hợp này URL trên trang là không đổi, trong khi dữ liệu là của ShowMeServlet tạo ra.

Forward (chuyển tiếp) thường được sử dụng trong một số tình huống chẳng hạn người dùng yêu cầu servlet A, tuy nhiên trang này bắt buộc phải login trước, trong servlet A kiểm tra thấy nếu chưa login thì chuyển tiếp sang servlet Login.

Quay lại với RequestDispatcher, chúng ta có 2 cách để lấy đối tượng RequestDispatcher.

Trường hợp request.getServletContext().getRequestDispatcher(url) trả về RequestDispatcher có vị trí tương đối với contextPath (có vị trí tương đối với thư mục gốc của website).

  • http://localhost:8080/contextPath
  • http://localhost:8080/ServletTutorial

Còn gọi request.getRequestDispatcher(url) trả về RequestDispatcher có vị trí tương đối với trang hiện tại.

  • http://localhost:8080/ServletTutorial/other/forwardDemo

Chú ý:

  • Redirect (Chuyển hướng) cho phép bạn chuyển hướng tới các trang bao gồm cả các trang nằm ngoài Website.
  • Forward (Chuyển tiếp) chỉ cho phép chuyển tới các trang nằm trong Website, đồng thời có thể chuyển dữ liệu giữa 2 trang thông qua request.setAttribute.

2. Redirect (Chuyển hướng)

Chuyển hướng (Redirect): Khi một yêu cầu (request) từ phía người dùng tới một Servlet (Trang A), servlet này có thể chuyển yêu cầu này tới một trang khác (Trang B), và kết thúc nhiệm vụ của nó. Trang được chuyển hướng tới có thể là trang trong ứng dụng của bạn, hoặc có thể là một trang bất kỳ. Địa chỉ trên trình duyệt của người dùng lúc này sẽ hiển thị đường dẫn của trang B.

Khác với chuyển tiếp (Forward). Với Redirect bạn không thể sử dụng request.setAttribute(..) để truyền dữ liệu từ trang A sang trang B.

ShowMeServlet.java

package org.o7planning.tutorial.servlet.other;
 
import java.io.IOException;
 
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
import org.o7planning.tutorial.beans.Constants;
 
@WebServlet("/showMe")
public class ShowMeServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
 
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
 
        // Lấy giá trị trong 1 thuộc tính (attribute) của request.
        String value = (String) request.getAttribute(Constants.ATTRIBUTE_USER_NAME_KEY);
 
        ServletOutputStream out = response.getOutputStream();
 
        out.println("<h1>ShowMeServlet</h1>");
        out.println(value);
    }
 
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        this.doGet(request, response);
    }
 
}

RedirectDemoServlet.java

package org.o7planning.tutorial.servlet.other;
 
import java.io.IOException;
 
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
@WebServlet("/other/redirectDemo")
public class RedirectDemoServlet extends HttpServlet {
 
    private static final long serialVersionUID = 1L;
 
    // Request:
    // http://localhost:8080/ServletTutorial/other/redirectDemo?redirect=true
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
 
        // Lấy ra giá trị của tham số (parameter) trên URL.
        String redirect = request.getParameter("redirect");
 
        if ("true".equals(redirect)) {
            System.out.println("Redirect to ShowMeServlet");
 
            // contextPath: Là một String rỗng "" hoặc khác rỗng.
            // Nếu khác rỗng, nó luôn bắt đầu bởi /
            // và không kết thúc bởi /
            String contextPath = request.getContextPath();
 
            // ==> /ServletTutorial/showMe
            response.sendRedirect(contextPath + "/showMe");
            return;
        }
 
        ServletOutputStream out = response.getOutputStream();
        out.println("<h3>Text of RedirectDemoServlet</h3>");
        out.println("- servletPath=" + request.getServletPath());
    }
 
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        this.doGet(request, response);
    }
 
}

Chạy lại webserver và truy cập lần lượt 2 đường dẫn sau lên trình duyệt:

  1. http://localhost:8080/ServletTutorial/other/redirectDemo
  2. http://localhost:8080/ServletTutorial/other/redirectDemo?redirect=true

Với đường dẫn thứ nhất nhận được:

Với đường dẫn thứ 2, request đã chuyển hướng sang ShowMeServlet, đường dẫn URL bạn thấy trên trình duyệt là đường dẫn của servlet ShowMeServlet.

Xem bài viết tiếp theo tại đây.

vncoder logo

Theo dõi VnCoder trên Facebook, để cập nhật những bài viết, tin tức và khoá học mới nhất!



Khóa học liên quan

Khóa học: Servlet/JSP