7.1 Schema generală a web.xml

Fișierul web.xml stochează informații de configurare a aplicației. Nu este o parte obligatorie a acestuia, dar este foarte utilizat pentru a configura o aplicație web.

Acest fișier trebuie să fie localizat în folderul WEB-INF . Când Tomcat pornește, își citește conținutul și folosește configurația pe care o conține. Dacă fișierul conține erori, atunci Tomcat afișează și o eroare.

Exemplu 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"Maparea numelui servlet-ului și a clasei servlet-ului este scrisă aici cu verde"HelloServlet" . Maparea numelui servlet-ului și a fragmentului URL este scrisă cu albastru"HelloWorld""http://localhost/welcome" . Astfel, aici scrie că atunci când accesați calea /welcome, trebuie să apelați servlet-ul HelloServlet.class.

Culoarea roșie indică fișierul care trebuie oferit la cerere http://localhost/- aceasta este așa-numita pagină de bun venit . Dacă utilizatorul introduce pur și simplu în browser numele corespunzător rădăcinii aplicației noastre web, atunci conținutul fișierului index.html.

7.2 servlet, servlet-mapping

Un servlet poate servi solicitări la adrese URL diferite, astfel încât în ​​web-xml, servletul și maparea acestuia la adrese URL sunt scrise separat. Mai întâi, descriem servlet-urile, dându-le fiecărui șir un nume unic, apoi specificăm modul în care fiecare servlet se mapează la care url.

Exemplu 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>

În acest exemplu, două servlet-uri sunt declarate și fiecare este mapată la un șablon URL diferit. Servletul RemotingServletservește toate cererile care ajung la/remoting/* . Servletul RestApiServletservește toate cererile care ajung la/api/* . Servlet-urile au și ordinea de la încărcare - parametrul load-on-startup.

7.3 Opțiuni de servlet

Cu ajutorul web.xml, parametrii pot fi transferați servlet-ului în timpul inițializării acestuia, ei vor fi disponibili prin interfața ServletConfig. De asemenea, puteți seta parametri pentru întreaga aplicație web, aceștia vor fi disponibili prin intermediul ServletContext.

Exemplu 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>

Codul evidențiat în verde este locul în care setăm parametrii pentruServletContext . Sunt două dintre ele:

  • productionModecu valoare falsă
  • appPropertiesConfigcu o matrice de două șiruri de caractere:
    • classpath:local-app.properties
    • classpath:web-app.properties

Parametrii pentru servlet sunt indicați cu albastruApplicationServlet , îi vor fi disponibili prin ServletConfig:

  • applicationcu valoare com.codegym.App
  • widgetsetcu valoarea com.codegym.WidgetSet
  • uicu valoarea com.codegym.AppUI

7.4 filtru, cartografiere a filtrului

Aplicația web poate conține, de asemenea, special utility servlets - filters. Ei îndeplinesc diverse sarcini de serviciu: redirecționarea apelurilor, verificarea autorizației etc.

Exemplu 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>

Înainte ca cererea să ajungă la servlet RemotingServlet, aceasta va fi procesată de filtru TotalFiler. Acest filtru este configurat pentru a intercepta toate cererile care ajung la aplicația noastră web. Acest lucru este sugerat în mod clar de șablonul URL la care este mapat: /*.

Veți citi mai multe despre servlet-uri și filtre în următoarele prelegeri.