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