Ưu điểm của Servlet so với CGI (Common Gateway

Một phần của tài liệu Giáo trình lập trình Web với Servlet và JSP - Đặng Thanh Dũng (Trang 44 - 46)

Interface)

Java servlet hiệu quả, dễ sử dụng và rẻ hơn CGI truyền thống và nhiều công nghệ tương tự thay thế cho CGI.

Tính hiệu quả

Với CGI, ứng với mỗi HTTP request sẽ có một process (tiến trình) mới được tạo. Với servlets, máy ảo Java vẫn chạy và xử lý mỗi request bằng một thread Java nhỏ (tiểu trình Java), chứ không phải bằng một

system process lớn. Tương tự, trong CGI, nếu có N request gửi tới cùng một chương trình CGI thì code chương trình CGI sẽ được nạp vào bộ nhớ N lần. Ngược lại với Servlet, sẽ có N thread, nhưng chỉ có một bản sao duy nhất của Servlet code sẽ được nạp vào bộ nhớ. Cách tiếp cận này giúp tiết kiệm bộ nhớ máy chủ và tiết kiệm thời gian do việc tạo thể hiện cho ít đối tượng hơn. Cuối cùng, khi chương trình CGI kết thúc việc xử lý một request thì bản thân chương trình cũng kết thúc. Cách tiếp cận này gây khó khăn cho việc tính toán bộ nhớ cache, duy trì các kết nối cơ sở dữ liệu mở và thực hiện các tối ưu hóa khác dựa trên dữ liệu liên tục. Tuy nhiên với Servlet, code chương trình vẫn còn lưu trong bộ nhớ ngay cả sau khi chúng đã hoàn thành một response, vì vậy sẽ dễ dàng cho việc lưu trữ dữ liệu phức tạp giữa các request của các client khác nhau.

Tính tiện lợi (convenient)

Servlets có nền tảng mở, cho phép tự động parse (phân tích để hiểu nội dung) và decode (giải mã) HTML từ dữ liệu, đọc và thiết lập HTTP header, xử lý các tập tin cookie, lưu dấu session và nhiều tiện ích cao cấp khác. Trong khi với CGI, chúng ta phải tự mình làm những việc này.

Tính mạnh mẽ

Servlets hỗ trợ một số tính năng mà rất khó hoặc không thể thực hiện với CGI.

Servlets có thể nói chuyện trực tiếp với các Web server, trong khi CGI lại không làm được nếu không có một server-specific API.

Tính portable (khả chuyển giữa các platform khác nhau)

Servlets được viết bằng ngôn ngữ lập trình Java và theo một API chuẩn. Servlets được hỗ trợ trực tiếp hoặc thông qua plugin trên hầu hết các Web server lớn. Do đó, các servlets code được viết để chạy trên một application server nào đó, ví dụ như Macromedia Jrun, có thể chạy hầu như không thay đổi trên Apache Tomcat, Microsoft Internet Information Server (với một plugin riêng biệt), IBM WebSphere, iPlanet Enterprise Server, Oracle9i AS, hoặc StarNine Webstar.

Giá thành thấp

Một số Web server mặc dù có giá thành rẻ hoặc miễn phí như Apache Tomcat (chạy độc lập hoặc nhúng trong các Apache Web server bình thường, hoặc nhúng trong Microsoft IIS) nhưng lại rất tốt để cài đặt hoặc triển khai các trang web nhỏ. Như vậy, với Servlet/JSP, chúng ta có thể khởi đầu dự án với một server miễn phí hoặc rẻ tiền, sau đó, khi dự án đã có những thành công ban đầu, chúng ta mới đến với các máy chủ đắt tiền hơn với khả năng hiệu suất cao hoặc có các tiện ích quản trị tiên

tiến (ví dụ Caucho Resin), nhưng code của các servlet và JSP vẫn chạy bình thường mà không cần phải viết lại. Khi dự án trở nên lớn hơn nữa, chúng ta có thể chuyển đến môi trường phân tán (distributed), ví dụ như Macromedia JRun Professional –một Web server hỗ trợ các distributed application (Web farms). Khi một ứng dụng trở nên phức tạp, chúng ta có thể dùng Enterprise JavaBeans (EJB) để đóng gói business logic của ứng dụng. Điều này trái ngược với rất nhiều các lựa chọn thay thế CGI khác, thường sẽ đòi hỏi một sự đầu tư ban đầu lớn để mua một gói phần mềm độc quyền.

Tính an toàn

Một trong những nguyên nhân chính của các lỗi bảo mật trong các ứng dụng được viết theo kiểu CGI bắt nguồn từ thực tế rằng các chương trình này thường được kích hoạt bởi các shell của hệ điều hành. Khi đó, các lập trình viên CGI phải rất cẩn thận để lọc ra các ký tự đặc biệt (như dấu nháy kép, dấu chấm phẩy,…) vốn được các shell xử lý một cách đặc biệt.

Nguyên nhân thứ hai là các chương trình CGI được viết bằng các ngôn ngữ mà không tự động kiểm tra giới hạn của mảng, chuỗi, dẫn đến các lỗi tràn bộ nhớ.

Tuy nhiên, với Servlets, chúng ta sẽ không gặp các vấn đề này. Ngay cả khi một servlet thực hiện một system call (ví dụ bằng cách dùng Runtime.exec hoặc JNI) để kích hoạt (triệu gọi) một chương trình chạy trên hệ điều hành, nó không dùng shell để triệu gọi. Mặt khác, bản thân ngôn ngữ lập trình Java có khả năng kiểm tra việc tràn mảng và có các cơ chế khác để bảo vệ bộ nhớ.

Một phần của tài liệu Giáo trình lập trình Web với Servlet và JSP - Đặng Thanh Dũng (Trang 44 - 46)