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...
}
Более детально о назначении фильтров и сервлетов ты узнаешь в следующих лекциях.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ