Giao diện 1.1 Servlet

Hôm nay chúng ta sẽ bắt đầu một chủ đề mới và thú vị - servlet . Chính việc bổ sung các servlet cho Java đã dẫn đến việc Java trở thành tiêu chuẩn trên thực tế cho các ứng dụng máy chủ lớn. 80% tất cả phần mềm doanh nghiệp trên thế giới được viết bằng Java. Và ở Trung Quốc, mọi thứ đều là 100%. Vậy servlet là gì?

Một servlet chính xác là thứ biến một chương trình Java thành một dịch vụ web và cho phép nó xử lý các yêu cầu từ các máy khách. Và nó đã như thế này...

Vào những năm 90, ngay sau khi World Wide Web ra đời, các máy khách web (trình duyệt) và máy chủ web đã xuất hiện. Các máy chủ web thường chỉ phân phối tệp mà chúng đã lưu trữ qua Internet: các trang html, tập lệnh, ảnh, v.v.

Tại một thời điểm nào đó, mọi người đều đi đến kết luận rằng cần phải làm cho cả hai bên thông minh hơn. JavaScript đã được thêm vào các trang HTML và các plugin đã được thêm vào máy chủ - các tập lệnh đặc biệt được gọi để đáp ứng một số yêu cầu nhất định và giúp hành vi của máy chủ trở nên linh hoạt hơn và thông minh hơn.

Vì vậy, một servlet là một plugin Java được tích hợp sẵn Java web-servervà cho phép nó thực thi mã Java khi được yêu cầu cho một số trang nhất định. Và mã Java này, được đại diện bởi một lớp kế thừa từ lớp Servlet, đã thực hiện những gì mà các nhà phát triển của nó dự định.

Và như bạn đã biết, máy chủ web Java phổ biến nhất là Tomcat . Nhân tiện, được đặt tên để vinh danh chú mèo Tom trong phim hoạt hình “Tom và Jerry”.

Tomcat tương tác với servlet như thế nào? Trên thực tế, quy trình này được tiêu chuẩn hóa và được gọi là vòng đời của servlet . Trong đó, một servlet là một đối tượng có thể tải được, và một máy chủ web là một thùng chứa servlet .

Nếu servlet chưa được tải , thì:

  1. Lớp servlet được tải bởi vùng chứa.
  2. Bộ chứa tạo một thể hiện của lớp (đối tượng) của servlet.
  3. Container gọi một phương thức init()trên đối tượng servlet. Phương thức này chỉ được gọi một lần.

Chu trình làm việc tiêu chuẩn - phục vụ yêu cầu của khách hàng :

  • Mỗi yêu cầu được xử lý trong một luồng riêng biệt.
  • Bộ chứa gọi một phương thức service()trên servlet và chuyển các đối tượng ServletRequest và ServletResponse tới đó.
  • Để kết thúc servlet, một phương thức được gọi destroy()trên đối tượng servlet. Nó chỉ được gọi một lần.

Có thể có nhiều lý do tại sao một servlet chấm dứt:

  • Lập trình viên khởi động lại máy chủ web, cần phải tắt tất cả các servlet một cách duyên dáng.
  • Lập trình viên tải phiên bản mới của servlet, phiên bản cũ phải được tải chính xác.
  • Và như thế.

Hãy nhớ điều chính: máy chủ web và các máy chủ của nó sẽ hoạt động trơn tru và khởi động lại trong nhiều tháng, phục vụ hàng nghìn yêu cầu mỗi phút. Do đó, mã cho cả tải, hoạt động và dỡ một servlet phải luôn được viết với chất lượng rất cao.

1.2 Lớp httpServlet

Lớp Servlet tồn tại để tiêu chuẩn hóa cách hoạt động của servlet và vùng chứa. Người lập trình không làm việc trực tiếp với lớp này. Vâng, họ hiếm khi làm việc. Lớp được sử dụng phổ biến nhất HttpServletđược kế thừa từ Servlet.

Lớp này có một số phương thức sẽ hữu ích cho chúng ta. Bạn sẽ thường xuyên sử dụng chúng:

Phương pháp Sự miêu tả
1 init() Được gọi một lần khi servlet được tải
2 destroy() Được gọi một lần khi servlet không được tải
3 service(HttpRequest, HttpResponse) Được gọi cho mọi yêu cầu mới tới servlet
4 doGet(HttpRequest, HttpResponse) Được gọi cho mọi yêu cầu GET mới tới servlet
5 doPost(HttpRequest, HttpResponse) Được gọi cho mọi yêu cầu POST mới tới servlet
6 doHead(HttpRequest, HttpResponse) Được gọi cho mọi yêu cầu HEAD mới tới servlet
7 doDelete(HttpRequest, HttpResponse) Được gọi cho mọi yêu cầu XÓA mới tới servlet
số 8 doPut(HttpRequest, HttpResponse) Được gọi cho mọi yêu cầu PUT mới tới servlet

Các phương thức init()destroy()được kế thừa từ lớp Servlet. Do đó, nếu bạn quyết định ghi đè chúng trong servlet của mình, bạn cũng sẽ cần gọi phần triển khai của chúng từ lớp cơ sở. Lệnh được sử dụng cho việc này super.method name().

Ví dụ về máy chủ:


public class FirstHttpServlet extends HttpServlet {
  
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        
        // Getting the parameter “secret” from request
        String secret = request.getParameter("secret");
 
        // Put parameter “secret” into Http-session
        HttpSession session = request.getSession(true);
        session.setAttribute("secret", secret);
 
        // Print HTML as response for browser
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        try {
            out.println("<html>");
            out.println("<head>");
            out.println("<title>Header</title>");
            out.println("</head>");
            out.println("<body>");
            out.println("<h1>Servlet example "+ secret +"</h1>");
            out.println("</body>");
            out.println("</html>");
        } finally {
            out.close();
        }
    }
}

Phương thức dịch vụ 1.3(HttpServletRequest, HttpServletResponse)

Nếu bạn nhìn vào quá trình xử lý yêu cầu của máy khách từ quan điểm của một servlet, thì mọi thứ sẽ giống như thế này.

Đối với mỗi yêu cầu của máy khách, bộ chứa (máy chủ web) tạo HttpServletRequestvà các đối tượng HttpServletResponse, sau đó gọi một phương thức service(HttpServletRequest request, HttpServletResponse response)trên servlet tương ứng. Các đối tượng này được truyền cho nó để phương thức có thể lấy dữ liệu cần thiết từ đó requestvà đưa kết quả của công việc vào response.

Phương pháp này service()có một triển khai mặc định. Nếu nó không được xác định lại, thì nó sẽ được thực thi. Đó là những gì anh ấy làm.

Phương thức service()xác định loại phương thức HTTP từ yêu cầu (GET, POST, ...) và gọi phương thức tương ứng với yêu cầu.

Phương pháp Sự miêu tả
1 service(HttpRequest, HttpResponse) Được gọi cho mọi yêu cầu mới tới servlet
2 doGet(HttpRequest, HttpResponse) Được gọi cho mọi yêu cầu GET mới tới servlet
3 doPost(HttpRequest, HttpResponse) Được gọi cho mọi yêu cầu POST mới tới servlet
4 doHead(HttpRequest, HttpResponse) Được gọi cho mọi yêu cầu HEAD mới tới servlet
5 doDelete(HttpRequest, HttpResponse) Được gọi cho mọi yêu cầu XÓA mới tới servlet
6 doPut(HttpRequest, HttpResponse) Được gọi cho mọi yêu cầu PUT mới tới servlet

Trong lớp của bạn, bạn có thể xác định lại một phương thức service()hoặc để nguyên phương thức đó, nhưng sau đó xác định lại các phương thức doGet(), doPost(), ... nếu cần.