其实执行性能上的差别只在第一次的执行。因为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变量的值