jsp执行过程详解
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt237
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脚本与声明的差异
-
<%!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)、如果变量定义在方法中,则不能在方法之前使用此变量。
Tomcat中JSP引擎工作原理?
2011-12-30 11:24 259人阅读 评论(0) 收藏 举报
JSP运行环境:
执行JSP代码需要在服务器上安装JSP引擎,比较常见的引擎有WebLogic和Tomcat。把这些支持JSP的web服务器配置好后。就可以再客户端通过浏览器来访问JSP页面了。默认端口一般是7001.
JSP生命周期:
JSP处理请求的方法就是把这些请求都统一看做Servlet。由于这个原因,JSP的很多功能和生命周期,都由Java Servlet技术标准定义的。这种限制,在动态内容方面更加明显。所以学习JSP的时候,需要温习Servlet的内容和标准。
JSP网络应用服务器框架:
在符合J2EE规范的服务器构建起来之后,就可以编写JSP页面了,在HTML页面中嵌入JSP脚本,该页面就成为JSP页面了。JSP脚本用特定的标记括起来,如<%...%>,或者<JSP>…</JSP>。JSP的工作流程如下:当其读到HTML的代码的时候,就直接输出到客户端,而如果读到嵌入JSP脚本的时候,就需要对这些脚本进行另外的翻译和处理,得到输出之后再输出到客户端。
下面通过一个简单页面编写来了解JSP网络应用的框架:
1.JSP客户端交互
JSP的大部分工作就是与客户端进行交互。客户端一般指的是浏览器,它们与置于服务器端得JSP页面进行交互。JSP脚本中所有的Java语句都是在服务器执行,服务器接受客户端提交的请求,通过一定的处理之后,将结果返回给客户端,客户端得到的仅仅是HTML代码。下面是一个JSP的HelloWorld程序代码:
-
<html>
-
<head>
-
<title>HelloWorld for JSP</title>
-
</head>
-
<body>
-
<h1>HelloWord for JSP</h1>
-
<%out.println("<h3>Hello World!</h3>");%>
-
</body>
-
</html>
2.交互过程的流程
在一般的客户端和服务器端的交互中,是用HTTP协议,客户端通过下面4个步骤也服务器段进行交互:
(1)客户端和服务器端建立连接
(2)发送客户端请求
(3)服务器返回应答给客户
(4)客户端关闭连接
所有的请求都是由客户端主动发出的,而服务器一直出于被动的监听状态。用户在浏览器键入要访问的地址,按回车键确认后,浏览器开始与服务器建立连接,从这时开始,就开始了一次交互过程。浏览器通过一段时间的等待后,从服务器得到响应,并且把相应的信息以HTML方式呈现给用户。用户在浏览网站的过程中,实际上包含了很多这样的交互应答过程。在客户端与JSP页面的交互过程中,只有服务器接收请求和返回应答的动作可能不一样,其他与上面过程基本一致。基本情况如下:
(1)服务器在收到一个请求后首先要分析这个请求,如果请求的页面只是一般的HTML页面,服务器就直接读出HTML页面并返回给客户端
(2)如果客户端请求的是JSP页面,服务器调用JSP引擎翻译处理所请求的JSP页面,并将翻译和处理之后的HTML返回给客户端
(3)如果遇到JavaBeans组件,JSP引擎将调用相应的JavaBeans组件,得到JavaBeans的返回值,最后返回给JSP页面
3.JSP引擎的工作原理
当一个JSP页面第一次被访问的时候,JSP引擎将执行以下步骤:
(1)将JSP页面翻译成一个Servlet,这个Servlet是一个java文件,同时也是一个完整的java程序
(2)JSP引擎调用java编译器对这个Servlet进行编译,得到可执行文件class
(3)JSP引擎调用java虚拟机来解释执行class文件,生成向客户端发送的应答,然后发送给客户端
以上三个步骤仅仅在JSP页面第一次被访问时才会执行,以后的访问速度会因为class文件已经生成而大大提高。当JSP引擎街道一个客户端的访问请求时,首先判断请求的JSP页面是否比对应的Servlet新,如果新,对应的JSP需要重新编译。
4.对请求信息的处理
在大部分的交互过程中,一个JSP页面首先对用户提出的请求进行分析,然后从请求中得到有用的数据,比如接收用户提交的数据或者请求的方法,然后进行相应的处理。而这就需要了解得到传入参数的方法和得到用户其他信息的方法。
(1)得到传入参数的方法
在交互过程中,服务器必须从客户端得到一些数据,来帮助处理过程的进行。这些数据包括用户身份验证数据(如用户名、密码等)以及其他中要信息。而这些数据的载体,就是用户提交的请求。请求的组成主要有两部分,一是头信息。头信息包含了以下信息:请求的方法(GET和POST)、请求的URL和浏览器信息。其他信息包含了一些数据信息。
首先要了解的是GET方法发送请求时,这种方法是客户端用来向服务器段请求信息的,所以在请求中不包含信息体。用户只能把请求的内容作为参数附加在URL后面进行发送,参数之间用“&”符号隔开,如代码:一个典型的GET请求的表单get.html
-
<html>
-
<head>
-
<title>Get</title>
-
</head>
-
<body>
-
<h1>Get Method</h1>
-
<form action = "submit.jsp" method = "GET">
-
username<input name = "uername" value = "aaa"><br>
-
password<inpput type = password name = "password" value = "111111"><br>
-
<input type = submit value = "submit">
-
</form>
-
</body>
-
</html>
(代码中有一个表单,表单在定义的时候,定义了属性method=“GET”,这表明表单提交的方法是GET。这个表单向服务器提交两个参数,其中一个是username,缺省值为aaa,另外一个是password,其缺省值是111111。)
这个页面只是得到了输入数据,只有submit.JSP才能实现提交这个页面的数据。这就是需要用到JSP了,代码如下:submit.JSP
-
<html>
-
<head>
-
<title>submit</title>
-
</head>
-
<body>
-
<h1>submit</h1>
-
request method:<%=request.getMethod() %><br>
-
user name:<%=request.getParameter("user") %><br>
-
password:<%=request.getParameter("password") %><br>
-
</body>
-
</html>
在这个JSP页面中是用了JSP的内置对象request的两个方法,一个是getMethod,用来获取当前请求的类型,另一个是getParameter,用来获取指定参数的值。在get.html中单击submit按钮,就可以显示表单请求方法,用户名以及密码等信息。
(2)得到其他信息的方法
得到非用户输入的其他参数信息,就需要用到其他的方法。如下所示是一个得到客户端信息的简单程序。根据这个程序我们可以初步了解如何得到客户端信息的大致思路。代码如下:
-
<html>
-
<head>
-
<title>得到消息</title>
-
</head>
-
<body>
-
<h1>请求中所包含的URL</h1><br>
-
<%=request.getQueryString()%><br>
-
</body>
-
</html>