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 со значением false
  • appPropertiesConfig с массивом из двух строк:
    • classpath:local-app.properties
    • classpath:web-app.properties

Синим цветом указаны параметры для сервлета ApplicationServlet, они будут доступны ему через ServletConfig:

  • application со значением com.javarush.App
  • widgetset со значением com.javarush.WidgetSet
  • ui со значением 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. Этот фильтр настроен так, чтобы перехватывать все запросы, которые идут к нашему веб-приложению. Об это однозначно намекает шаблон урлов, на которые он замаплен: /*.

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