Дескриптор развертывание – очень важная часть web-приложения. В нем, в кратком виде, содержатся требования web-приложения. Его можно прочитать в большинстве XML-редакторов. Web.xml файл – это место, где вы:

  1. Регистрируете и создаете отображение URL на ваши сервлеты;
  2. Регистрируете и задаете любые фильтры и слушатели приложения;
  3. Задаете начальные параметры контекста в виде пар имя/значение;
  4. Конфигурируете страницы ошибок;
  5. Указываете начальные файлы приложения;
  6. Задаете время простоя сеанса (тайм-аут);
  7. Задаете настройки безопасности, управляющие тем, кто к каким web-компонентам может обращаться.

И это только часть тех настроек, которые можно задать в web.xml. В предыдущих постах мы уже сталкивались с дескриптором развертывания. Разберемся с ним более детально. Начнем с пункта 1.

Одной из важных задач конфигурации web-приложения является создание пути, с помощью которого пользователи сети будут обращаться к сервлету. Иногда в этом качестве используют полное имя сервлета, что приводит к появлению невообразимых URI. Вспомним созданный нами в первом посте сервлет FirstServlet. При использовании полного имени сервлета URL запроса может выглядеть так: http://localhost:8084/servlets/ru.topcode.testserv.FirstServlet. Не каждому человеку под силу набрать такой адрес, поэтому имеет смысл поставить сервлету в соответствие некоторый путь к сервлету (servlet path), который будет являться псевдонимом данного сервлета. Новый адрес (с использованием пути к сервлету) может быть таким: http://localhost:8084/test-servlet/firstservlet, где /firstservlet – путь к сервлету.

Путь к сервлету также является идентификатором, используемым другими сервлетами и JSP для переадресации запросов на этот сервлет, он также является адресом, используемым в атрибуте action тегов HTML-форм для передачи сервлету имен и значений параметров. Спецификация сервлетов предлагает интуитивно понятный и гибкий способ: отображение HTTP-запросов на сервлеты с помощью дескриптора развертывания web.xml.

Создание псевдонима сервлета осуществляется с помощью элемента servlet-mapping, находящегося в дескрипторе развертывания. Элемент servlet-mapping ссылается на имя сервлета, появляющееся в элементе servlet-name, например на следующее.

<servlet><servlet-name>FirstServlet</servlet-name></servlet>

Это зарегистрированное имя сервлета. Затем в servlet-mapping приводится имя или шаблон URL, которое пользователи web-приложения могут вводить вбраузере для доступа к данному сервлету. Например:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" 
    xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
    <session-config>
        <session-timeout>
            30
        </session-timeout>
    </session-config>
    <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>
 
    <servlet>
        <servlet-name>FirstServlet</servlet-name>
        <servlet-class>ru.topcode.testserv.FirstServlet</servlet-class>
    </servlet>
 
    <servlet-mapping>
        <servlet-name>FirstServlet</servlet-name>
        <url-pattern>/firstservlet</url-pattern>
    </servlet-mapping>
</web-app>

В данном случае зарегистрированное имя сервлета: FirstServlet. Имя класса указывается в элементе servlet-class. Этот класс сервлета может находиться в каталоге WEB-INF/classes/ru/topcode/testserv/ или в JAR-файле, расположенном в WEB-INF/lib. Имя FirstServlet становится зарегистрированным именем, под которым сервлет выступает в оставшейся части файла web.xml.

А теперь рассмотрим как создать путь к сервлету, по которому пользователи web-приложения будут обращаться к сервлету из браузеров. Это назначение псевдонима выполняется с помощью элемента servlet-mapping. Итак, servlet-name определяет зарегистрированное имя, по которому можно ссылаться на сервлет в файле web.xml, а элемент url-pattern создает URL для доступа к этому сервлету. Символ “/” в шаблоне /firstservlet означает “начиная с корневого каталога web-приложения”.

Обобщая, любому сервлету соответствует следующий URL:

http://<хост>:<порт>/<путь_к_контексту>/<путь_к_сервлету>

А теперь попробуем создать несколько отображений на один сервлет.

Чтобы это сделать, достаточно определить для одного сервлета несколько элементов servlet-mapping. Например:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
    <session-config>
        <session-timeout>
            30
        </session-timeout>
    </session-config>
    <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>
 
    <servlet>
        <servlet-name>FirstServlet</servlet-name>
        <servlet-class>ru.topcode.testserv.FirstServlet</servlet-class>
    </servlet>
 
    <servlet-mapping>
        <servlet-name>FirstServlet</servlet-name>
        <url-pattern>/firstservlet</url-pattern>
    </servlet-mapping>
 
    <servlet-mapping>
        <servlet-name>FirstServlet</servlet-name>
        <url-pattern>/firstservlet_too</url-pattern>
    </servlet-mapping>
</web-app>

Кстати, если вы используете версию сервлетов (спецификацию) 2.3, то все элементы servlet-mapping в дескрипторе развертывания должны появляться только после всех элементов servlet.

Для расширения шаблона отображения можно использовать символ подстановки (*). Если вы сейчас попробуете обратиться к странице http://localhost:8084/test-servlet/firstservlet_too/ (со “/” в конце), то получите ошибку 404, т.к. этот URL уже не удовлетворяет шаблону /firstservlet_too. С помощью символа подстановки можно решить этупроблему. Измените значение в url-pattern с /firstservlet_too на /firstservlet_too/*. Это приведет к выводу сервлета FirstServlet для всех URL, которые начинаются с /firstservlet_too/ и затем, возможно, одержат некоторое имя после слеша. Т.е. теперь вы можете ввести в адресную строку браузера http://localhost:8084/test-servlet/firstservlet_too/blah-blah-blah и все равно попадете на FirstServlet.

Вы также можете использовать шаблоны, указывающие на все файлы с некоторым расширением, например, *.jsp. Такой вариант шаблона называют отображением на расширение (extension mapping).

В этом посте мы разобрались как с помощью дескриптора развертывания web.xml сделать человеко-понятный URL (ЧПУ). Это самый простой способ присвоить имя сервлету. В следующих постах я расскажу о том, как:

  • Создать для сервлета URL как у JSP;
  • Отображать на сервлет обращения к статичному содержимому (html-файлу);
  • Вызывать сервлеты, не имеющие отображения в web.xml;
  • Отображать на сервлет все запросы к web-приложению;
  • Отображать запросы на контроллер с сохранением отображений сервлетов;
  • Создавать начальные (welcome) файлы web-приложения;
  • Ограничивать запросы к определенным сервлетам;
  • Предоставлять доступ к определенным сервлетам только контроллеру.