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.classservlet

สีแดงหมายถึงไฟล์ที่ต้องได้รับตามคำขอhttp://localhost/ - นี่คือหน้าต้อนรับที่เรียกว่า หากผู้ใช้เพียงพิมพ์ชื่อในเบราว์เซอร์ที่ตรงกับรูทของเว็บแอปพลิเคชันของเรา เนื้อหาของindex.html.

7.2 เซิร์ฟเล็ต การทำแผนที่เซิร์ฟเล็ต

เซิร์ฟเล็ตหนึ่งสามารถให้บริการคำขอที่ URL ที่แตกต่างกัน ดังนั้นใน web-xml เซิร์ฟเล็ตและการแม็พกับ URL จะถูกเขียนแยกกัน ขั้นแรก เราอธิบายเซิร์ฟเล็ต โดยตั้งชื่อสตริงเฉพาะให้แต่ละอัน จากนั้นระบุวิธีที่แต่ละเซิร์ฟเล็ตแมปกับ 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>

ในตัวอย่างนี้ มีการประกาศ 2 เซิร์ฟเล็ต และแต่ละเซิร์ฟเล็ตจะถูกแมปกับเทมเพลต url ที่แตกต่างกัน เซิร์ฟเล็ตRemotingServletทำหน้าที่ร้องขอทั้งหมดที่ไป/remoting/*ที่ เซิร์ฟเล็ตRestApiServletทำหน้าที่ร้องขอทั้งหมดที่ไป/api/*ที่ Servlets ยังมีลำดับจากการโหลด - พารามิเตอร์ 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>

รหัสที่เน้นด้วยสีเขียวคือตำแหน่งที่เราตั้งค่าพารามิเตอร์ServletContextสำหรับ มีสองคน:

  • productionModeมีค่าเป็นเท็จ
  • 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 ที่แมปกับ/*:

คุณจะอ่านเพิ่มเติมเกี่ยวกับเซิร์ฟเล็ตและตัวกรองได้ในการบรรยายต่อไปนี้