7.1 web.xml 的一般架构
web.xml 文件存储应用程序配置信息。它不是它的强制性部分,但它被广泛用于配置 Web 应用程序。
此文件必须位于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"
servlet 名称和 servlet 类的映射在这里用绿色写着"HelloServlet"
。servlet 名称和 URL 块的映射是用蓝色写的"HelloWorld"
"http://localhost/welcome"
。因此,它在这里说,当访问 /welcome 路径时,您需要调用 servlet HelloServlet.class
。
红色表示需要根据要求提供的文件http://localhost/
——这就是所谓的欢迎页面。如果用户只需在浏览器中键入与我们的 Web 应用程序的根对应的名称,那么index.html
.
7.2 servlet、servlet-映射
一个 servlet 可以为不同 URL 的请求提供服务,因此在 web-xml 中,servlet 及其到 URL 的映射是分开编写的。首先,我们描述 servlet,给每个 servlet 一个唯一的字符串名称,然后我们指定每个 servlet 如何映射到哪个 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>
在此示例中,声明了两个 servlet,每个都映射到不同的 url 模板。该 servletRemotingServlet
服务所有发往 的请求/remoting/*
。该 servletRestApiServlet
服务所有发往 的请求/api/*
。Servlet 也有加载顺序——启动时加载参数。
7.3 Servlet 选项
在 web.xml 的帮助下,可以在初始化期间将参数传递给 servlet,它们将通过接口可用ServletConfig
。您还可以为整个 Web 应用程序设置参数,它们将通过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
servlet 的参数以蓝色表示ApplicationServlet
,它们将通过以下方式提供给它ServletConfig
:
application
具有价值 com.codegym.Appwidgetset
具有价值 com.codegym.WidgetSetui
具有价值 com.codegym.AppUI
7.4 filter、filter-mapping
Web 应用程序还可能包含特殊的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>
在请求到达 servlet 之前RemotingServlet
,它将被过滤器处理TotalFiler
。此过滤器配置为拦截所有进入我们的 Web 应用程序的请求。它映射到的 url 模板清楚地暗示了这一点:/*
。
在接下来的课程中,您将阅读更多关于 servlet 和过滤器的内容。
GO TO FULL VERSION