8.1 servlet註解介紹

從版本 7 開始,Tomcat 開始支持Servlet API 3.0 web servlet 規範。特別是,其中出現了一個名為javax.servlet.annotation. 它包含各種類型的註釋,可用於註釋 servlet 類。如果您使用註釋,則不需要部署描述符 (web.xml)。

最有用的註釋列表:

註解 描述
1個 @WebServlet 聲明一個 servlet
2個 @WebInitParam 指定一個初始化參數
3個 @WebFilter 聲明一個網頁過濾器
4個 @WebListener 聲明網絡監聽器
5個 @ServletSecurity 允許您配置安全設置

例子:

@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!");
    }
}

一個註解就足以聲明一個 servlet 並將其映射為服務所有將到達/api/*.

8.2 設置servlet映射

註釋有@WebServlet許多參數,允許對其描述的 servlet 進行非常靈活的配置。讓我們來看看主要的:

屬性 描述
1個 name Servlet 唯一名稱(如在 web.xml 中)
2個 displayName 人類可讀的 servlet 名稱
3個 description 服務小程序說明
4個 value 設置映射的 url
5個 urlPatterns 指定要映射的 url 列表(用於代替值)
6個 initParams 允許您設置 servlet 的啟動參數
7 asyncSupported 指定 servlet 可以異步運行 (HTTP/2)
8個 loadOnStartup 控制servlet啟動優先級的序號
9 smallIcon 設置一個小的 servlet 圖標
10 largeIcon 設置一個大的 servlet 圖標

這裡有幾個有趣的點。

首先,請注意valueurlPatterns是可互換的屬性。它們都允許您指定 servlet 應映射到的 URL 列表。

其次,該參數asyncSupported指示 servlet 是否會正確處理通過 HTTP/2 協議的異步請求。

第三個重要的屬性是initParams,它允許您設置將放置在 ServletContext 中的參數列表。

例子:

@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 設置過濾器映射

如上所述,過濾器是一種實用類型的 servlet,它們的配置類似於 servlet。以下是註釋具有的屬性@WebFilter

屬性 描述
1個 filterName 過濾器唯一名稱(如在 web.xml 中)
2個 displayName 人類可讀的過濾器名稱
3個 description 過濾器說明
4個 value / urlPatterns 設置要映射的 url 列表
5個 dispatcherTypes 指定 DispatcherTypes 的列表
6個 servletNames 指定要應用的 servlet 列表
7 initParams 允許您設置過濾器的啟動參數
8個 asyncSupported 指定過濾器可以異步運行 (HTTP/2)
9 smallIcon 設置一個小過濾器圖標
10 largeIcon 設置一個大過濾器圖標

攔截對特定 servlet 的所有請求的過濾器示例:

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

給定多個參數的過濾器示例:

@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...
}

給定 RequestDispatcher 類型的過濾器示例:

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

在接下來的課程中,您將了解有關過濾器和 servlet 用途的更多信息。