Kiến trúc của SERVLET

Gói javax. servlet cung cấp các giao diện và các lớp để xây dựng các Servlet. Kiến trúc của chúng được mô tả như sau.

1. Giao diện Servlet

Giao diện Servlet là một khái niệm ưừu tượng trung tâm ưong Servlet API. Tất cả các Servlet đều cài đặt trực tiếp hoặc gián tiếp giao diện này hoặc mợ rộng (kế thừa) những lớp đã cài đặt nó.

Giao diện này khai báo ba phương thúc định nghĩa vòng đời của Servlet.

  • public void init(ServletConfig  config) throws ServletException

Phương thức này được gọi một lần khi Servlet được tải vào trong Servlet Engine, trước khi Servlet được yêu cầu để xử lý một yêu cầu nào đó. Phương thức init () có một thuộc tính là đối tượng của ServletConfig, và Servlet có thể đọc các đối số khởi tạo cùa nó thông qua đối tượng ServletConf ig. Chúng thường được định nghĩa trong một tệp cấu hình. Một ví dụ thông thường của một đối sổ khởi tạo là định danh database cho một CSDL.

private string databaseURL;

public void init(ServletConfig config) throws ServletException {

super.init(config) ;

databaseURL = con fig.getInitParame ter(“database”);

)

  • public void service (ServletRequest request, ServletResponse response) throws ServletException, IOException

Phương thức này được gọi để xử lý các yêu cầu. Nó cỏ thể không được gọi, gọi một lần hay nhiều lần cho đến khi Servlet được ngưng tải. Nhiều Thread (mỗi Thread cho một yêu cầu) có thể thực thi phương thúc này song song, vì thế nó trờ nên an toàn và hiệu quả hơn.

  • public void destroy!)

Phương thức này chỉ được gọi một lần trước khi Servlet được ngưng tải và sau khi đã kết thúc các dịch vụ, Servlet API có cấu trúc để Servlet có thể cho phép bổ sung một giao thúc khác với HTTP. Gói j avax. servlet chứa các lớp và các giao diện được kế thùa giao diện Servlet một cách độc lập. GÓI javax. servlet. http chửa các lớp và giao diện HTTP cụ thể.

2. Lớp cơ sở HttpServlet

Như ta đã biết, theo giao thức HTTP, dữ liệu được trao đổi giữa máy chủ Server và các máy Client theo một trong hai phương thức GET hay POST. Java định nghĩa một lóp có tên là HttpServlet ờ trong gói javax. servlet để truyền và nhận dữ liệu theo cả hai phương thức trên.

Lớp trừu tượng HttpServlet cung cấp một khung làm việc để xử lý các yêu cầu GET, POST cùa giao thức HTTP. HTTPServlet kế thừa giao diện Servlet cộng với một số các phương thức hữu dụng khác.

Một tập các phương thức trong HTTPServlet là những phương thức xác định dịch vụ trong giao diện Servlet. Việc bổ sung dịch vụ trong HTTPServlet giống như một kiểu của các yêu cầu được xử lý (GET, POST, HEAD, …) và gọi mộrphương thức cụ thể cho mỗi kiểu. Bằng việc làm này, các nhà phát triển Servlet sẽ an tâm khi xử lý chi tiết những yêu cầu như HEAD, TRACE, OPTIONS, … và có thế tập trung vào những yêu cầu thông dụng hon như GET và POST.

HTTP sinh ra các trang HTML và ta có thể nhúng các Servlet vào một trang HTML.

Khi có một yêu cầu được gửi tới, đầu tiên nó phải chỉ ra lệnh cho HTTP bằng cách gọi một phương thức tương ứng. Phương thức này chi cho Server biết kiểu hành động mà nó muốn thực hiện.

Khi có một Client gửi tới một yêu cầu, Server sẽ xừ lý yêu cầu nhận được và gửi trả lại kết quả cho Client. Hai phương thức doGetO và doPostO được sử dụng chung để nhận và gửi tin trong các Servlet.

Một Servlet bất kỳ, vi dụ MỵServlet phải kế thùa HttpServlet và viết đè ít nhất một trong các phương thức doGet ( ) để thực thi thao tác GET của HTTP, hay do Post ( ) đề thực thi thao tác POST của HTTP.

Trong ví dụ đầu tiên, chúng ta sẽ viết đè phương thức doGet ( ) dạng

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

}

Phương thức doGet 0 có hai tham số đối tượng thuộc hai lớp HttpServletRequest và HttpServletResponse (cả hai lóp này được định nghĩa trong javax.servlet.http). Hai đối tượng này cho phép chúng ta truy cập đầy đủ tất cả các thông tin yêu cầu và cho phép gửi dữ liệu kểt quả cho Client để trà lời cho yêu cầu đó.

Với CGI, các biến môi trường và stdìn được sử dụng để nhận thông tin về yêu cầu, tuy nhiên việc đặt tên các biến môi trường có thể khác nhau giữa các chương trình CGI, và một vài biến có thể không được cung cấp bời tất cả các Web Server.

Đối tượng của HttpServletRequest cung cấp thông tin giống như biến môi trường cùa CGI nhưng theo một hướng chuẩn hóa. Nó cũng cung cấp những phương thức để mờ ra các tham số HTTP từ dãy các câu truy vấn hoặc từ nội dung cùa yêu cầu phụ thuộc vào kiểu yêu cầu (GET hay POST).

Ví dụ 6.1.Chương trình FirstServletđể đếm và hiển thị số lần nó được truy cập

package mỵservlet;

import java.io.* ;

import j avax.servlet.* ;

import javax.servlet.http. *;

public class FirstServlet extends HttpServletl int i = 0;

public void doGet(HttpServletRequest re, HttpServletResponse resp) throws ServletException, IOException{ resp.setContentType(“text/html”);

PrintWriter out = resp.getWriter(); i + + ;

out.println(“So lan duoc truy cap: ” + i); out.close();

}

}

doGet (HttpServletRequest req, HttpServletResponse resp) sử dụng đối số thứ nhất req để đọc các phần đầu, tiêu đề (header) cùa HTTP gửi tới (ví dụ nhu dữ liệu dạng HTML mà nguời dùng nhập vào), và sử dụng resp để xác định dòng trả lời cho HTTP (xác định kiểu nội dung trao đổi, đặt Cookie). Điều quan trọng nhất là phải nhận đuợc một đối tượng của PrintWriter (ở trong gói java.io) thông qua resp. getWriter ( ) để gửi kết quả ứả lại cho Client. Ngoài doGet 0 và doPost ( ), HttpServlet còn có các phưomg thức:

  • service ( ) : thực hiện khi đối tượng cùa lớp được tạo lập và triệu gọi doGet ( ) hoặc doPostí).
  • doPut ( ) : thực hiện thao tác PUT của
  • doDelete ( ) : thực hiện thao tác DELETE của HTTP.
  • inito và destroy (): khởi tạo vàhuỷ bỏ các
  • getServletlnfo ( ) : nhận các thông tin về Servlet.

Lưu ý: Cả doGet ( ) và doPost ( ) đều có thể phát sinh ra một trong hai ngoại lệ ServietExceptìon, hay IOException, do vậy ta phải khai báo chúng như trện. Ngoài ra, một điều nữa chúng ta cũng chú ỷ là hai phương thức doGet ( ) và doPost ( ) sẽ được phương thức service 0 gọi để thực hiện và đôi lúc ta có thể viết đè service 0 thay cho hai phương thức trên.