Thứ Bảy, 13 tháng 9, 2014

Dispatcher in servlet

Một RequestDispatcher là một class vô cùng quan trọng trong Java. Nó giúp cho trang web chuyển request từ servlet này sang một servlet khác bằng cách cho phép gọi một servlet khác từ trong một servlet khác. Nó tạo ra một đối tượng nhận request từ client và gửi chúng đến bất kỳ resource nào như một servlet, HTML hay JSP file.
Để có được đối tượng RequestDispatcher ta sử dụng method getRequestDispather() từ đối tượng HttpServletRequest.  
protected void doPost(HttpServletRequest request,
                      HttpServletResponse response)
        throws ServletException, IOException {
   RequestDispatcher requestDispatcher =
    request.getRequestDispatcher("index.jsp");
}
Đoạn code trên cho ta một RequestDispatcher.Với request là một đối tượng của ServletRequest và index.jsp là tên của resource.Phương thức getRequestDispatcher() có tham số là chuỗi đường dẫn đến resource mà request được chuyển đến. Để gọi RequestDispatcher Ta sử dụng phương thức include() hoặc forward()  
requestDispatcher.forward(request, response);
requestDispatcher.include(request, response);
Khi gọi include() hoặc forward(), servlet container sẽ kích hoạt bất cứ resource nào (servlet, html file hoặc jsp file) mà mapping với url của RequestDispatcher . Giả sử resource là một servlet khác, thì servlet được gọi tới có thể truy xuất request như servlet gọi nó, và sẽ tạo response như servlet hiện tại. Có sự khác nhau giữa include() và forward()
Forward() method:
Chuyển một request từ một servlet tới resource khác trên server và chuyển hoàn toàn quyền cho servlet được chuyển tới. Trước khi forward, nó không xử lý gì về nội dung và đến servlet cuối cùng mới thực hiện điều đó (print ra màn hình)
Include() method
Để nhận kết quả trả về từ trang đích và tiếp tục xử lý. Kết quả của servlet được gọi sẽ được ghép với servlet được kích hoạt

Giả sử ta có một request gửi đến servlet có tên là GateKeeper. GateKeeper sẽ làm nhiệm vụ chuyển request đến các servlet tương ứng.


Để thực hiện điều này, đầu tiên ta tạo file index.jsp có form như sau
<body>
<div>Chose your anwser</div>
<form action="GateKeeper">
 <select name="answer">
  <option value="1">Answer 1</option>
  <option value="2">Answer 2</option>
  <option value="3">Answer 3</option>
  <option value="4">Answer 4</option>
 </select>
    <input type="submit" value="Submit" />
</form>
</body>
Tạo một servlet có tên Gatekeeper để chuyển request đến các servlet khác. Gatekeeper sẽ chuyển request đến servlet tương ứng được map trong parameter của getRequestDispatcher()
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
               String answer = request.getParameter("answer");
               RequestDispatcher requestDispatcher = request.getRequestDispatcher("Answer" + answer);
               requestDispatcher.forward(request, response);
        }
Ta tạo thêm 4 servlet: Answer1, Answer2, Answer3, Answer4 với kết quả hiển thị tương ứng.
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
               PrintWriter writer = response.getWriter();
               writer.println("This is Answer 2");
        }       

 Chạy file index.jsp ta được giao diện như hình dưới.
Khi chọn Answer 2 và nhấn Submit, request sẽ gửi tới servlet Gatekeeper, tại đây Gatekeeper sẽ xử lý và nhận vào parameter là Answer 2 và nó sẽ chuyển request này đến servlet Answer2, cuối cùng in ra kết quả như hình dưới.

3 nhận xét: