7.1 Lược đồ chung của web.xml

Tệp web.xml lưu trữ thông tin cấu hình ứng dụng. Nó không phải là một phần bắt buộc của nó, nhưng nó được sử dụng rất rộng rãi để cấu hình một ứng dụng web.

Tệp này phải nằm trong thư mục WEB-INF . Khi Tomcat khởi động, nó sẽ đọc nội dung của nó và sử dụng cấu hình chứa trong đó. Nếu tệp chứa lỗi thì Tomcat cũng hiển thị lỗi.

Ví dụ 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"Ánh xạ của tên servlet và lớp servlet được viết ở đây bằng màu xanh lá cây"HelloServlet" . Ánh xạ của tên servlet và đoạn URL được viết bằng màu xanh lam"HelloWorld""http://localhost/welcome" . Vì vậy, nó nói ở đây rằng khi truy cập /welcome đường dẫn, bạn cần gọi servlet HelloServlet.class.

Màu đỏ cho biết tệp cần được cung cấp theo yêu cầu http://localhost/- đây được gọi là trang chào mừng . Nếu người dùng chỉ cần gõ vào trình duyệt tên tương ứng với thư mục gốc của ứng dụng web của chúng tôi, thì nội dung của tệp index.html.

7.2 servlet, ánh xạ servlet

Một servlet có thể phục vụ các yêu cầu tại các URL khác nhau, vì vậy trong web-xml, servlet và ánh xạ của nó tới các URL được viết riêng. Đầu tiên, chúng tôi mô tả các servlet, đặt cho mỗi tên một chuỗi duy nhất, sau đó chúng tôi chỉ định cách mỗi servlet ánh xạ tới url nào.

Ví dụ 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>

Trong ví dụ này, hai servlet được khai báo và mỗi servlet được ánh xạ tới một mẫu url khác nhau. servlet RemotingServletphục vụ tất cả các yêu cầu chuyển đến/remoting/* . servlet RestApiServletphục vụ tất cả các yêu cầu chuyển đến/api/* . Các servlet cũng có thứ tự từ khi tải - tham số tải khi khởi động.

7.3 Tùy chọn servlet

Với sự trợ giúp của web.xml, các tham số có thể được chuyển đến servlet trong quá trình khởi tạo, chúng sẽ có sẵn thông qua giao diện ServletConfig. Bạn cũng có thể đặt tham số cho toàn bộ ứng dụng web, chúng sẽ có sẵn thông qua tệp ServletContext.

Ví dụ 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>

Đoạn mã được đánh dấu màu xanh lá cây là nơi chúng tôi đặt tham số choServletContext . Có hai trong số họ:

  • productionModevới giá trị sai
  • appPropertiesConfigvới một mảng gồm hai chuỗi:
    • classpath:local-app.properties
    • classpath:web-app.properties

Các tham số cho servlet được biểu thị bằng màu xanh lamApplicationServlet , chúng sẽ có sẵn cho nó thông qua ServletConfig:

  • applicationvới giá trị com.codegym.App
  • widgetsetvới giá trị com.codegym.WidgetSet
  • uivới giá trị com.codegym.AppUI

7.4 bộ lọc, ánh xạ bộ lọc

Ứng dụng web cũng có thể chứa các tệp utility servlets - filters. Họ thực hiện các nhiệm vụ dịch vụ khác nhau: chuyển hướng cuộc gọi, kiểm tra ủy quyền, v.v.

Ví dụ 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>

Trước khi yêu cầu đến servlet RemotingServlet, nó sẽ được xử lý bởi bộ lọc TotalFiler. Bộ lọc này được định cấu hình để chặn tất cả các yêu cầu chuyển đến ứng dụng web của chúng tôi. Điều này được gợi ý rõ ràng bởi mẫu url mà nó được ánh xạ tới: /*.

Bạn sẽ đọc thêm về servlet và bộ lọc trong các bài giảng sau.