Powered by Blogger.

Cơ bản về servlet, servlet container

Sử dụng java một thời gian, mình vẫn không nắm rõ một vài khái niệm như là servlet, servlet container lắm, tranh thủ rỗi nên tìm hiểu rồi viết lại cho đỡ quên.

Servlet là gì?
Như chúng ta đã biết web server dựa trên giao thức http là một giao thức stateless. Tức là mỗi một lần có một user và trang web của chúng ta sẽ tương ứng với một cặp : request và response.
Để biết được nên response gì thì chúng ta cần biết thông tin của request. Trong java để mô tả cặp thông tin này thì chúng ta được cung cấp một class gọi là Servlet.

Class này sẽ được implement các method tương ứng với http method như get hay postpublic class HelloServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) { //làm logic gì đó trong này } } 
Vậy tóm gọn lại thì servlet là  một class abstract lại quá trình tương tác http

Servlet Container là gì?
Đúng theo như tên, servlet container là một cái "thùng" để chứa rất nhiều servlet. Và như đã nói ở trên, servlet là một class tượng trưng cho một cặp http request và response.
Có thể hình dung là mỗi khi có request đến webserver sẽ phân tách url, http method, từ đó biết là nên giao request đó cho servlet nào. Sau đó request đó sẽ được giao cho servlet tương ứng để tiến hành logic.  Về cách mà servlet container tiến hành load các servlet nằm trong nó, cũng như trình tự load có thể tham khảo ở đây:

Vòng đời của Servlet được mô tả như hình dưới đây:

Bước 1 và bước 2 trong 5 bước trên sẽ chỉ được execute một lần duy nhất khi container load nó lên.
Còn 3 bước 3,4,5 sẽ được gọi mỗi khi có request đến.

Có một điểm cần chú ý là servlet là không thread safe, tức là cùng một instance của servlet sẽ có thể được access bởi nhiều thread cùng một lúc. Do đó khi sử dụng biến static, hay các biến có thể thay đổi được chúng ta cần chú ý đến việc thread-safe. 
Các bạn có thể tham khảo ở đây: http://tutorials.jenkov.com/java-servlets/servlet-concurrency.html

Sơ qua về tomcat :  Tomcat gồm có 2 phần chính:
  • Catalina: Servlet container
  • Coyote: HTTP server
Thông thường thì người ta sẽ dùng apache http thay cho coyote. Tức là apache sẽ làm nhiệm vụ phân tách request và "chuyền" request cho catalina, sau đó nhận kết quả từ catalina trả về cho user, thay cho coyote.  Tuy nhiên có cách sử dụng khác là sử dụng nginx đứng trước, sau đó setup proxy_pass và pass request cho coyote thông qua port 8080 cũng hay được sử dụng
    Blogger Comment
    Facebook Comment