
Servlet là gì là câu hỏi mà bất kỳ ai bắt đầu học lập trình web bằng Java đều gặp phải. Bài viết này giúp bạn hiểu bản chất của Servlet, vai trò của nó trong ứng dụng Java Web, cũng như cách tự tay viết một chương trình Servlet cơ bản. Đọc hết bài, bạn sẽ nắm được vòng đời Servlet và phân biệt được Servlet với JSP.
Servlet là một lớp Java chạy phía máy chủ, có nhiệm vụ tiếp nhận yêu cầu từ client, xử lý logic và tạo phản hồi. Servlet hoạt động trong Servlet Container thuộc nền tảng Java EE, nay là Jakarta EE, và thường được sử dụng để xử lý các yêu cầu HTTP trong ứng dụng web.
Servlet được phát triển nhằm khắc phục những hạn chế của CGI truyền thống. Thay vì tạo một tiến trình mới cho mỗi yêu cầu, Servlet Container có thể xử lý nhiều yêu cầu đồng thời bằng các luồng, giúp tiết kiệm tài nguyên và cải thiện hiệu suất. Servlet Container, chẳng hạn như Apache Tomcat, chịu trách nhiệm nạp, khởi tạo, quản lý vòng đời và điều phối yêu cầu đến Servlet phù hợp.

Trong hệ sinh thái Java Web, Servlet là một thành phần cốt lõi của Java EE, nay là Jakarta EE, đóng vai trò nền tảng cho nhiều công nghệ web Java khác. Nó cung cấp cơ chế cơ bản để xây dựng ứng dụng web động và là nền tảng cho các công nghệ như JSP.
Sự hiện diện của Servlet giúp ứng dụng Java giao tiếp hiệu quả với trình duyệt web thông qua giao thức HTTP. Nhờ đó, lập trình viên có một môi trường ổn định để phát triển các giải pháp web dù đơn giản hay phức tạp.

Cụ thể, Servlet đảm nhiệm những nhiệm vụ chính sau trong một ứng dụng Java Web:

Khi người dùng gửi một yêu cầu thông qua trình duyệt, máy chủ sẽ thực hiện tuần tự các bước sau để trả về kết quả.

Servlet là chương trình Java chạy trên máy chủ, hoạt động như tầng trung gian cốt lõi để phát triển ứng dụng web. Dưới đây là năm chức năng nổi bật và quan trọng nhất của Servlet.
Servlet tiếp nhận các yêu cầu HTTP từ trình duyệt của người dùng, ví dụ như form đăng nhập hay dữ liệu truyền tải. Sau khi đọc và phân tích dữ liệu, nó tạo nội dung phản hồi như HTML, JSON hoặc XML để trả về cho trình duyệt.
Trong kiến trúc mô hình - khung nhìn - bộ điều khiển, Servlet đóng vai trò bộ điều khiển. Nó nhận lệnh từ người dùng, gọi các logic nghiệp vụ, cập nhật dữ liệu rồi lựa chọn trang hiển thị phù hợp để trả về.
Giao thức HTTP vốn không lưu trạng thái, nhưng Servlet có khả năng theo dõi phiên làm việc của từng người dùng thông qua session hoặc cookie. Nhờ vậy, thông tin như giỏ hàng hay trạng thái đăng nhập được giữ lại xuyên suốt nhiều trang.
Servlet có thể kết nối trực tiếp với cơ sở dữ liệu như MySQL, Oracle, SQL Server thông qua JDBC. Nó cũng có thể giao tiếp với các thành phần khác để thực hiện những nghiệp vụ phức tạp hơn.
Servlet có khả năng tạo nội dung HTML trực tiếp trong mã Java, hoặc kết hợp cùng JSP để tách biệt phần xử lý logic và phần giao diện. Cách kết hợp này giúp trang web tương tác theo thời gian thực với người dùng.
Servlet Container (ví dụ Tomcat, Jetty) là thành phần chịu trách nhiệm quản lý toàn bộ vòng đời của một Servlet, từ lúc sinh ra đến lúc bị huỷ. Quá trình này gồm 4 giai đoạn nối tiếp nhau như sau:
Toàn bộ 4 giai đoạn trên đều diễn ra bên trong môi trường JVM, dưới sự kiểm soát của container. Container không chỉ quản lý vòng đời Servlet mà còn xử lý các nghiệp vụ liên quan đến HTTP request, đảm bảo việc tạo, thực thi và huỷ Servlet diễn ra an toàn, ổn định và không gây rò rỉ tài nguyên.
Vì Servlet giải quyết được đúng những điểm yếu của CGI (Common Gateway Interface, công nghệ xử lý phía server cho web động ra đời trước Servlet):
Servlet là các lớp Java thuần tuý dùng để xử lý logic, còn JSP là công nghệ dạng HTML được nhúng mã Java để hiển thị giao diện. Servlet biên dịch thành mã bytecode ngay từ đầu, còn JSP cần chuyển đổi thành Servlet trước khi thực thi.
Tiêu chí | Servlet | JSP |
| Bản chất | Là một lớp Java thuần túy chạy trên máy chủ | Là tệp văn bản có cấu trúc HTML được nhúng các đoạn mã Java |
| Vai trò | Đóng vai trò Bộ điều khiển (Controller), chuyên nhận yêu cầu, xử lý logic, gọi cơ sở dữ liệu | Đóng vai trò Khung nhìn (View), chuyên dùng để hiển thị giao diện và trả kết quả về cho người dùng |
| Mã nguồn | Chứa chủ yếu code Java. Mã HTML phải viết dưới dạng chuỗi out.print() nên rất khó đọc và khó bảo trì giao diện | Chứa chủ yếu code HTML. Các đoạn code Java được đưa vào các thẻ đặc biệt (ví dụ <% %>) giúp dễ thiết kế giao diện hơn |
| Hiệu suất | Tốc độ phản hồi nhanh ngay từ đầu vì là mã Java đã được biên dịch sẵn thành bytecode. | Phản hồi chậm hơn ở lần chạy đầu tiên (do phải dịch ra Servlet rồi mới biên dịch), nhưng các lần chạy sau có tốc độ tương đương Servlet |
| Vòng đời | Quản lý bởi các phương thức: init(), service(), destroy() | Được bộ quản lý tự động chuyển đổi thành Servlet, vòng đời quản lý bởi: jspInit(), _jspService(), jspDestroy() |
Nắm vững Servlet là gì, vai trò và vòng đời của nó chính là bước nền tảng để bạn hiểu sâu hơn về Java Web. Dù ít khi viết Servlet thuần trong dự án thực tế hiện đại, kiến thức này vẫn giúp bạn gỡ lỗi nhanh hơn và thiết kế hệ thống backend Java vững chắc hơn.
