名扬数据:JSP转译成Servlet详细过程

其实执行性能上的差别只在第一次的执行。因为JSP执行第一次后,会被编译成Servlet类文件,即.class当再重复调用执行时,就直接执行第一次所产生的Servlet,很多人都会认为JSP执行性能会和Servlet相差很多。而不再重新把JSP编译成Servelt

除了第一次的编译会花较久的时间之外,因此。之后JSP和Servlet执行速度就几乎相同了Web容器处置JSP文件请求的执行过程主要包括以下4个部分:

1.客户端发出Request请求

2.JSPContain将JSP转译成Servlet源代码

并加载到内存执行3.将产生的Servlet源代码经过编译后。

4.把结果Respons响应)至客户端

通常可以分为两个时期:转译时期(TranslatTime和请求时期(RequestTime执行JSP网页时。

◆转译时期:JSP网页转移成Servlet类。

响应结果至客户端。◆请求时期:Servlet类执行后。

转译期间做了两件事情:

◆转译时期:将JSP网页转移为Servlet源代码 .java.

◆编译时期:将Servlet源代码 .java编译成 Servlet类 .class.

JSPContain会做检查工作,当JSP网页在执行时。如果发现JSP网页有更新修改时,JSPContain才会再次编译JSP成Servlet;如果JSP没有更新时,就直接执行前面所产生的Servlet

showdate.jsp    

java.util.*;"%>    <%@pagelanguage="java"contentType="text/html;charset=gb2312"import="java.text.*.

<html>    

<head>    

<title>Showtime</title>    

</head>    

<body>     

    Hello:     

    <%    

        SimpleDateFormatformat=newSimpleDateFormat"yyyy/MM/dd";    

        Stringstr=format.formatnewDate;    

     %>    

     <%=str%>    

</body>    

</html>

启动Tomcat服务器。当部署好 showdate.jsp之后。

1.IE浏览器中输入配置好的路径 ....showdate.jsp请求这个页面。

2.JSPContain即Tomcat服务器会将 showdate.jsp转译成 showdate_jsp.java源文件。

3.同时将 showdate_jsp.java源文件编译成 showdate_jsp.class

处置请求,4.编译执行showdate_jsp.class类。返回响应,容器将生成的页面返回给客户端显示。

转移成的java源文件 showdate_jsp.java 

packagorg.apache.jsp.ch04;     

    

importjavax.servlet.*;     

importjavax.servlet.http.*;     

importjavax.servlet.jsp.*;     

importjava.text.*;     

importjava.util.*;;     

    

publicfinalclassshowdate_jspextendorg.apache.jasper.runtime.HttpJspBase     

   implementorg.apache.jasper.runtime.JspSourceDepend{     

    

 privatstaticjava.util.List_jspx_dependants;     

    

 publicObjectgetDepend{     

   return_jspx_dependants;     

 }     

    

HttpServletResponsrespons      publicvoid_jspServicHttpServletRequestrequest.

ServletExcept{            throwjava.io.IOException.

    

   JspFactori_jspxFactori=null;     

   PageContextpageContext=null;     

   HttpSessionsession=null;     

   ServletContextapplic=null;     

   ServletConfigconfig=null;     

   JspWriterout=null;     

   Objectpage=this;     

   JspWriter_jspx_out=null;     

   PageContext_jspx_page_context=null;     

    

   try{     

     _jspxFactori=JspFactory.getDefaultFactori;     

     response.setContentTyp"text/html;charset=gb2312";     

request,     pageContext=_jspxFactory.getPageContextthis.response,     

true,                  null.8192,true;     

     _jspx_page_context=pageContext;     

     applic=pageContext.getServletContext;     

     config=pageContext.getServletConfig;     

     session=pageContext.getSess;     

     out=pageContext.getOut;     

     _jspx_out=out;     

    

     out.writ"\r\n";     

     out.writ"<html>\r\n";     

     out.writ"<head>\r\n";     

     out.writ"<title>Showtime</title>\r\n";     

     out.writ"</head>\r\n";     

     out.writ"<body>\r\n";     

     out.writ"\tHello:\r\n";     

     out.writ"\t";     

    

        SimpleDateFormatformat=newSimpleDateFormat"yyyy/MM/dd";     

        Stringstr=format.formatnewDate;     

    

     out.writ"\r\n";     

     out.writ"\t";     

     out.printstr;     

     out.writ"\r\n";     

     out.writ"</body>\r\n";     

     out.writ"</html>";     

   }catchThrowablt{     

    

     if!tinstanceofSkipPageExcept{     

       out=_jspx_out;     

       ifout!=null&&out.getBufferS!=0     

         out.clearBuff;     

       if_jspx_page_context!=null_jspx_page_context.handlePageExceptt;     

     }     

    

   }final{     

    

     if_jspxFactori!=null_jspxFactory.releasePageContext_jspx_page_context;     

   }     

 }     

}

内容主要包括三个部分:当JSP页面被转译成Servlet时。

publicvoid_jspInit{..}      

最先执行此方法,--当JSP网页一开始执行时。执行初始化工作    

publicvoid_jspDestori{...}– JSP网页最后执行的方法    

HttpServletResponsrespons    publicvoid_jspServicHttpServletRequestrequest.

ServletExcept{       throwjava.io.IOException.

将showdate.jsp和showdate_jsp.java做一个简单对比:JSP网页中最主要的顺序都是此执行。

第一部分:页面属性的对比

<%@pagelanguage="java"contentType="text/html;charset=gb2312"%>

response.setContentTyp"text/html;charset=gb2312";   

//通过 respons响应设置返回客户端的页面属性 

第二部分:HTML标签

<html>     

<head>     

<title>Showtime</title>     

</head>     

..     

</html>

 

out.writ"\r\n"; 

out.writ"<html>\r\n"; 

out.writ"<head>\r\n"; 

out.writ"<title>Showtime</title>\r\n"; 

out.writ"</head>\r\n"; 

out.writ"<body>\r\n"; 

out.writ"\tHello:\r\n"; 

out.writ"\t"; 

//通过 out对象 向客户端写HTML标签 

第三部分:声明的对象

<%     

        SimpleDateFormatformat=newSimpleDateFormat"yyyy/MM/dd";     

        Stringstr=format.formatnewDate;     

%>

_jspServic方法中声明的局部变量:

SimpleDateFormatformat=newSimpleDateFormat"yyyy/MM/dd";     

Stringstr=format.formatnewDate;   

第四部分:表达式

<%=str%>     

out.printstr;//写即打印str变量的值