Java web xml version
В предыдущих статьях при определении сервлетов применялась аннотация @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 определяется ряд атрибутов. В данном случае атрибуты xmlns и xmlns:xsi указывают на используемые пространства имен xml. Атрибут version указывает на версию спецификации сервлетов или Servlet API, которая используется в приложении. Последняя версия API сервлетов - 4-я версия.
С помощью элемента можно задать сопоставление сервлета с запрашиваемым URL.
Например, добавим в проект в Eclipse в папку WebConent/WEB-INF новый файл web.xml :
Определим в нем следующий код:
HelloWorld HelloServlet HelloWorld /welcome Прежде всего вначале с помощью элемента определяется сервлет. Элемент задает имя сервлета, на которое будет проецироватья класс, указанный в элементе . То есть, допустим, у нас проекте есть класс сервлета HelloServlet, который будет проецироваться на имя HelloWorld. Имя может быть произвольным и может совпадать с названием класса.
Затем в элементе сервлет с именем 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("Welcome to servlets
"); > finally < writer.close(); >> >Теперь, чтобы обратиться к этому сервлету, надо использовать путь "/welcome":
Структура web.xml
Файл web.xml хранит информацию о конфигурации приложения. Он не является обязательной его частью, однако очень широко используется для настройки конфигурации веб-приложения.
Этот файл должен располагаться в папке WEB-INF. При запуске Tomcat считывает его содержимое и использует записанную в нем конфигурацию. Если же файл содержит ошибки, то и Tomcat отображает ошибку.
HelloWorld HelloServlet HelloWorld /welcome index.html Зеленым цветом тут записан маппинг имя сервлета "HelloWorld" и класса сервлета "HelloServlet" . Синим цветом записан маппинг имя сервлета "HelloWorld" и куска URL "http://localhost/welcome" . Таким образом тут написано, что при обращении к пути /welcome нужно вызвать сервлет HelloServlet.class .
Красным цветом указан файл, который нужно отдать по запросу http://localhost/ — это так называемая welcome page . Если пользователь просто вобьет в браузере имя, соответствующее корню нашего веб-приложения, то ему отдается содержимое файла index.html .
7.2 servlet, servlet-mapping
Один сервлет может обслуживать запросы по разным урлам, поэтому в web-xml сервлет и его маппинг на урлы записываются отдельно. Сначала описываем сервлеты, давая каждому уникальное строковое имя, а затем уже указываем, как каждый сервлет мапится на какой url.
remoting com.javarush.RemotingServlet 1 remoting /remoting/* restapi com.javarush.RestApiServlet 2 restapi /api/* В этом примере объявлено два сервлета, и каждый замаплен на свой шаблон url. Сервлет RemotingServlet обслуживает все запросы, которые идут на /remoting/* . Сервлет RestApiServlet обслуживает все запросы, которые идут на /api/* . Так же у сервлетов прописан порядок из загрузки — параметр load-on-startup.
7.3 Параметры сервлета
С помощью web.xml сервлету при его инициализации можно передать параметры, они будут доступны через интерфейс ServletConfig . Также можно задать параметры всему веб-приложению, они будут доступны через интерфейс ServletContext .
Server production mode productionMode false appPropertiesConfig classpath:local-app.properties classpath:web-app.properties mainservlet com.javarush.ApplicationServlet application com.javarush.App widgetset com.javarush.WidgetSet ui com.javarush.AppUI
- 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
Веб-приложение может также содержать специальные служебные сервлеты — фильтры . Они выполняют различные служебные задачи: перенаправляют вызовы, проверяют авторизацию и т. д.
remoting RemotingServlet 1 remoting /remoting/* total_filter com.javrush.TotalFilter total_filter /* Прежде чем запрос попадет в сервлет RemotingServlet , он будет обработан фильтром TotalFiler . Этот фильтр настроен так, чтобы перехватывать все запросы , которые идут к нашему веб-приложению. Об это однозначно намекает шаблон урлов, на которые он замаплен: /* .
Больше про сервлеты и фильтры ты прочитаешь в следующих лекциях.