JSP、servlet运行原理

一、jsp和servlet的区别

         servlet是用Java编写的服务器端程序。其主要功能在于交互式地浏览和修改数据,生成动态Web内容。狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet接口的类,一般情况下,人们将Servlet理解为后者。servlet本质是一个java类。

         JSP是Servlet的扩展,JSP没出现之前,就已经出现了Servlet技术.Servlet是利用了"输出流",动态的生成了HTML页面。
         由于Servlet中包含了大量的HTML标签、大量的静态文本及格式等,导致了Servlet的开发效率非常低下.
这时JSP诞生了,JSP弥补了这种情况,JSP通过在标准的THML页面中嵌入JAVA代码,使其静态的部分无需JAVA程序控制。

          当部署完项目并启动了Tomcat之后,你可以在Tomcat的work\Catalina\localhost\你项目名\org\apache\jsp
目录下找到index_jsp.class 和index_jsp.java这两个文件.其实index_jsp.java是一个特殊的Java类,实际上就是一个Servlet类。
        index_jsp.java 这个类继承HttpJspBase类,该类其实是Servlet的子类,所以其间接的继承了Servlet。

        总结: jsp的主要职责是页面显示; servlet的主要职责是控制器; jsp的本质就是servlet;

二、jsp和servlet的工作原理及生命周期      

        1、工作原理     

        JSP文件的执行过程: 1、 翻译,把*.jsp翻译成 *.java

                                             2、 把*.java编译成*.class

                                             3、 虚拟机,解释执行*.class文件

         servlet后缀本身就是.java  所以它执行过程只有jsp执行过程的后两步。

         每个JSP 页面在第一次被访问时,WEB容器都会把请求交给JSP引擎(即一个Java程序)去处理。JSP引擎先将JSP翻译成一个_jspServlet(实质上也是一个servlet) ,然后按照servlet的调用方式进行调用。
    由于JSP第一次访问时会翻译成servlet,所以第一次访问通常会比较慢,但第二次访问,JSP引擎如果发现JSP没有变化,就不再翻译,而是直接调用,所以程序的执行效率不会受到影响。

          当一个JSP文件第一次被请求的时候,JSP引擎(本身也是一个Servlet)首先会把这个JSP文件转换成一个Java源文件。在转换过程中如果发现JSP文件有语法错误,转换过程将中断,并向服务端和客户端输出出错信息;如果转换成功,JSP引擎用javac把该Java源文件编译成相应的.class文件并将该.class文件加载到内存中。
          其次创建一个该Servlet的实例,并执行该实例的jspInit()方法(jspInit()方法在Servlet的生命周期中只被执行一次)。
          然后创建并启动一个新的线程,新线程调用实例的jspService()方法。(对于每一个请求,JSP引擎会创建一个新的线程来处理该请求。如果有多个客户端同时请求该JSP文件,则JSP引擎会创建多个线程,每个客户端请求对应一个线程)。

      2、生命周期       

      servlet的生成对象的时间点:
         1. <load-on-startup>1</load-on-startup>    ,则在tomcat启动的时候创建servlet对象
         2. 没有配置<load-on-startup>               , 在第一次访问servlet的时候创建对象

      Servlet默认是单例模式,一定对象创建成功,后面就重复使用同一个对象
 
      Servlet对象创建时,方法的执行顺序:
             1. 调用构造函数
             2. 调用init()
             3. 调用service()
                如果是http协议,service会根据请求的http的method,转到不同的方法中(如doGet ,doPost )

             4. 调用destroy()释放servlet资源(从Tomcat服务器移出servlet)
                servlet是web container管理的重要资源,web container从系统的性能考虑,当它认为servlet对象资源不重要时,会调用destroy()释放servlet对象

Servlet的构造函数与init()的作用区别?
      在构造函数中,无法获取ServletConfig对象;因为servletconfig对象还没初始化。
      如果想读取servlet的初始化参数信息,只能在init方法中进行;
 注意:
    web.xml的修改,会引发servlet的destroy(). 修改了web.xml后,最好是重启Tomcat
            




评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值