• 没有Web.xml文件Tomcat是如何获取应用配置信息的?


    1.将一个web应用部署到Tomcat后

    (1)在启动时Tomcat会首先读取web.xml文件,来配置Filter、Listener、Servlet等

    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <web-app xmlns="http://java.sun.com/xml/ns/javaee"
    3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4. xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
    5. http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
    6. version="3.0">
    7. <servlet>
    8. <servlet-name>spring</servlet-name>
    9. <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    10. <init-param>
    11. <param-name>contextConfigLocation</param-name>
    12. <param-value>classpath:spring-servlet.xml</param-value>
    13. </init-param>
    14. <load-on-startup>1</load-on-startup>
    15. </servlet>
    16. <servlet-mapping>
    17. <servlet-name>spring</servlet-name>
    18. <url-pattern>/*</url-pattern>
    19. </servlet-mapping>
    20. <listener>
    21. <listenerclass>
    22. org.springframework.web.context.ContextLoaderListener
    23. </listener-class>
    24. </listener>
    25. <context-param>
    26. <param-name>contextConfigLocation</param-name>
    27. <param-value>classpath:config/applicationContext.xml</param-value>
    28. </context-param>
    29. <display-name></display-name>定义了WEB应用的名字
    30. <description></description> 声明WEB应用的描述信息
    31. <context-param></context-param> context-param元素声明应用范围内的初始化参数。
    32. <filter></filter> 过滤器元素将一个名字与一个实现javax.servlet.Filter接口的类相关联。
    33. <filter-mapping></filter-mapping> 一旦命名了一个过滤器,就要利用filter-mapping元素把它与一个或多个servlet或JSP页面相关联。
    34. <listener></listener>servlet API的版本2.3增加了对事件监听程序的支持,事件监听程序在建立、修改和删除会话或servlet环境时得到通知。Listener元素指出事件监听程序类。
    35. <servlet></servlet> 在向servlet或JSP页面制定初始化参数或定制URL时,必须首先命名servlet或JSP页面。Servlet元素就是用来完成此项任务的。
    36. <servlet-mapping></servlet-mapping> 服务器一般为servlet提供一个缺省的URL:http://host/webAppPrefix/servlet/ServletName.但是,常常会更改这个URL,以便servlet可以访问初始化参数或更容易地处理相对URL。在更改缺省URL时,使用servlet-mapping元素。
    37. <session-config></session-config> 如果某个会话在一定时间内未被访问,服务器可以抛弃它以节省内存。 可通过使用HttpSession的setMaxInactiveInterval方法明确设置单个会话对象的超时值,或者可利用session-config元素制定缺省超时值。
    38. <mime-mapping></mime-mapping>如果Web应用具有想到特殊的文件,希望能保证给他们分配特定的MIME类型,则mime-mapping元素提供这种保证。
    39. <welcome-file-list></welcome-file-list> 指示服务器在收到引用一个目录名而不是文件名的URL时,使用哪个文件。
    40. <error-page></error-page> 在返回特定HTTP状态代码时,或者特定类型的异常被抛出时,能够制定将要显示的页面。
    41. <taglib></taglib> 对标记库描述符文件(Tag Libraryu Descriptor file)指定别名。此功能使你能够更改TLD文件的位置,而不用编辑使用这些文件的JSP页面。
    42. <resource-env-ref></resource-env-ref>声明与资源相关的一个管理对象。
    43. <resource-ref></resource-ref> 声明一个资源工厂使用的外部资源。
    44. <security-constraint></security-constraint> 制定应该保护的URL。它与login-config元素联合使用
    45. <login-config></login-config> 指定服务器应该怎样给试图访问受保护页面的用户授权。它与sercurity-constraint元素联合使用。
    46. <security-role></security-role>给出安全角色的一个列表,这些角色将出现在servlet元素内的security-role-ref元素的role-name子元素中。分别地声明角色可使高级IDE处理安全信息更为容易。
    47. <env-entry></env-entry>声明Web应用的环境项。
    48. <ejb-ref></ejb-ref>声明一个EJB的主目录的引用。
    49. <ejb-local-ref></ejb-local-ref>声明一个EJB的本地主目录的应用。
    50. </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

    2.Servlet 3.0

    其中最关键的是Tomcat定义了javax.servlet.ServletContainerInitializer这个接口,这个接口的实现类会在web容器启动阶段被回调,在onStartUp方法里对servlet、filter和listener进行一些注册的操作来代替web.xml。

    但是这个接口是Servlet定义的,Tomcat做的最常用的Servlet容器能知道这个接口,但是它怎么能找到具体的实现类呢,这就不得不提到SPI(Service Provider Interface)

    3.SPI

    找到spring-web包下面的META-INF\services文件夹,里面有个名字javax.servlet.ServletContainerInitializer的文件,打开文件里面只有一行,那就是spring对这个接口的实现类的全限定名,找到SpringServletContainerInitializer这个类。SpringServletContainerInitializer作为ServletContainerInitializer的实现类,通过SPI机制,在web容器加载的时候会自动的被调用。而这个类的方法又会扫描找到WebApplicationInitializer的实现类,调用它的onStartup方法,从而起到启动web.xml相同的作用。

    4.DispatcherServlet

    springboot启动后依旧需要像spring mvc一样初始化一个DispatcherServlet来从tomcat接收并分发请求

    1. @Configuration(proxyBeanMethods = false)
    2. @ConditionalOnWebApplication(type = Type.SERVLET)
    3. @ConditionalOnClass({ Servlet.class, DispatcherServlet.class, WebMvcConfigurer.class })
    4. @ConditionalOnMissingBean(WebMvcConfigurationSupport.class)
    5. @AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE + 10)
    6. @AutoConfigureAfter({ DispatcherServletAutoConfiguration.class, TaskExecutionAutoConfiguration.class,
    7. ValidationAutoConfiguration.class })
    8. public class WebMvcAutoConfiguration {

    1)当类路径下存在DispatcherServlet时候,该配置生效。 2)这个配置会在DispatcherServletAutoConfiguration配置完之后再配置。

    引用链接:springboot是如何在没有web.xml的情况下在外部tomcat启动的_菜鸟王老汉的博客-CSDN博客_springboot没有web.xml

    web.xml 文件详解 - seeyoumeet - 博客园

  • 相关阅读:
    Linux驱动之INPUT设备驱动
    微信小程序使用 MoxB 实现全局状态管理
    当下测试行业中UI自动化面临的难点及如何解决
    三、Spring Boot 整合视图层技术
    GeoServer + openlayers
    系统架构设计高级技能 · 软件产品线
    排查 log4j2 安全漏洞的一次经历
    51单片机自学报告--实验部分
    ​iOS安全加固方法及实现
    微信小程序替换双重循环渲染中报错图片
  • 原文地址:https://blog.csdn.net/feng3355/article/details/125623280