8.1 Giới thiệu về chú thích servlet

Bắt đầu với phiên bản 7, Tomcat bắt đầu hỗ trợ đặc tả servlet web Servlet API 3.0 . Cụ thể, một gói xuất hiện trong đó có tên javax.servlet.annotation. Nó chứa nhiều loại chú thích có thể được sử dụng để chú thích một lớp servlet. Nếu bạn sử dụng chú thích, thì bộ mô tả triển khai (web.xml) là không cần thiết.

Danh sách các chú thích hữu ích nhất:

chú thích Sự miêu tả
1 @WebServlet Khai báo một servlet
2 @WebInitParam Chỉ định một tham số khởi tạo
3 @WebFilter Khai báo bộ lọc web
4 @WebListener Khai báo trình nghe web
5 @ServletSecurity Cho phép bạn định cấu hình cài đặt bảo mật

Ví dụ:

@WebServlet( urlPatterns = {"/api/*"} )
public class Example extends HttpServlet {
    protected void doGet( HttpServletRequest request, HttpServletResponse response) throws Exception {
         response.setContentType("text/html");
         PrintWriter out = response.getWriter();
         out.println("Hello World!");
    }
}

Một chú thích là đủ để khai báo một servlet và ánh xạ nó để phục vụ tất cả các yêu cầu sẽ đến URL được cung cấp bởi /api/*.

8.2 Thiết lập ánh xạ servlet

Chú thích có @WebServletnhiều tham số cho phép cấu hình rất linh hoạt của servlet mà nó mô tả. Chúng ta hãy xem xét những cái chính:

Thuộc tính Sự miêu tả
1 name Tên duy nhất của Servlet (như trong web.xml)
2 displayName Tên servlet có thể đọc được của con người
3 description Mô tả Servlet
4 value Đặt url cho ánh xạ
5 urlPatterns Chỉ định danh sách các url để ánh xạ (được sử dụng thay cho giá trị)
6 initParams Cho phép bạn đặt các tham số bắt đầu của servlet
7 asyncSupported Chỉ định rằng servlet có thể chạy không đồng bộ (HTTP/2)
số 8 loadOnStartup Số thứ tự để kiểm soát mức độ ưu tiên bắt đầu của servlet
9 smallIcon Đặt một biểu tượng servlet nhỏ
10 largeIcon Đặt một biểu tượng servlet lớn

Có một số điểm thú vị ở đây.

Đầu tiên, lưu ý rằng valueurlPatternslà các thuộc tính có thể hoán đổi cho nhau. Cả hai đều cho phép bạn chỉ định một danh sách các URL mà servlet sẽ ánh xạ tới.

Thứ hai, tham số asyncSupportedcho biết liệu servlet có xử lý chính xác các yêu cầu không đồng bộ qua giao thức HTTP/2 hay không.

Và thuộc tính quan trọng thứ ba là initParams, nó cho phép bạn thiết lập một danh sách các tham số sẽ được đặt trong ServletContext.

Ví dụ:

@WebServlet(
        urlPatterns = {"/sendFile", "/uploadFile"},
        loadOnStartup = 1,
        asyncSupported = true,
        initParams = {
            @WebInitParam(name = "saveDir", value = "c:/uploaded"),
            @WebInitParam(name = "allowedTypes", value = "jpg,gif,png")
        }
)
public class ImageUploadServlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws Exception {
        String saveDir = getInitParameter("saveDir");
        String fileTypes = getInitParameter("allowedTypes");

        PrintWriter writer = response.getWriter();

        writer.println("saveDir = " + saveDir);
        writer.println("fileTypes = " + fileTypes);
    }
}

8.3 Thiết lập ánh xạ bộ lọc

Như đã đề cập ở trên, bộ lọc là một loại tiện ích của servlet và chúng được cấu hình giống như servlet. Dưới đây là các thuộc tính mà một chú thích có @WebFilter:

Thuộc tính Sự miêu tả
1 filterName Lọc tên duy nhất (như trong web.xml)
2 displayName Tên bộ lọc có thể đọc được của con người
3 description Mô tả bộ lọc
4 value / urlPatterns Đặt danh sách các url để ánh xạ
5 dispatcherTypes Chỉ định một danh sách các DispatcherTypes
6 servletNames Chỉ định một danh sách các servlet để áp dụng cho
7 initParams Cho phép bạn đặt các tham số bắt đầu của bộ lọc
số 8 asyncSupported Chỉ định rằng bộ lọc có thể chạy không đồng bộ (HTTP/2)
9 smallIcon Đặt biểu tượng bộ lọc nhỏ
10 largeIcon Đặt biểu tượng bộ lọc lớn

Một ví dụ về bộ lọc chặn tất cả các yêu cầu đối với các servlet cụ thể :

@WebFilter(servletNames = {"MyOwnServlet", "UploadServlet"})
public class MyFilter implements Filter {
    // implements Filter's methods here...
}

Một ví dụ về bộ lọc được cung cấp nhiều tham số :

@WebFilter(
        urlPatterns = "/uploadFilter",
        initParams = @WebInitParam(name = "fileTypes", value = "doc;xls;zip;txt;jpg;png;gif")
)
public class UploadFilter implements Filter {
    // implements Filter's methods here...
}

Một ví dụ về các loại bộ lọc được cung cấp cho RequestDispatcher :

@WebFilter(
        urlPatterns = "/admin",
        dispatcherTypes = {DispatcherType.REQUEST, DispatcherType.FORWARD}
)
public class MyFilter implements Filter {
    // implements Filter's methods here...
}

Bạn sẽ tìm hiểu thêm về mục đích của các bộ lọc và servlet trong các bài giảng sau.