1.将一个web应用部署到Tomcat后
(1)在启动时Tomcat会首先读取web.xml文件,来配置Filter、Listener、Servlet等
- <?xml version="1.0" encoding="UTF-8"?>
- <web-app xmlns="http://java.sun.com/xml/ns/javaee"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
- http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
- version="3.0">
- <servlet>
- <servlet-name>spring</servlet-name>
- <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
- <init-param>
- <param-name>contextConfigLocation</param-name>
- <param-value>classpath:spring-servlet.xml</param-value>
- </init-param>
- <load-on-startup>1</load-on-startup>
- </servlet>
-
- <servlet-mapping>
- <servlet-name>spring</servlet-name>
- <url-pattern>/*</url-pattern>
- </servlet-mapping>
-
- <listener>
- <listenerclass>
- org.springframework.web.context.ContextLoaderListener
- </listener-class>
- </listener>
-
- <context-param>
- <param-name>contextConfigLocation</param-name>
- <param-value>classpath:config/applicationContext.xml</param-value>
- </context-param>
- <display-name></display-name>定义了WEB应用的名字
- <description></description> 声明WEB应用的描述信息
-
- <context-param></context-param> context-param元素声明应用范围内的初始化参数。
-
- <filter></filter> 过滤器元素将一个名字与一个实现javax.servlet.Filter接口的类相关联。
- <filter-mapping></filter-mapping> 一旦命名了一个过滤器,就要利用filter-mapping元素把它与一个或多个servlet或JSP页面相关联。
-
- <listener></listener>servlet API的版本2.3增加了对事件监听程序的支持,事件监听程序在建立、修改和删除会话或servlet环境时得到通知。Listener元素指出事件监听程序类。
-
- <servlet></servlet> 在向servlet或JSP页面制定初始化参数或定制URL时,必须首先命名servlet或JSP页面。Servlet元素就是用来完成此项任务的。
- <servlet-mapping></servlet-mapping> 服务器一般为servlet提供一个缺省的URL:http://host/webAppPrefix/servlet/ServletName.但是,常常会更改这个URL,以便servlet可以访问初始化参数或更容易地处理相对URL。在更改缺省URL时,使用servlet-mapping元素。
-
- <session-config></session-config> 如果某个会话在一定时间内未被访问,服务器可以抛弃它以节省内存。 可通过使用HttpSession的setMaxInactiveInterval方法明确设置单个会话对象的超时值,或者可利用session-config元素制定缺省超时值。
-
- <mime-mapping></mime-mapping>如果Web应用具有想到特殊的文件,希望能保证给他们分配特定的MIME类型,则mime-mapping元素提供这种保证。
-
- <welcome-file-list></welcome-file-list> 指示服务器在收到引用一个目录名而不是文件名的URL时,使用哪个文件。
-
- <error-page></error-page> 在返回特定HTTP状态代码时,或者特定类型的异常被抛出时,能够制定将要显示的页面。
-
- <taglib></taglib> 对标记库描述符文件(Tag Libraryu Descriptor file)指定别名。此功能使你能够更改TLD文件的位置,而不用编辑使用这些文件的JSP页面。
-
- <resource-env-ref></resource-env-ref>声明与资源相关的一个管理对象。
- <resource-ref></resource-ref> 声明一个资源工厂使用的外部资源。
- <security-constraint></security-constraint> 制定应该保护的URL。它与login-config元素联合使用
- <login-config></login-config> 指定服务器应该怎样给试图访问受保护页面的用户授权。它与sercurity-constraint元素联合使用。
-
- <security-role></security-role>给出安全角色的一个列表,这些角色将出现在servlet元素内的security-role-ref元素的role-name子元素中。分别地声明角色可使高级IDE处理安全信息更为容易。
-
- <env-entry></env-entry>声明Web应用的环境项。
- <ejb-ref></ejb-ref>声明一个EJB的主目录的引用。
- <ejb-local-ref></ejb-local-ref>声明一个EJB的本地主目录的应用。
- </web-app>
(2)容器创建一个ServletContext(上下文)
(3)容器将<context-param></context-param>转化为键值对,并交给ServletContext;
(4)容器创建<listener></listener>中的类实例,即创建监听;
(5)容器初始化<filter></filter>,web.xml中可以定义多个 filter,初始化每个 filter 时,是按照 filter 配置节出现的顺序来初始化的,当请求资源匹配多个 filter-mapping 时,filter 拦截资源是按照 filter-mapping 配置节出现的顺序来依次调用 doFilter() 方法的;
(6)容器初始化<servlet></servlet>, servlet 同 filter 类似。
那么,web项目启动时,可以知道web.xml文件各个节点的加载顺序:context-param -> listener -> filter -> servlet
其中最关键的是Tomcat定义了javax.servlet.ServletContainerInitializer这个接口,这个接口的实现类会在web容器启动阶段被回调,在onStartUp方法里对servlet、filter和listener进行一些注册的操作来代替web.xml。
但是这个接口是Servlet定义的,Tomcat做的最常用的Servlet容器能知道这个接口,但是它怎么能找到具体的实现类呢,这就不得不提到SPI(Service Provider Interface)
找到spring-web包下面的META-INF\services文件夹,里面有个名字javax.servlet.ServletContainerInitializer的文件,打开文件里面只有一行,那就是spring对这个接口的实现类的全限定名,找到SpringServletContainerInitializer这个类。SpringServletContainerInitializer作为ServletContainerInitializer的实现类,通过SPI机制,在web容器加载的时候会自动的被调用。而这个类的方法又会扫描找到WebApplicationInitializer的实现类,调用它的onStartup方法,从而起到启动web.xml相同的作用。
springboot启动后依旧需要像spring mvc一样初始化一个DispatcherServlet来从tomcat接收并分发请求
- @Configuration(proxyBeanMethods = false)
- @ConditionalOnWebApplication(type = Type.SERVLET)
- @ConditionalOnClass({ Servlet.class, DispatcherServlet.class, WebMvcConfigurer.class })
- @ConditionalOnMissingBean(WebMvcConfigurationSupport.class)
- @AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE + 10)
- @AutoConfigureAfter({ DispatcherServletAutoConfiguration.class, TaskExecutionAutoConfiguration.class,
- ValidationAutoConfiguration.class })
- public class WebMvcAutoConfiguration {
1)当类路径下存在DispatcherServlet时候,该配置生效。 2)这个配置会在DispatcherServletAutoConfiguration配置完之后再配置。
引用链接:springboot是如何在没有web.xml的情况下在外部tomcat启动的_菜鸟王老汉的博客-CSDN博客_springboot没有web.xml
web.xml 文件详解 - seeyoumeet - 博客园