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