JavaRush /Курсы /JSP & Servlets /Структура web.xml

Структура web.xml

JSP & Servlets
11 уровень , 6 лекция
Открыта

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

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

Комментарии (6)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
jvatechs Уровень 111 Expert
17 июня 2023
Сервлет — это класс, который умеет получать запросы от клиента и возвращать ему ответы. Да, сервлеты в Java — именно те элементы, с помощью которых строится клиент-серверная архитектура. Маппинг сервлета - c помощью элемента <servlet-mapping> можно задать сопоставление сервлета с запрашиваемым URL. https://javarush.com/groups/posts/2529-chastjh-5-servletih-pishem-prostoe-veb-prilozhenie
Vlad Уровень 32
18 января 2023
Создал 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"> вот это: <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd" > Подскажите кто-нибудь как написать эту шапку, или ее можно как-то сгенерировать?
Aslancheek Уровень 51
9 октября 2023
я пока тупо меняю код на тот, что из примера
Bek Уровень 5
1 декабря 2022
Добрый день! Я создал war file с методами. Подскажите пожалуйста, как написать программу так что бы вызвать метод? Уже неделя прошла, не могу разобраться. Для примера есть "pos.war", внутри pos.war есть метод "call". Когда в браузере набираю localhost/8080/pos/call ошибка входит.
Nikita Shamrai Уровень 8 Expert
18 августа 2022
Хоть бы объяснили заче эти параметры передавать и что они означют..
Александр Уровень 2
11 июля 2022
Также можно задать параметры всему веб-приложению, они будут доступны через класс ContextConfig(неверно), д/б указан ServletContext. Исправьте.