很多人都会认为JSP的执行性能会和Servlet相差很多,其实执行性能上的差别只在第一次的执行。本文讲详细的介绍JSP转译成Servlet的主要过程。
很多人都会认为JSP的执行性能会和Servlet相差很多,其实执行性能上的差别只在第一次的执行。因为JSP在执行第一次后,会被编译成Servlet的类文件,即.class,当再重复调用执行时,就直接执行第一次所产生的Servlet,而不再重新把JSP编译成Servelt。
因此,除了第一次的编译会花较久的时间之外,之后JSP和Servlet的执行速度就几乎相同了。Web容器处理JSP文件请求的执行过程主要包括以下4个部分:
1.客户端发出Request请求
2.JSP Container 将JSP转译成Servlet的源代码
3.将产生的Servlet源代码经过编译后,并加载到内存执行
4.把结果Response(响应)至客户端
在执行JSP网页时,通常可以分为两个时期:转译时期(Translation Time)和请求时期(Request Time)。
◆转译时期:JSP网页转移成Servlet类。
◆请求时期:Servlet类执行后,响应结果至客户端。
转译期间做了两件事情:
◆转译时期:将JSP网页转移为Servlet源代码 .java.
◆编译时期:将Servlet 源代码 .java编译成 Servlet类 .class.
当JSP网页在执行时,JSP Container会做检查工作,如果发现JSP网页有更新修改时,JSP Container才会再次编译JSP成Servlet; 如果JSP没有更新时,就直接执行前面所产生的Servlet。
- (showdate.jsp)
- <%@pagelanguage="java"contentType="text/html;charset=gb2312"import="java.text.*,java.util.*;"%>
- <html>
- <head>
- <title>Showtime</title>
- </head>
- <body>
- Hello:
- <%
- SimpleDateFormatformat=newSimpleDateFormat("yyyy/MM/dd");
- Stringstr=format.format(newDate());
- %>
- <%=str%>
- </body>
- </html>
当部署好 showdate.jsp之后,启动Tomcat服务器。
1.在IE浏览器中输入配置好的路径 .... showdate.jsp 请求这个页面。
2.JSP Container 即Tomcat 服务器会将 showdate.jsp 转译成 showdate_jsp.java 源文件。
3.同时将 showdate_jsp.java 源文件编译成 showdate_jsp.class。
4.编译执行showdate_jsp.class 类,处理请求,返回响应,容器将生成的页面返回给客户端显示。
- (转移成的java源文件showdate_jsp.java)
- packageorg.apache.jsp.ch04;
- importjavax.servlet.*;
- importjavax.servlet.http.*;
- importjavax.servlet.jsp.*;
- importjava.text.*;
- importjava.util.*;;
- publicfinalclassshowdate_jspextendsorg.apache.jasper.runtime.HttpJspBase
- implementsorg.apache.jasper.runtime.JspSourceDependent{
- privatestaticjava.util.List_jspx_dependants;
- publicObjectgetDependants(){
- return_jspx_dependants;
- }
- publicvoid_jspService(HttpServletRequestrequest,HttpServletResponseresponse)
- throwsjava.io.IOException,ServletException{
- JspFactory_jspxFactory=null;
- PageContextpageContext=null;
- HttpSessionsession=null;
- ServletContextapplication=null;
- ServletConfigconfig=null;
- JspWriterout=null;
- Objectpage=this;
- JspWriter_jspx_out=null;
- PageContext_jspx_page_context=null;
- try{
- _jspxFactory=JspFactory.getDefaultFactory();
- response.setContentType("text/html;charset=gb2312");
- pageContext=_jspxFactory.getPageContext(this,request,response,
- null,true,8192,true);
- _jspx_page_context=pageContext;
- application=pageContext.getServletContext();
- config=pageContext.getServletConfig();
- session=pageContext.getSession();
- out=pageContext.getOut();
- _jspx_out=out;
- out.write("\r\n");
- out.write("<html>\r\n");
- out.write("<head>\r\n");
- out.write("<title>Showtime</title>\r\n");
- out.write("</head>\r\n");
- out.write("<body>\r\n");
- out.write("\tHello:\r\n");
- out.write("\t");
- SimpleDateFormatformat=newSimpleDateFormat("yyyy/MM/dd");
- Stringstr=format.format(newDate());
- out.write("\r\n");
- out.write("\t");
- out.print(str);
- out.write("\r\n");
- out.write("</body>\r\n");
- out.write("</html>");
- }catch(Throwablet){
- if(!(tinstanceofSkipPageException)){
- out=_jspx_out;
- if(out!=null&&out.getBufferSize()!=0)
- out.clearBuffer();
- if(_jspx_page_context!=null)_jspx_page_context.handlePageException(t);
- }
- }finally{
- if(_jspxFactory!=null)_jspxFactory.releasePageContext(_jspx_page_context);
- }
- }
- }
当JSP页面被转译成Servlet时,内容主要包含三个部分:
- publicvoid_jspInit(){..}
- --当JSP网页一开始执行时,最先执行此方法,执行初始化工作
- publicvoid_jspDestory(){...}–JSP网页最后执行的方法
- publicvoid_jspService(HttpServletRequestrequest,HttpServletResponseresponse)
- throwsjava.io.IOException,ServletException{
JSP网页中最主要的程序都是在此执行,将showdate.jsp和showdate_jsp.java做一个简单对比:
第一部分:页面属性的对比
- <%@pagelanguage="java"contentType="text/html;charset=gb2312"%>
- response.setContentType("text/html;charset=gb2312");
- //通过response响应设置返回客户端的页面属性
第二部分:HTML标签
- <html>
- <head>
- <title>Showtime</title>
- </head>
- ..
- </html>
- out.write("\r\n");
- out.write("<html>\r\n");
- out.write("<head>\r\n");
- out.write("<title>Showtime</title>\r\n");
- out.write("</head>\r\n");
- out.write("<body>\r\n");
- out.write("\tHello:\r\n");
- out.write("\t");
- //通过out对象向客户端写HTML标签
第三部分:声明的对象
- <%
- SimpleDateFormatformat=newSimpleDateFormat("yyyy/MM/dd");
- Stringstr=format.format(newDate());
- %>
在_jspService 方法中声明的局部变量:
- SimpleDateFormatformat=newSimpleDateFormat("yyyy/MM/dd");
- Stringstr=format.format(newDate());
第四部分:表达式
- <%=str%>
- out.print(str);//写即打印str变量的值