zoukankan      html  css  js  c++  java
  • jsp运行机制

    一、JSP机制概述

    可以把执行JSP页面的执行分成两个阶段,一个是转译阶段,一个是请求阶段。 转译阶段:JSP页面转换成Servlet类。 请求阶段:Servlet类执行,将响应结果发送至客户端。

    1.用户(客户机)访问响应的JSP页面,如http://localhost:8080/Prj_test/ch02/HelloJSP.jsp。 2.服务器找到相应的JSP页面。 3.服务器将JSP转译成Servlet的源代码。 4.服务器将Servlet源代码编译为class文件。 5.服务器将class文件加载到内存并执行。 6.服务器讲class文件执行后生成HTML代码发送给客户机,客户机浏览器根据响应的HTML代码进行显示。 如果该JSP页面为第一次执行,那么会经过这两个阶段,而如果不是第一次执行,那么将只会执行请求阶段。这也是为什么第二次执行JSP页面时明显比第一次执行要要快的原因。 如果修改了JSP页面,那么服务器将发现到该修改,并重新执行转译阶段和请求阶段。这也是为什么修改页面后访问速度变慢的原因。

    jsp执行过程流程图:

    1、jsp引擎 JSP引擎实际上要把JSP标签、JSP页中的Java代码甚至连同静态HTML内容都转换为大块的Java代码。这些代码块被JSP引擎组织到用户看不到的Java servlet中去,然后servlet自动把JVM(java虚拟机)编译成Java字节码。这样,当网站的访问者请求一个JSP页时,在他不知道的情况下,一个已经生成的、预编译过的servlet实际上将完成所有的工作。非常隐蔽-而又高效。因为servlet是编译过的,所以网页中的JSP代码不需要在每次请求该页时被解释一遍。JSP引擎只需在servlet代码最后被修改后编译一次,然后这个编译过的servlet就可以被执行了。由于是JSP引擎自动生成并编译servlet,不用程序员动手编译代码,所以JSP能带给你高效的性能和快速开发所需的灵活性。 2、web容器和servlet容器 servlet容器的主要任务是管理servlet的生命周期。web容器更准确的说应该叫web服务器,它是来管理和部署web应用的。还有一种服务器叫做应用服务器,它的功能比web服务器要强大的多,因为它可以部署EJB应用,可以实现容器管理的事务,一般的应用服务器有weblogic和websphere等,它们都是商业服务器,功能强大但都是收费的。web容器最典型的就是tomcat了,Tomcat是web容器也是servlet容器
    2、jsp工作原理当web容器(tomcat、jboss等等)接收到用户的第一个jsp页面请求时,jsp引擎将这个jsp页面转换为java源代码(servlet类),在转换过程中,如果发现jsp文件有任何的语法错误,转换过程将终止,并向服务器和客户端输出错误信息,如果转换成功,然后jsp引擎用javac编译java源代码生成class文件,然后web容器加载class文件并从此创建一个新的servlet对象进行实例化,当 Servlet 类实例化后,容器加载 jsinit,以通知 servlet 它已进入服务行列。init 方法必须被加载,Servelt 才能接收和请求。假如要载入数据库驱动程序、初始化一些值等等,程序员可以重写这个方法。在其他情况下,这个方法一般为空,jspInit()方法在servlet的生命周期中只被执行一次。然后jspService()方法被调用来处理客户端的请求。容器创建一个响应文档,次文档发送给用户,如干时间后,用户再次访问这个j请求这个jsp时,容器回再次创建响应一个文档,直到容器卸载了这个class文件,当用户卸载了这个class文件后,再次访问时,jsp引擎并不重新转换和编译这个jsp文件,而是对它进行重新初始化,并创建一个响应文档,返回给客户端。对每一个请求,web容器创建一个新的线程来处理该请求。如果有多个客户端同时请求该JSP文件,则JSP引擎会创建多个线程。每个客户端请求对应一个线程。以多线程方式执行可大大降低对系统的资源需求,提高系统的并发量及响应时间.但应该注意多线程的编程限制,由于该servlet始终驻于内存,所以响应是非常快的。如果.jsp文件被修改了,服务器将根据设置决定是否对该文件重新编译,如果需要重新编译,则将编译结果取代内存中的servlet,并继续上述处理过程。如果在任何时候如果由于系统资源不足的原因,web容器将以某种不确定的方式将servlet从内存中移去。当这种情况发生时jspDestroy()方法首先被调用, 然后servlet实例便被标记加入"垃圾收集"处理。
    3、jsp脚本与声明的差异
    Jsp代码 复制代码 收藏代码
    1. <%!int count=100;%>--------jsp声明  
    2. <%int count=100;%>---------jsp脚本 
    <%!int count=100;%>--------jsp声明
    <%int count=100;%>---------jsp脚本
    
    二者的差异在于作用域和生存期, (1)、jsp声明中创建的名字有类范围的作用域和生存期 (2)、jsp脚本中创建的名字有局限于方法的作用域和生存期。 二者的作用域就像是java中在类中定义一个属性A和在类的方法中定义一个属性B, 类中不能引用属性B,但是在方法中可以引用属性A, 二者的生存期: jsp声明,例如:<%!int count=100;%><%=count++%> 脚本中的变量生存期存在于第一个用户延续到第二个用户。。。。,如果第一个用户第一次访问时100,第二个用户访问就101,第三个用户访问时102,以此类推。。。如果服务器停止而重新启动后,则count值就返回到100, jsp脚本,例如:<%int count=100;%><%=count++%> 脚本中的变量生存期存在于每个用户的访问期间,所以没有用户访问都是100
    无论声明和脚本放置的位置不同,jsp容器都是首先进行初始化声明,再执行脚本的。 总结: (1)、不能在脚本中定义方法,但可以再jsp声明中定义自己的方法,因为脚本程序是局限于jspService方法中的,如果在jspservice方法中再次定义方法是不允许的。 (2)、不能在jso声明中使用out等隐藏对象,因为out等隐藏对象,是作用域jspservice方法中定义的。 (3)、脚本中定义变量,不能在jsp声明中引用此变量。 (4)、如果变量定义在方法中,则不能在方法之前使用此变量。
  • 相关阅读:
    learnyou 相关网站
    hdu 3038 How Many Answers Are Wrong
    hdu 3047 Zjnu Stadium 并查集高级应用
    poj 1703 Find them, Catch them
    poj 1182 食物链 (带关系的并查集)
    hdu 1233 还是畅通工程
    hdu 1325 Is It A Tree?
    hdu 1856 More is better
    hdu 1272 小希的迷宫
    POJ – 2524 Ubiquitous Religions
  • 原文地址:https://www.cnblogs.com/shaohz2014/p/3624740.html
Copyright © 2011-2022 走看看