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.

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.

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

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. Цей фільтр налаштований таким чином, щоб перехоплювати всі запити, які йдуть до нашого вебзастосунку. Про це нам натякає шаблон урлів, куди його замаплено: /*.

Більше про сервлети та фільтри ти прочитаєш у наступних лекціях.