彻底搞清楚servlet和jsp的加载过程
我们在书本上学习到的一般都是说servlet的生命周期,很少有介绍jsp的生命周期,今天我就结合我的感受,为大家说一下关于jsp的生命周期。
首先,先回顾一下servlet的生命周期的过程。servlet的生命周期分为以下几个步骤,
第一,加载并实例化,
第二,初始化,
第三,服务,
第四,销毁。
容器启动的时候,会加载servlet的class,并new出这个对象,然后,当用户请求这个servlet的时候,容器会调用init方法初始化这个servlet,这也是整个生命周期中只会调用一次的方法,然后,会调用service方法,由这个方法调用doGet或doPost方法来响应用户,然后,容器在可用资源紧张或是长期没有对Servlet发出请求的情况下,会销毁这个servlet。但是有时候,当我们的init方法中的程序需要运行很长时间的时候,为了加快响应,我们可以在web.xml中的servlet中加入load-on-startup选项,这样就会在容器启动的时候调用init方法,而请求的时候就直接进入服务,节省了响应时间。清楚了servlet生命周期,现在说一下jsp的生命周期。也分为几个步骤,第一,jsp转译成servlet,第二,servlet编译为class文件,然后和servlet相同。但是,jsp不同于servlet,servlet也是一个java类,所以当我们创建一个servlet的时候,java编译器可以编译这个java文件并生成class文件。而jsp必须要依赖于容器才能被转译,jsp在容器启动前是不可能被转译的,也就更谈不到后面的步骤了。因此jsp的生命周期应该是在容器启动后,当请求第一次到来,开始第一步,以后依次执行。还有一种情况就是也可以在映射此jsp的时候加上load-on-startup选项,这时,容器在启动的时候就会执行转译,编译的工作,并会调用init方法。总之,一般情况下,我们很少去映射jsp文件,因为现在基于mvc的过程中,大多是映射servlet,而jsp只是用于显示而不是处理请求。以上分析也说明了为什么第一次访问基于java网站的时候会比较慢,因为如果jsp会去执行一大堆动作,而如果直接访问servlet就好说多了。