Servlet là một thành phần quan trọng trong công nghệ Java EE, được sử dụng để phát triển các ứng dụng web. Chúng hoạt động như một cầu nối giữa các yêu cầu từ trình duyệt và ứng dụng web, cho phép xử lý và phản hồi các yêu cầu HTTP. Kiến trúc của Servlet bao gồm nhiều thành phần, mỗi thành phần có vai trò riêng, giúp cho việc phát triển ứng dụng web trở nên hiệu quả và dễ dàng hơn. Dưới đây là một cái nhìn tổng quan chi tiết về kiến trúc của Servlet.

1. Tổng quan về Servlet

Servlet là một lớp Java được triển khai để xử lý các yêu cầu HTTP từ người dùng. Chúng có khả năng tạo ra nội dung động, xử lý dữ liệu từ các form, và tương tác với cơ sở dữ liệu. Servlet được chạy trên máy chủ web và hoạt động trong môi trường servlet container, như Apache Tomcat hoặc Jetty.

2. Các thành phần chính của kiến trúc Servlet

2.1. Client (Khách hàng)

Client là trình duyệt web hoặc bất kỳ ứng dụng nào gửi yêu cầu HTTP đến server. Client tạo ra các yêu cầu HTTP cho server thông qua URL.

2.2. Web Server

Web server là nơi mà Servlet được triển khai và chạy. Web server chịu trách nhiệm xử lý các yêu cầu HTTP từ client, gửi yêu cầu đến Servlet và trả lại phản hồi cho client.

2.3. Servlet Container (Container Servlet)

Servlet container là một phần của web server hoặc có thể là một ứng dụng độc lập, giúp quản lý và điều phối các servlet. Servlet container thực hiện các nhiệm vụ như:

  • Tải servlet khi cần thiết.
  • Gọi các phương thức như init(), service(), và destroy() của servlet.
  • Xử lý các yêu cầu và phản hồi HTTP.
  • Quản lý vòng đời của servlet.

Một số container servlet phổ biến bao gồm:

  • Apache Tomcat
  • Jetty
  • GlassFish

2.4. Servlet

Servlet là một lớp Java thực thi giao diện javax.servlet.Servlet. Có hai loại servlet chính:

  • GenericServlet: Một lớp trừu tượng có thể xử lý cả giao thức TCP và UDP.
  • HttpServlet: Một lớp cụ thể cho việc xử lý các yêu cầu HTTP. Hầu hết các ứng dụng web sử dụng HttpServlet.

2.5. Request và Response Objects

  • HttpServletRequest: Đại diện cho yêu cầu HTTP từ client. Nó chứa thông tin về yêu cầu như tham số, tiêu đề, và thông tin phiên.
  • HttpServletResponse: Đại diện cho phản hồi HTTP từ server. Nó cho phép bạn gửi dữ liệu trở lại client, như HTML, JSON, hoặc các tệp tin khác.

3. Vòng đời của Servlet

Vòng đời của servlet bao gồm ba giai đoạn chính:

3.1. Khởi tạo (Initialization)

Khi servlet được tải lần đầu tiên, phương thức init() được gọi. Trong phương thức này, bạn có thể thực hiện các tác vụ khởi tạo, như kết nối đến cơ sở dữ liệu.

public void init() throws ServletException {
    // Khởi tạo tài nguyên
}

3.2. Xử lý yêu cầu (Request Processing)

Khi client gửi yêu cầu đến servlet, phương thức service() hoặc các phương thức doGet(), doPost(), v.v. được gọi để xử lý yêu cầu.

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // Xử lý yêu cầu GET
}

3.3. Hủy (Destruction)

Khi servlet không còn được sử dụng hoặc server dừng, phương thức destroy() được gọi để giải phóng tài nguyên.

public void destroy() {
    // Giải phóng tài nguyên
}

4. Luồng xử lý của Servlet

Khi client gửi yêu cầu, quá trình xử lý diễn ra như sau:

  1. Client gửi yêu cầu HTTP đến web server.
  2. Web server nhận yêu cầu và chuyển tiếp đến servlet container.
  3. Servlet container xác định servlet nào sẽ xử lý yêu cầu và gọi phương thức service() của servlet.
  4. Servlet thực hiện xử lý và tạo ra phản hồi, có thể truy xuất thông qua các đối tượng HttpServletRequestHttpServletResponse.
  5. Servlet container gửi phản hồi trở lại web server.
  6. Web server trả phản hồi cho client.

5. Ví dụ về Servlet

Dưới đây là ví dụ đơn giản về một servlet sử dụng HttpServlet.

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class HelloWorldServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html");
        response.getWriter().println("<h1>Hello, World!</h1>");
    }
}

Giải thích

  • doGet(): Phương thức này xử lý các yêu cầu GET từ client và trả về một thông điệp “Hello, World!” trong định dạng HTML.

Qua hướng dẫn này, bạn đã hiểu được kiến trúc của Servlet, bao gồm các thành phần chính và vòng đời của một servlet. Việc nắm vững kiến trúc này là rất quan trọng để phát triển các ứng dụng web hiệu quả và tối ưu.