JSP 与Servlet 的比较:
Sun 公司首先发展出Servlet,其功能非常强大,且体系设计也很完善,但是它输出HTML 语法
时,必须使用out.println( )一句一句地输出,但是当整个网页内容非常复杂时,那么你的Servlet 程序可能
大部分都是用out.println( )输出HTML 的标签了!
Sun 公司推出类似于ASP 的嵌入型Scripting Language,并且给它一个新的名称:
JavaServer Pages,简称为JSP。JSP 的执行过程: 36 / 197
(1) 客户端发出Request (请求);
(2) JSP Container 将JSP 转译成Servlet 的源代码;
(3) 将产生的Servlet 的源代码经过编译后,并加载到内存执行;
(4) 把结果Response (响应)至客户端。
如下:
<!--[if gte vml 1]><v:shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f"> <v:stroke joinstyle="miter" /> <v:formulas> <v:f eqn="if lineDrawn pixelLineWidth 0" /> <v:f eqn="sum @0 1 0" /> <v:f eqn="sum 0 0 @1" /> <v:f eqn="prod @2 1 2" /> <v:f eqn="prod @3 21600 pixelWidth" /> <v:f eqn="prod @3 21600 pixelHeight" /> <v:f eqn="sum @0 0 1" /> <v:f eqn="prod @6 1 2" /> <v:f eqn="prod @7 21600 pixelWidth" /> <v:f eqn="sum @8 21600 0" /> <v:f eqn="prod @7 21600 pixelHeight" /> <v:f eqn="sum @10 21600 0" /> </v:formulas> <v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect" /> <o:lock v:ext="edit" aspectratio="t" /> </v:shapetype><v:shape id="_x0000_i1025" type="#_x0000_t75" style='width:230.25pt; height:156.75pt'> <v:imagedata src="file:///D:/DOCUME~1/powinder/LOCALS~1/Temp/msoclip1/03/clip_image001.emz" o:title="" /> </v:shape><![endif]--><!--[if !vml]-->
在执行JSP 网页时,通常可分为两个时期:转译时期(Translation Time)和请求时期(Request
Time)。
转译时期:JSP 网页转译成Servlet 类。
转译期间主要做了两件事情:将JSP 网页转译为Servlet 源代码(.java),此段称为转译时
期(Translation time);将Servlet 源代码(.java)编译成Servlet 类(.class),此段称为
编译时期(Compilation time)。
请求时期:Servlet 类执行后,响应结果至客户端。
<!--[if gte vml 1]><v:shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f"> <v:stroke joinstyle="miter" /> <v:formulas> <v:f eqn="if lineDrawn pixelLineWidth 0" /> <v:f eqn="sum @0 1 0" /> <v:f eqn="sum 0 0 @1" /> <v:f eqn="prod @2 1 2" /> <v:f eqn="prod @3 21600 pixelWidth" /> <v:f eqn="prod @3 21600 pixelHeight" /> <v:f eqn="sum @0 0 1" /> <v:f eqn="prod @6 1 2" /> <v:f eqn="prod @7 21600 pixelWidth" /> <v:f eqn="sum @8 21600 0" /> <v:f eqn="prod @7 21600 pixelHeight" /> <v:f eqn="sum @10 21600 0" /> </v:formulas> <v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect" /> <o:lock v:ext="edit" aspectratio="t" /> </v:shapetype><v:shape id="_x0000_i1025" type="#_x0000_t75" style='width:338.25pt; height:137.25pt'> <v:imagedata src="file:///D:/DOCUME~1/powinder/LOCALS~1/Temp/msoclip1/07/clip_image001.emz" o:title="" /> </v:shape><![endif]--><!--[if !vml]--><!--[endif]-->
<!--[if gte vml 1]><v:shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f"> <v:stroke joinstyle="miter" /> <v:formulas> <v:f eqn="if lineDrawn pixelLineWidth 0" /> <v:f eqn="sum @0 1 0" /> <v:f eqn="sum 0 0 @1" /> <v:f eqn="prod @2 1 2" /> <v:f eqn="prod @3 21600 pixelWidth" /> <v:f eqn="prod @3 21600 pixelHeight" /> <v:f eqn="sum @0 0 1" /> <v:f eqn="prod @6 1 2" /> <v:f eqn="prod @7 21600 pixelWidth" /> <v:f eqn="sum @8 21600 0" /> <v:f eqn="prod @7 21600 pixelHeight" /> <v:f eqn="sum @10 21600 0" /> </v:formulas> <v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect" /> <o:lock v:ext="edit" aspectratio="t" /> </v:shapetype><v:shape id="_x0000_i1025" type="#_x0000_t75" style='width:338.25pt; height:137.25pt'> <v:imagedata src="file:///D:/DOCUME~1/powinder/LOCALS~1/Temp/msoclip1/07/clip_image001.emz" o:title="" /> </v:shape><![endif]--><!--[if !vml]--><!--[endif]-->
转译时期与请求时期程序
特别注意:
当JSP 网页在执行时,JSP Container 会做检查的工作,若发现JSP 网页有更新修改时,JSP Container (如tomcat ) 才会再次编译JSP 成Servlet;JSP 没有更新时,就直接执行前面所产生的Servlet。
假如 当执行HelloJSP.jsp 时,Tomcat 会将它先转译为Servlet。 如某目录下的HelloJSP_jsp.java和HelloJSP_jsp.class。其中HelloJSP_jsp.java
就是HelloJSP.jsp 所转译的Servlet 源代码。 其中 *.java 文件内容主要包含三部分:
public void _jspInit() { //当JSP 网页一开始执行时,最先执行此方法。因此,我们通常会把//初始化的工作写在此方法中。
…. 略
}
public void _jspDestroy() { //JSP 网页最后执行的方法。
…. 略
}
public void _jspService(HttpServletRequest request, HttpServletResponse
response) throws java.io.IOException, ServletException { //JSP 网页最主要的程序都是在//此方法中。
…. 略
}
可对照HelloJSP.jsp 和HelloJSP_jsp.java。
<!--[endif]-->