7.1 Общая схема web.xml
Файл web.xml хранит информацию о конфигурации приложения. Он не является обязательной его частью, однако очень широко используется для настройки конфигурации веб-приложения.
Этот файл должен располагаться в папке WEB-INF. При запуске Tomcat считывает его содержимое и использует записанную в нем конфигурацию. Если же файл содержит ошибки, то и Tomcat отображает ошибку.
Пример web.xml:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0">
<servlet>
<servlet-name>HelloWorld</servlet-name>
<servlet-class>HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloWorld</servlet-name>
<url-pattern>/welcome</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
</web-app>
Зеленым цветом тут записан маппинг имя сервлета "HelloWorld"
и класса сервлета "HelloServlet"
. Синим цветом записан маппинг имя сервлета "HelloWorld"
и куска URL "http://localhost/welcome"
. Таким образом тут написано, что при обращении к пути /welcome нужно вызвать сервлет HelloServlet.class
.
Красным цветом указан файл, который нужно отдать по запросу http://localhost/
— это так называемая welcome page. Если пользователь просто вобьет в браузере имя, соответствующее корню нашего веб-приложения, то ему отдается содержимое файла index.html
.
7.2 servlet, servlet-mapping
Один сервлет может обслуживать запросы по разным урлам, поэтому в web-xml сервлет и его маппинг на урлы записываются отдельно. Сначала описываем сервлеты, давая каждому уникальное строковое имя, а затем уже указываем, как каждый сервлет мапится на какой url.
Пример web.xml:
<web-app>
<servlet>
<servlet-name>remoting</servlet-name>
<servlet-class>com.javarush.RemotingServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>remoting</servlet-name>
<url-pattern>/remoting/*</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>restapi</servlet-name>
<servlet-class>com.javarush.RestApiServlet</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>restapi</servlet-name>
<url-pattern>/api/*</url-pattern>
</servlet-mapping>
</web-app>
В этом примере объявлено два сервлета, и каждый замаплен на свой шаблон url. Сервлет RemotingServlet
обслуживает все запросы, которые идут на /remoting/*
. Сервлет RestApiServlet
обслуживает все запросы, которые идут на /api/*
. Так же у сервлетов прописан порядок из загрузки — параметр load-on-startup.
7.3 Параметры сервлета
С помощью web.xml сервлету при его инициализации можно передать параметры, они будут доступны через интерфейс ServletConfig
. Также можно задать параметры всему веб-приложению, они будут доступны через интерфейс ServletContext
.
Пример web.xml:
<web-app>
<context-param>
<description>Server production mode</description>
<param-name>productionMode</param-name>
<param-value>false</param-value>
</context-param>
<context-param>
<param-name>appPropertiesConfig</param-name>
<param-value>
classpath:local-app.properties
classpath:web-app.properties
</param-value>
</context-param>
<servlet>
<servlet-name>mainservlet</servlet-name>
<servlet-class>com.javarush.ApplicationServlet</servlet-class>
<init-param>
<param-name>application</param-name>
<param-value>com.javarush.App</param-value>
</init-param>
<init-param>
<param-name>widgetset</param-name>
<param-value>com.javarush.WidgetSet</param-value>
</init-param>
<init-param>
<param-name>ui</param-name>
<param-value>com.javarush.AppUI</param-value>
</init-param>
</servlet>
</web-app>
Зеленым цветом выделен код, где мы задаем параметры для ServletContext
. Их там два:
productionMode
со значением falseappPropertiesConfig
с массивом из двух строк:classpath:local-app.properties
classpath:web-app.properties
Синим цветом указаны параметры для сервлета ApplicationServlet
, они будут доступны ему через ServletConfig
:
application
со значением com.javarush.Appwidgetset
со значением com.javarush.WidgetSetui
со значением com.javarush.AppUI
7.4 filter, filter-mapping
Веб-приложение может также содержать специальные служебные сервлеты — фильтры
. Они выполняют различные служебные задачи: перенаправляют вызовы, проверяют авторизацию и т. д.
Пример web.xml:
<web-app>
<servlet>
<servlet-name>remoting</servlet-name>
<servlet-class>RemotingServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>remoting </servlet-name>
<url-pattern>/remoting/*</url-pattern>
</servlet-mapping>
<filter>
<filter-name>total_filter</filter-name>
<filter-class>com.javrush.TotalFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>total_filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
Прежде чем запрос попадет в сервлет RemotingServlet
, он будет обработан фильтром TotalFiler
. Этот фильтр настроен так, чтобы перехватывать все запросы, которые идут к нашему веб-приложению. Об это однозначно намекает шаблон урлов, на которые он замаплен: /*
.
Больше про сервлеты и фильтры ты прочитаешь в следующих лекциях.