3

## 3.6_(4.5)web.xml и маппинг сервлетов

Ранне при определении сервлетов применялась аннотация @WebServlet, которая устанавливала конечную точку, с которой сопоставлялся сервлет.

Например, следующий сервлет

`@WebServlet("/hello")` `public` `class` `HelloServlet` `extends` `HttpServlet``{`

сопоставляется с путем "/hello".

То есть сервлет HelloServlet будет обрабатывать запросы типа "http://localhost:8081/[название_приложения]/hello"
или
"http://somesite.com/[название_приложения]/hello".

Но есть и другой способ сопоставления путей и сервлетов. Он представляет использование файла web.xml.

Файл web.xml хранит информацию о конфигурации приложения. Он не является обязательной частью приложения, как можно увидеть ранее, тем не менее он широко используется для настройки конфигурации.

Данный файл должен располагаться в папке WEB-INF приложения. При запуске Tomcat считывает его содержимое и использует считанную конфигурацию. Если же файл содержит ошибки, то Tomcat отображает ошибку.

web.xml имеет определенную структуру. Все вложенные узлы, которые определяют конфигурацию, помещаются в корневой узел <web-app>.

`<?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">`

`</web-app>`

У элемента web-app определяется ряд атрибутов. В данном случае атрибуты xmlns и xmlns:xsi указывают на используемые пространства имен xml. Атрибут version указывает на версию спецификации сервлетов или Servlet API, которая используется в приложении. Последняя версия API сервлетов - 4-я версия.

С помощью элемента <servlet-mapping> можно задать сопоставление сервлета с запрашиваемым URL.

Например, добавим в проект в Eclipse в папку WebConent/WEB-INF новый файл 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>`

``

`</web-app>`

Прежде всего вначале с помощью элемента <servlet> определяется сервлет. Элемент <servlet-name> задает имя сервлета, на которое будет проецироватья класс, указанный в элементе <servlet-class>. То есть, допустим, у нас проекте есть класс сервлета HelloServlet, который будет проецироваться на имя HelloWorld. Имя может быть произвольным и может совпадать с названием класса.

Затем в элементе <servlet-mapping> сервлет с именем HelloWorld (по сути сервлет HelloServlet) сопоставляется с путем "/welcome".

Допустим, сервлет HelloServlet будет выглядеть следующим образом:

`import` `java.io.IOException``;`

`import` `java.io.PrintWriter``;`

`import` `javax.servlet.ServletException``;`

`import` `javax.servlet.http.HttpServlet``;`

`import` `javax.servlet.http.HttpServletRequest``;`

`import` `javax.servlet.http.HttpServletResponse``;`

`public` `class` `HelloServlet` `extends` `HttpServlet``{`

``

`protected` `void` `doGet``(HttpServletRequest request, HttpServletResponse response)`

`throws` `ServletException``, IOException {`

`response.setContentType("text/html");`

`PrintWriter writer = response.getWriter();`

`try` `{`

`writer.println("<h2>Welcome to servlets</h2>");`

`` `} finally` `{`

`writer.close();`

`}`

`}`

`}`

Теперь, чтобы обратиться к этому сервлету, надо использовать путь "/welcome":

Назад Содержание Вперед