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" . Съпоставянето на името на сървлета и URL частта е изписано в синьо"HelloWorld""http://localhost/welcome" . По този начин тук се казва, че когато осъществявате достъп до пътя /welcome, трябва да извикате сървлета HelloServlet.class.

Червеният цвят показва file, който трябва да бъде предоставен при поискване http://localhost/- това е така наречената page за добре дошли . Ако потребителят просто въведе в браузъра името, съответстващо на корена на нашето уеб приложение, тогава съдържанието на index.html.

7.2 сервлет, сървлет-картографиране

Един сървлет може да обслужва заявки на различни URL addressи, така че в web-xml сървлетът и неговото съпоставяне към URL addressи се записват отделно. Първо, ние описваме сървлетите, давайки на всеки уникално име на низ, и след това уточняваме How всеки сървлет се съпоставя към кой url.

Пример web.xml:



<web-app>
  
  <servlet>
    <servlet-name>remoting</servlet-name>
    <servlet-class>com.codegym.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.codegym.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.codegym.ApplicationServlet</servlet-class>
     <init-param>
        <param-name>application</param-name>
        <param-value>com.codegym.App</param-value>
     </init-param>
     <init-param>
        <param-name>widgetset</param-name>
        <param-value>com.codegym.WidgetSet</param-value>
     </init-param>
     <init-param>
        <param-name>ui</param-name>
        <param-value>com.codegym.AppUI</param-value>
     </init-param>
  </servlet>
</web-app>

Маркираният в зелено code е мястото, където задаваме параметрите заServletContext . Има две от тях:

  • productionModeсъс стойност false
  • appPropertiesConfigс масив от два низа:
    • classpath:local-app.properties
    • classpath:web-app.properties

Параметрите за сървлета са посочени в синьоApplicationServlet , те ще бъдат достъпни за него чрез ServletConfig:

  • applicationсъс стойност com.codegym.App
  • widgetsetсъс стойност com.codegym.WidgetSet
  • uiсъс стойност com.codegym.AppUI

7.4 филтър, филтър-картографиране

Уеб приложението може също да съдържа специални utility servlets - filters. Те изпълняват различни сервизни задачи: пренасочване на повиквания, проверка на авторизация и др.

Пример 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. Този филтър е конфигуриран да прихваща всички заявки , които отиват към нашето уеб приложение. Това е ясно намекнато от url шаблона, към който е съпоставен: /*.

Ще прочетете повече за сървлетите и филтрите в следващите лекции.