7.1 Ogólny schemat pliku web.xml

Plik web.xml przechowuje informacje o konfiguracji aplikacji. Nie jest to jego obowiązkowa część, ale jest bardzo szeroko stosowana do konfigurowania aplikacji internetowej.

Plik ten musi znajdować się w folderze WEB-INF . Podczas uruchamiania Tomcat odczytuje jego zawartość i używa zawartej w nim konfiguracji. Jeśli plik zawiera błędy, Tomcat również wyświetla błąd.

Przykład pliku 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"Odwzorowanie nazwy serwletu i klasy serwletu jest tutaj zapisane na zielono"HelloServlet" . Odwzorowanie nazwy serwletu i fragmentu adresu URL jest zapisane na niebiesko"HelloWorld""http://localhost/welcome" . Dlatego tutaj jest napisane, że uzyskując dostęp do ścieżki /welcome, musisz wywołać serwlet HelloServlet.class.

Kolorem czerwonym oznaczono plik, który należy podać na żądanie http://localhost/– jest to tzw. strona powitalna . Jeśli użytkownik po prostu wpisze w przeglądarce nazwę odpowiadającą katalogu głównego naszej aplikacji internetowej, wówczas zawartość pliku index.html.

Serwlet 7.2, mapowanie serwletów

Jeden serwlet może obsługiwać żądania pod różnymi adresami URL, więc w web-xml serwlet i jego mapowanie na adresy URL są pisane oddzielnie. Najpierw opisujemy serwlety, nadając każdemu unikalną nazwę ciągu, a następnie określamy, w jaki sposób każdy serwlet odwzorowuje adres URL.

Przykład pliku 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>

W tym przykładzie zadeklarowano dwa serwlety i każdy z nich jest odwzorowany na inny szablon adresu URL. Serwlet RemotingServletobsługuje wszystkie żądania kierowane do/remoting/* . Serwlet RestApiServletobsługuje wszystkie żądania kierowane do/api/* . Serwlety mają również kolejność ładowania - parametr load-on-startup.

7.3 Opcje serwletu

Za pomocą web.xml można przekazać parametry do serwletu podczas jego inicjalizacji, będą one dostępne przez interfejs ServletConfig. Możesz także ustawić parametry dla całej aplikacji internetowej, będą one dostępne poprzez ServletContext.

Przykład pliku 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>

Kod podświetlony na zielono to miejsce, w którym ustawiamy parametry dlaServletContext . Jest ich dwóch:

  • productionModez wartością fałsz
  • appPropertiesConfigz tablicą dwóch ciągów:
    • classpath:local-app.properties
    • classpath:web-app.properties

Parametry serwletu są zaznaczone na niebieskoApplicationServlet , będą dla niego dostępne poprzez ServletConfig:

  • applicationz wartością com.codegym.App
  • widgetsetz wartością com.codegym.WidgetSet
  • uiz wartością com.codegym.AppUI

Filtr 7.4, mapowanie filtrów

Aplikacja internetowa może również zawierać specjalne pliki utility servlets - filters. Wykonują różne zadania serwisowe: przekierowują połączenia, sprawdzają autoryzację itp.

Przykład pliku 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>

Zanim żądanie dotrze do serwletu RemotingServlet, zostanie przetworzone przez filtr TotalFiler. Ten filtr jest skonfigurowany do przechwytywania wszystkich żądań , które trafiają do naszej aplikacji internetowej. Jest to wyraźnie zasugerowane przez szablon adresu URL, do którego jest mapowany: /*.

Więcej o serwletach i filtrach przeczytasz w kolejnych wykładach.