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
зі значенням falseappPropertiesConfig
з масивом із двох рядків:classpath:local-app.properties
classpath:web-app.properties
Синім кольором зазначено параметри для сервлета ApplicationServlet
: вони будуть доступні йому через ServletConfig
:
application
і значенням com.javarush.Appwidgetset
зі значенням com.javarush.WidgetSetui
зі значенням 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
. Цей фільтр налаштований таким чином, щоб перехоплювати всі запити, які йдуть до нашого вебзастосунку. Про це нам натякає шаблон урлів, куди його замаплено: /*
.
Більше про сервлети та фільтри ти прочитаєш у наступних лекціях.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ