Настройка и описание web.xml в приложении с Spring и JSF
Java веб-приложения используют файл дескриптора развертывания для определения какие URL будут передаваться определенному сервлету, какие URL требуют аутентификации и др. Этот дескриптор развертывания называется web.xml и находится в WAR приложения в WEB-INF/ директории. Web.xml — часть стандарта сервлета для веб-приложений.
О дескрипторе развертывания
Дескриптор развертывания веб-приложений описывает классы, ресурсы и конфигурацию приложения, а так же как сервер будет использовать их для выполнения веб-запросов. Когда сервер получает запрос для приложения, он использует дескриптор развертывания для отображения URL запроса к коду, который должен этот запрос обработать.
Вот пример простого web.xml отображающего все пути URL (т.е. /*) к классу сервлета mysite.server.ComingSoonServlet:
1 2 3 4 5 6 7 8 9 10 |
<web-app xmlns="http://java.sun.com/xml/ns/javaee" version="2.5"> <servlet> <servlet-name>comingsoon</servlet-name> <servlet-class>mysite.server.ComingSoonServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>comingsoon</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping> </web-app> |
Сервлеты и пути URL
web.xml определяет соответствие между путями URL и сервлетами, которые эти URL будут обрабатывать. Веб-сервер использует эту конфигурацию, чтоб определить сервлет для обработки данного запроса и вызвать метод класса, который соответствует методу запроса (например метод doGet() для HTTP.GET запросов).
Для привязки («маппинг») URL к сервлету, необходимо определить элементы <servlet> и <servlet-mapping>.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
<servlet> <servlet-name>redteam</servlet-name> <servlet-class>mysite.server.TeamServlet</servlet-class> <init-param> <param-name>teamColor</param-name> <param-value>red</param-value> </init-param> <init-param> <param-name>bgColor</param-name> <param-value>#CC0000</param-value> </init-param> </servlet> <servlet> <servlet-name>blueteam</servlet-name> <servlet-class>mysite.server.TeamServlet</servlet-class> <init-param> <param-name>teamColor</param-name> <param-value>blue</param-value> </init-param> <init-param> <param-name>bgColor</param-name> <param-value>#0000CC</param-value> </init-param> </servlet> |
Элемент <servlet-mapping> определяет шаблон URL и имя сервлета, который будет обрабатывать запросы, соответствующие шаблону. Шаблон должен содержать полный путь URL, включая (/), следующий за именем домена.
1 2 3 4 5 6 7 8 9 |
<servlet-mapping> <servlet-name>redteam</servlet-name> <url-pattern>/red/*</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>blueteam</servlet-name> <url-pattern>/blue/*</url-pattern> </servlet-mapping> |
В этом примере запрос с URL http://www.example.com/blue/teamProfile будет перехвачен классом сервлета TeamServlet с параметром teamColor=blue и bgColor=#0000CC.
Пример с множеством сервлетов
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
<servlet> <servlet-name>watermelon</servlet-name> <servlet-class>myservlets.watermelon</servlet-class> </servlet> <servlet> <servlet-name>garden</servlet-name> <servlet-class>myservlets.garden</servlet-class> </servlet> <servlet> <servlet-name>list</servlet-name> <servlet-class>myservlets.list</servlet-class> </servlet> <servlet> <servlet-name>kiwi</servlet-name> <servlet-class>myservlets.kiwi</servlet-class> </servlet> <servlet-mapping> <servlet-name>watermelon</servlet-name> <url-pattern>/fruit/summer/*</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>garden</servlet-name> <url-pattern>/seeds/*</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>list</servlet-name> <url-pattern>/seedlist</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>kiwi</servlet-name> <url-pattern>*.abc</url-pattern> </servlet-mapping> |
URL
|
|
---|---|
http://host:port/mywebapp/fruit/summer/index.html |
watermelon |
http://host:port/mywebapp/fruit/summer/index.abc |
watermelon |
http://host:port/mywebapp/seedlist |
list |
http://host:port/mywebapp/seedlist/index.html |
Сервлет по умолчанию (если сконфигурирован), или HTTP 404 File Not Found error message.
Если маппинг сервлета
list соответствует /seedlist* , то будет вызван сервлет list |
http://host:port/mywebapp/seedlist/pear.abc |
kiwi Если маппинг сервлета
list соответствует /seedlist* , то будет вызван сервлет list |
http://host:port/mywebapp/seeds |
garden |
http://host:port/mywebapp/seeds/index.html |
garden |
http://host:port/mywebapp/index.abc |
kiwi |
Настройка атрибута <welcome-file-list> в web.xml
Когда URL сайта представляет путь для статичных файлов в вашем WAR, то часто хорошей идеей будет настройка атрибута <welcome-file-list> (например для начальной страницы авторизации). Пользователь находящийся на странице /help/accounts/password.xhtml может попытаться перейти на /help/accounts/ для доступа к закрытой информации. Дескриптор развертывания может задать список имен, которые должен перепробовать сервер, когда пользователь обращается к пути из подкаталога WAR (который неявно обрабатывается сервлетом), прежде чем выдать ошибку URL не найден.
К примеру, если пользователь попытается перейти по пути /help/accounts/, то следующие настройки <welcome-file-list> заставят сервер проверить /help/accounts/index.xhtml и /help/accounts/index.html, прежде чем вывести 404 ошибку:
1 2 3 4 |
<welcome-file-list> <welcome-file>index.xhtml</welcome-file> <welcome-file>index.html</welcome-file> </welcome-file-list> |
Настройка начальной страницы c помощью <welcome-file-list>
При запуске приложения можно задать начальную страницу, на которую перейдет браузер. Частая проблема, что при загрузке сервера приложений мы получаем 404 ошибку — страница не найдена. Давайте разберемся как нужно настраивать файл web.xml веб-приложения.
В первую очередь нужно учесть, что папка WEB-INF/ используется для внутренних файлов (те же настройки и т.п.) и НЕ доступна извне. Т.е. начальную страницу можно хранить только вне этой папки. Например в webapp/folder/index.xhtml — можно, а в webapp/WEB-INF/folder/index.xhtml — нельзя.
1 2 3 4 5 |
<span class="pln">WebContent |-- META-INF |-- WEB-INF | `-- web.xml `-- index.xhtml</span> |
Теперь собственно к настройкам.
Например у нас есть сервлет с полным именем com.examplecompany.MyCMS. Он будет доступен при перехвате ссылок, соответствующих шаблону /CMS, т.е. http://yoursite.com/CMS.
1 2 3 4 5 6 7 8 9 10 |
<!-- Define the com.examplecompany.MyCMS servlet class, giving it the name MyCMS --> <servlet> <servlet-name>MyCMS</servlet-name> <servlet-class>com.examplecompany.MyCMS</servlet-class> </servlet> <!-- Map the MyCMS name to the URI /CMS (main page for site) --> <servlet-mapping> <servlet-name>MyCMS</servlet-name> <url-pattern>/CMS</url-pattern> </servlet-mapping> |
Теперь определим <welcome-file-list> со списком страниц, которые должен перебрать сервер, прежде чем выдать ошибку путь не найден:
1 2 3 4 5 6 7 |
<!-- The main page for the site will be the MyCMS servlet (http://website/CMS) --> <welcome-file-list> <welcome-file>CMS</welcome-file> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> </welcome-file-list> |
Как это будет работать?
Когда кто-либо переходит на сайт, то происходит следующее
- http://yoursite.com превращается в http://yoursite.com/
- Сервер не находит ничего полезного для отображения и должен вывести ошибку, но у нас настроен welcome-file-list, значит, как описано выше сначала должен быть обработан этот атрибут.
- http://yoursite.com/ — это уже директория и начинается сканирование по welcome-file-list
- http://yoursite.com/CMS — первая в списке сканирования и это соответствует URL /CMS сервлета MyCMS, а значит он вступает в работу.
Отмечу что
1 2 |
http://yoursite.com/CMS - будет работать http://yoursite.com/someFolder/CMS - так не будет работать! |
Важное замечание — в атрибуте <welcome-file> слеш вначале ставить не нужно, т.е. если <url-pattern> /servlet/MyServlet, то нужно писать вот так
1 |
<welcome-file>servlet/MyServlet</welcome-file> |
Полезные ссылки
Google. The Deployment Descriptor: web.xml
Oracle. Creating and Configuring Servlets
21