8.1 Знакомство с аннотациями сервлетов

Начиная с 7-й версии Tomcat стал поддерживать спецификацию веб-сервлетов Servlet API 3.0. В ней в частности появился пакет под названием javax.servlet.annotation. Он содержит различные типы аннотаций, которые можно использовать для аннотирования класса сервлета. Если ты используешь аннотацию, то дескриптор развертывания (web.xml) не требуется.

Список самых полезных аннотаций:

Аннотация Описание
1 @WebServlet Объявляет сервлет
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!");
    }
}

Одной аннотации достаточно, чтобы объявить сервлет и замапить его на обслуживание всех запросов, которые будут приходить на URL, заданный шаблоном /api/*.

8.2 Настройка мапинга сервлета

У аннотации @WebServlet много параметров, которые позволяют очень гибко сконфигурировать сервлет, которые она описывает. Давай ознакомимся с основными из них:

Атрибут Описание
1 name Уникальное имя сервлета (как в web.xml)
2 displayName Читаемое имя сервлета для человека
3 description Описание сервлета
4 value Задает url для мапинга
5 urlPatterns Задает список url-ов для мапинга (используется вместо value)
6 initParams Позволяет задать стартовые параметры сервлета
7 asyncSupported Указывает, что сервлет может работать асинхронно (HTTP/2)
8 loadOnStartup Порядковый номер для управления приоритетом старта сервлетов
9 smallIcon Задает маленькую иконку сервлета
10 largeIcon Задает большую иконку сервлета

Интересных моментов тут несколько.

Во-первых, обрати внимание, что value и urlPatterns — взаимозаменяемые атрибуты. Они оба позволяют задать список урлов, на которые должен замапиться сервлет.

Во-вторых, параметр asyncSupported указывает, будет ли сервлет корректно обрабатывать асинхронные запросы по протоколу 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 Настройка маппинга фильтров

Как уже говорилось выше, фильтры — это служебная разновидность сервлетов, и настраиваются они подобно сервлетам. Вот какие атрибуты есть у аннотации @WebFilter:

Атрибут Описание
1 filterName Уникальное имя фильтра (как в web.xml)
2 displayName Читаемое имя фильтра для человека
3 description Описание фильтра
4 value / urlPatterns Задает список url-ов для мапинга
5 dispatcherTypes Задает список типов DispatcherType
6 servletNames Задает список сервлетов, к которым применяется
7 initParams Позволяет задать стартовые параметры фильтра
8 asyncSupported Указывает, что фильтр может работать асинхронно (HTTP/2)
9 smallIcon Задает маленькую иконку фильтра
10 largeIcon Задает большую иконку фильтра

Пример фильтра, который перехватывает все запросы к определенным сервлетам:

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

Более детально о назначении фильтров и сервлетов ты узнаешь в следующих лекциях.


Tomcat установка, настройка, деплой