精华内容
下载资源
问答
  • servlet加载过程

    2018-03-15 18:19:12
    以上看出启动流程 启动阶段:contextInitialized->Filter.init->Servlet.init(web.xml设置<load-on-startup>1) 访问阶段:RequestListener.requestInitialized->FirstFilter.doFilter->SecondFilter.doFilter->...

    web.xml

    <display-name>javawebdemo</display-name>
      <context-param>
      	<param-name></param-name>
      	<param-value></param-value>
      </context-param>  
      
      <listener>
      	<listener-class>myServlet.MyServletContextListener</listener-class>  	
      </listener>
      <listener>
      	<listener-class>myServlet.SessionListener</listener-class>  	
      </listener>
      <listener>
      	<listener-class>myServlet.FirstServletRequestListener</listener-class>  	
      </listener>
      <listener>
      	<listener-class>myServlet.SecondServletRequestListener</listener-class>  	
      </listener>     
      
      <filter>
        <filter-name>FirstFilter</filter-name>
        <filter-class>myServlet.FirstFilter</filter-class>   
      </filter>  
      <filter-mapping>
        <filter-name>FirstFilter</filter-name>
        <url-pattern>/MyServlet</url-pattern>
      </filter-mapping>
      
      <filter>
        <filter-name>SecondFilter</filter-name>
        <filter-class>myServlet.SecondFilter</filter-class>    
      </filter>  
      <filter-mapping>
        <filter-name>SecondFilter</filter-name>
        <url-pattern>/MyServlet</url-pattern>
      </filter-mapping>
      
      <servlet>
        <servlet-name>MyServlet</servlet-name>
        <servlet-class>javawebdemo.MyServlet</servlet-class>
        <load-on-startup>1</load-on-startup>    
      </servlet>
      <servlet-mapping>
        <servlet-name>MyServlet</servlet-name>
        <url-pattern>/MyServlet</url-pattern>
      </servlet-mapping>

    启动日志:

    MyServletContextListener.contextInitialized
    FirstFilter.init
    SecondFilter.init
    MyServlet.init

    请求/javawebdemo/MyServlet日志

    FirstServletRequestListener.requestInitialized
    SecondServletRequestListener.requestInitialized
    FirstFilter.doFilter Begin
    SecondFilter.doFilter Begin
    MyServlet.doGet
    SessionListener.sessionCreated   //HttpSession session = request.getSession(true);需要强制创建session
    SecondFilter.doFilter End
    FirstFilter.doFilter End
    SecondServletRequestListener.requestDestroyed
    FirstServletRequestListener.requestDestroyed
    以上看出启动流程

    启动阶段:contextInitialized->Filter.init->Servlet.init(web.xml设置<load-on-startup>1</load-on-startup>)
    访问阶段:RequestListener.requestInitialized->FirstFilter.doFilter->SecondFilter.doFilter->Servlet->返回SecondFilter.doFilter->返回FirstFilter.doFilter->RequestListener.requestDestroyed
    简单:Listener->Filter->Servlet->Filter->Listener

    配置说明

    listener:不配置url请求过滤
    filter:需要配置url或servlet过滤
    servlet:需要配置url或servlet过滤

    按监听的对象划分

    ServletContext对象监听器
    HttpSession对象监听器
    ServletRequest对象监听器

     按监听的事件划分

    对象自身的创建和销毁的监听器
    对象中属性的创建和消除的监听器
    session中的某个对象的状态变化的监听器


    展开全文
  • Servlet加载过程 容器tomcat启动读取web.xml文件,加载相关资源 读取全局servlet资源,这部分资源所有的servlet对象共用(比如 数据库连接信息 ),形成ServletContext对象 读取&lt;servlet&gt;配置段,...
    • Servlet加载过程
    1. 容器tomcat启动读取web.xml文件,加载相关资源
      1. 读取全局servlet资源,这部分资源所有的servlet对象共用(比如 数据库连接信息 ),形成ServletContext对象
      2. 读取<servlet>配置段,内容包括:
        1. 单个servlet配置(比如:邮箱地址、家庭地址),形成ServletConfig对象
        2. servlet包路径+类名,生成servlet对象
        3. servlet对应的URL相对路径名,生成XXXX对象
    2. 容器根据上一步生成的servlet对象,循环调用servlet对象的init(ServletConfig )方法,把ServletConfig传给servlet对象 ,然后servlet对象对象就可以使用配置信息了
    3. 容器循环等待请求的到来,一旦有请求进来,容器新生成一个线程,同时生成HttpServletRequest对象,并且容器通过servlet对象调用

      protected void javax.servlet.http.HttpServlet.service(HttpServletRequest req, HttpServletResponse resp)

      方法,里面再调用doGet和doPost等方法
    4. 其中HttpServletRequest对象可获取的几个重要对象包括
      1. 上下文信息(也就是全局配置)

        public javax.servlet.ServletRequest.ServletContext getServletContext();

      2. cookies信息

         public Cookie[] javax.servlet.http.HttpServletRequest.getCookies();

      3. 会话信息

        public javax.servlet.http.HttpServletRequest.HttpSession getSession();

    5. 以上过程总结如下:

    》》》》》未完:易学笔记--Servlet和JSP--入门就看这一篇就够了》》》》》

    展开全文
  • 当使用内嵌的 Tomcat 时,你会发现 Spring Boot 完全走了另一套初始化流程,完全没有使用前面提到的 SpringServletContainerInitializer ,实际上一开始我在各种 ServletContainerInitializer 的实现类中打了断点,...

    1. Initializer 被替换为 TomcatStarter

    当使用内嵌的 Tomcat 时,你会发现 Spring Boot 完全走了另一套初始化流程,完全没有使用前面提到的 SpringServletContainerInitializer ,实际上一开始我在各种 ServletContainerInitializer 的实现类中打了断点,最终定位到,根本没有运行到 SpringServletContainerInitializer 内部,而是进入了 org.springframework.boot.web.embedded.tomcat.TomcatStarter 这个类中

    并且,仔细扫了一眼源码的包,并没有发现有 SPI 文件对应到 TomcatStarter。于是我猜想,内嵌 Tomcat 的加载可能不依赖于 Servlet3.0 规范和 SPI !它完全走了一套独立的逻辑。为了验证这一点,我翻阅了 Spring Github 中的 issue,得到了 Spring 作者肯定的答复:https://github.com/spring-projects/spring-boot/issues/321

    This was actually an intentional design decision. The search algorithm used by the containers was problematic. It also causes problems when you want to develop an executable WAR as you often want a javax.servlet.ServletContainerInitializer for the WAR that is not executed when you run java -jar.

    See the org.springframework.boot.context.embedded.ServletContextInitializer for an option that works with Spring Beans.

    Spring Boot 这么做是有意而为之。Spring Boot 考虑到了如下的问题,我们在使用 Spring Boot 时,开发阶段一般都是使用内嵌 Tomcat 容器,但部署时却存在两种选择:一种是打成 jar 包,使用 java -jar 的方式运行;另一种是打成 war 包,交给外置容器去运行。

    前者就会导致容器搜索算法出现问题,因为这是 jar 包的运行策略,不会按照 Servlet 3.0 的策略去加载 ServletContainerInitializer

    最后作者还提供了一个替代选项:ServletContextInitializer,注意是 ServletContextInitializer !它和 ServletContainerInitializer 长得特别像,别搞混淆了!

    1. 前者 ServletContextInitializer 是 org.springframework.boot.web.servlet.ServletContextInitializer 
    2. 后者 ServletContainerInitializer 是 javax.servlet.ServletContainerInitializer 。前文还提到 RegistrationBean 实现了 ServletContextInitializer 接口。

    2. TomcatStarter 中的 ServletContextInitializer 是关键

    TomcatStarter 中 org.springframework.boot.context.embedded.ServletContextInitializer[] initializers 属性,是 Spring Boot 初始化 servlet,filter,listener 的关键。代码如下:

    可以看出 TomcatStarter 的主要逻辑,它其实就是负责调用一系列 ServletContextInitializer 的 #onStartup(ServletContext servletContext) 方法,那么在 debug 中,ServletContextInitializer[] initializers 到底包含了哪些类呢?会不会有我们前面介绍的 RegistrationBean 呢?

    RegistrationBean 并没有出现在 TomcatStarter 的 debug 信息中,initializers 只包含了三个类,其中只有第一个类看上去比较核心,注意第一个类不是 EmbeddedWebApplicationContext !而是这个类中的 $1 匿名类,为了搞清楚 Spring Boot 如何加载 filter、servlet、listener ,看来还得研究下 EmbeddedWebApplicationContext 的结构。

    3. EmbeddedWebApplicationContext 中的 6 层迭代加载

    ApplicationContext 大家应该是比较熟悉的,这是 spring 一个比较核心的类,一般我们可以从中获取到那些注册在容器中的托管 Bean,而这篇文章,主要分析的便是它在内嵌容器中的实现类:org.springframework.boot.context.embedded.EmbeddedWebApplicationContext ,重点分析它加载 filter servlet listener 这部分的代码。这里是整个代码中迭代层次最深的部分,做好心理准备起航,来看看 EmbeddedWebApplicationContext 是怎么获取到所有的 servlet、filter、listener 的!以下方法均出自于 EmbeddedWebApplicationContext 。

    注:入口在SpringBoot启动流程里的refreshContext(context)

    第一层:onRefresh()

    #onRefresh() 方法,是 ApplicationContext 的生命周期方法,EmbeddedWebApplicationContext 的实现非常简单,只干了一件事:

    调用 #createEmbeddedServletContainer() 方法,连接到了第二层。

    第二层:createEmbeddedServletContainer()

    看名字 Spring 是想创建一个内嵌的 Servlet 容器,ServletContainer 其实就是 servlet、filter、listener 的总称。

    凡是带有 servlet,initializer 字样的方法,都是我们需要留意的。其中 #getSelfInitializer() 方法,便涉及到了我们最为关心的初始化流程,所以接着连接到了第三层。

    第三层:getSelfInitializer()

    还记得前面 TomcatStarter 的 debug 信息中,第一个 ServletContextInitializer 就是出现在 EmbeddedWebApplicationContext 中的一个匿名类,没错了,就是这里的 #getSelfInitializer() 方法创建的!

    解释下这里的 #getSelfInitializer() 和 #selfInitialize(ServletContext servletContext) 方法,为什么要这么设计

    这是典型的回调式方式,当匿名 ServletContextInitializer 类被 TomcatStarter 的 #onStartup() 方法调用,设计上是触发了 #selfInitialize(ServletContext servletContext) 方法的调用。

    所以这下就清晰了,为什么 TomcatStarter 中没有出现 RegistrationBean ,其实是隐式触发了 EmbeddedWebApplicationContext 中的 #selfInitialize(ServletContext servletContext) 方法。这样,#selfInitialize(ServletContext servletContext) 方法中,调用 #getServletContextInitializerBeans() 方法,获得 ServletContextInitializer 数组就成了关键。所以接着连接到了第四层。

    第四层:getServletContextInitializerBeans()

    第五层:ServletContextInitializerBeans 的构造方法

    第六层:addServletContextInitializerBeans(beanFactory)

    调用 #getOrderedBeansOfType( beanFactory, ServletContextInitializer.class) 方法,便是去容器中寻找注册过得 ServletContextInitializer ,这时候就可以把之前那些 RegistrationBean 全部加载出来了。并且 RegistrationBean 还实现了 Ordered 接口,在这儿用于排序。

    后续的 #addServletContextInitializerBean(ListableBeanFactory beanFactory) 方法。代码如下:

    粗略看了一眼,各种 RegistrationBean 的处理。

    EmbeddedWebApplicationContext加载流程总结

    如果你对具体的代码流程不感兴趣,可以跳过上述的 6 层分析,直接看本节的结论。总结如下:

    1. EmbeddedWebApplicationContext 的 #onRefresh() 方法,触发配置了一个匿名的 ServletContextInitializer 。
    2. 这个匿名的 ServletContextInitializer 的 onStartup(ServletContext servletContext) 方法,会去容器中搜索到了所有的 RegistrationBean ,并按照顺序加载到 ServletContext 中。
    3. 这个匿名的 ServletContextInitializer 最终传递给 TomcatStarter,由 TomcatStarter 的 onStartup 方法去触发 ServletContextInitializer 的 #onStartup(ServletContext servletContext) 方法,最终完成装配!

    展开全文
  • Servlet加载顺序

    千次阅读 2017-12-18 19:51:26
    整一个的解析过程如下: 1. servlet>  2. Servlet_Request  3. cn.xuhuanfeng.servlet.Servlet_Request  4.    5.  6. Servlet_Request  7. /Servlet_Request  8.     当用户在浏览器...

    整一个的解析过程如下:

    1. <servlet>  

    2.   <servlet-name>Servlet_Request</servlet-name>  

    3.   <servlet-class>cn.xuhuanfeng.servlet.Servlet_Request</servlet-class> 

    4. </servlet>  

     

    5. <servlet-mapping>  

    6.   <servlet-name>Servlet_Request</servlet-name>  

    7.   <url-pattern>/Servlet_Request</url-pattern>  

    8. </servlet-mapping> 

     

      当用户在浏览器输入一个url,如 http://localhost:8080/Servlet_Requset时,服务器将其提交到Tomcat,Tomcat根据用户提交的url在web.xml中进行查找,首先是在<servlet-mapping>中查找,当找到<url-pattern>中有跟用户输入的url匹配时,获取mapping中的<servlet-name>中的值,这里是Servlet-Request,并且根据获取得到的值在<Servlet>中查找一个<servlet-name>与其匹配的值,然后获取<servlet-class>中的确切的类,然后通过反射加载,生成Servlet对象,然后进行访问。

    展开全文
  • servlet加载过程

    2021-03-04 12:18:57
    1:用户发出一个请求,浏览器先从本地host文件中,查找域名和ip的对应关系,如果没有,则去dns服务器去查,得到目标服务器ip...3:解析URL,去web.xml通过servletMapping找到对应的servlet,然后找到对应的servlet-cl.
  • 从Java EE5规范开始,Servlet中增加了两个影响Servlet生命周期的注解,@PostConstruct和@PreDestroy,这两个注解被用来修饰一个非静态的void()方法。写法有如下两种方式: @PostConstruct public void ...
  • 在Spring配置Servlet标签一文中介绍了Servlet的调用以及初始化过程,在一系列的初始化过程init中加载bean的模式都是先从bean工厂得到,如果没有那么就加载Spring属性文件DispatcherServlet.properties中默认的,那么...
  • <!-- //配置Spring MVC,指定处理请求的Servlet,有两...--负数或者0代表延时加载,第一次调用的时候采取加载 数字越小优先级越高 --> <load-on-startup>0</load-on-startup> </servlet>
  • web.xml 中的listener、 filter、servlet 加载顺序 1.在 web.xml 文件中不同类型的加载跟定义的先后顺序无关。即不会因为 filter 写在 listener 的前面而会先加载 filter。最终得出的结论是:listener -> filter ->...
  • Servlet加载和实例化的时间

    千次阅读 2015-10-21 15:19:52
    servlet有良好的生存期的定义,包括如何加载、实例化、初始化、处理客户端请求以及如何被移除。这个生存期由javax.servlet.Servlet接口的init,service和destroy方法表达。那么Servlet是何时被加载和实例化的呢?很多...
  • spring的启动过程其实就是其IoC容器的启动过程,对于web程序,IoC容器启动过程即是建立上下文的过程。   spring的启动过程: 首先,对于一个web应用,其部署在web容器中,web容器提供其一个全局的上下文环境...
  • web.xml 中的listener、 filter、servlet 加载顺序及其详解
  • 一:tomcat的运行加载的jar包和类文件顺序  1:加载TOMCAT_HOME/lib文件中的jar包  2:加载TOMCAT_HOME/webapps/WEB-INF/lib中的jar包  3:加载TOMCAT_HOME/webapps/WEB-INF/class中的.class文件  note:与...
  • Java是一种动态加载和运行的语言。也就是说当应用程序持有一个类的地址(CLASSPATH)和名称(包名和类名)的情况下,可以在程序运行期 间任何时候加载这个类,并创建和使用该类的对象。Servlet就是基于这个机制与Web...
  • 彻底搞清楚servlet和jsp的加载过程 我们在书本上学习到的一般都是说servlet的生命周期,很少有介绍jsp的生命周期,今天我就结合我的感受,为大家说一下关于jsp的生命周期。 首先,先回顾一下servlet的生命周期...
  • Spring加载可以利用ServletContextListener 实现,也可以采用load-on-startup Servlet 实现,但比如filter 需要用到 bean ,但加载顺序是: 先加载filter 后加载spring,则filter中初始化操作中的bean为null...
  • 一、Web服务器,Servlet容器 Servlet应用程序:我们自己编写的处理请求,响应的代码(doGet()和doPost()方法)。 Web服务器:使用HTTP协议来传输数据。最简单的一种情况是,用户在浏览器中输入一个URL,然后就能...
  • Tomcat反射加载servlet

    2019-04-07 10:26:48
    1.将创建一个java web工程,将其部署到Tomcat上 2.创建servlet(即可以在网页上运行的java程序代码) 必须实现Servlet接口才行 ... //还有其他方法要覆盖,这里主要选取一个方法来讲解Tomcat反射加载servlet...
  • Servlet的启动时加载

    2017-06-26 16:41:33
    1.1Servlet的启动时加载 1.1.1为什么使用启动时加载 Servlet对象是第一次被访问的时候会被创建的,init方法就会执行。假设在init方法中做了一些比较耗时的操作(比如:加载了一些配置文件并且解析可能需要花费3秒钟...
  • Servlet执行流程

    千次阅读 2018-07-28 16:40:34
    1、当Servlet第一次被调用的时候会触发init函数,该函数会把servlet实例加载到内存。该函数只会被调用一次 2、web服务器把接收到的http请求封装成一个Request对象,作为service函数的参数传递进去。 3、service...
  • Servlet之自动加载配置方法

    千次阅读 2017-01-28 18:17:04
    Servlet中,默认是在第一次访问时创建Servlet对象,如果在构造方法或者在init()中加入过多的逻辑,那么在用户第一次访问...过程很简单,就只需要在web.xml的Servlet标签中加上自动加载标签:1 配置举例如下:
  • Servlet工作流程

    2018-11-26 13:57:00
    1.加载Servlet类 类加载器负责加载servlet类。 当Web容器接收到servlet的第一个请求时,将加载servlet类。 2.创建Servlet实例 Web容器在加载servlet类之后创建一个servlet的实例。servlet实例在servlet生命周期中...
  • Filter filter可认为是Servlet的一种“变种”,它主要用于对...完整的流程是:Filter对用户请求进行预处理,接着将请求交给Servlet进行处理并生成响应,最后Filter再对服务器响应进行后处理。 Filter有如下几个用
  • 1.初始化过程分四步 在启动 Web 项目时 , web 容器 ( 比如tomcat ) 会先读取 web.xml 文件中的两个节点 <listener> 和 <context-param> 接着容器会创建一个 ServletContext 对象 (也就是 servlet上...
  • servlet 启动加载配置文件及初始化 在servlet开发中,会涉及到一些xml数据的读取和一些初始化方法的调用。可以在tomcat启动的时候,加载一个servlet去初始化一些数据。 摘自 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 107,953
精华内容 43,181
关键字:

servlet加载过程