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。

  
  
  
  
  1. (showdate.jsp)     
  2. <%@ page language="java" contentType="text/html;charset=gb2312" import="java.text.*,java.util.*;"%>   
  3. <%
  4. String path = request.getContextPath();
  5. String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
  6. %> 
  7. <html>     
  8. <head>     
  9. <title>Show time</title>     
  10. </head>     
  11. <body>      
  12.      Hello :      
  13.      <%     
  14.          SimpleDateFormat format = new SimpleDateFormat("yyyy/MM/dd");     
  15.          String str = format.format(new Date());     
  16.       %>     
  17.       <%=str %>     
  18. </body>     
  19. </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 类,处理请求,返回响应,容器将生成的页面返回给客户端显示。

  
  
  
  
  1. (转移成的java源文件  showdate_jsp.java)  
  2. package org.apache.jsp.ch04;      
  3.      
  4. import javax.servlet.*;      
  5. import javax.servlet.http.*;      
  6. import javax.servlet.jsp.*;      
  7. import java.text.*;      
  8. import java.util.*;;      
  9.      
  10. public final class showdate_jsp extends org.apache.jasper.runtime.HttpJspBase      
  11.     implements org.apache.jasper.runtime.JspSourceDependent {      
  12.      
  13.   private static java.util.List _jspx_dependants;      
  14.      
  15.   public Object getDependants() {      
  16.     return _jspx_dependants;      
  17.   }      
  18.      
  19.   public void _jspService(HttpServletRequest request, HttpServletResponse response)      
  20.         throws java.io.IOException, ServletException {      
  21.      
  22.     JspFactory _jspxFactory = null;      
  23.     PageContext pageContext = null;      
  24.     HttpSession session = null;      
  25.     ServletContext application = null;      
  26.     ServletConfig config = null;      
  27.     JspWriter out = null;      
  28.     Object page = this;      
  29.     JspWriter _jspx_out = null;      
  30.     PageContext _jspx_page_context = null;      
  31.      
  32.     try {      
  33.       _jspxFactory = JspFactory.getDefaultFactory();      
  34.       response.setContentType("text/html;charset=gb2312");   @1   
  35.       pageContext = _jspxFactory.getPageContext(this, request, response,      
  36.                    null, true, 8192, true);      
  37.       _jspx_page_context = pageContext;      
  38.       application = pageContext.getServletContext();      
  39.       config = pageContext.getServletConfig();      
  40.       session = pageContext.getSession();      
  41.       out = pageContext.getOut();      
  42.       _jspx_out = out;      
  43.      
  44. String path = request.getContextPath();
  45. String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; @2
  46.       out.write("\r\n");      
  47.       out.write("<html>\r\n");      
  48.       out.write("<head>\r\n");      
  49.       out.write("<title>Show time</title>\r\n");      
  50.       out.write("</head>\r\n");      
  51.       out.write("<body> \r\n");      
  52.       out.write("\tHello : \r\n");      
  53.       out.write("\t");      
  54.      
  55.          SimpleDateFormat format = new SimpleDateFormat("yyyy/MM/dd");      @3
  56.          String str = format.format(new Date());      
  57.      
  58.       out.write("\r\n");      
  59.       out.write("\t ");      
  60.       out.print(str );      
  61.       out.write("\r\n");      
  62.       out.write("</body>\r\n");      
  63.       out.write("</html>");      
  64.     } catch (Throwable t) {      
  65.      
  66.       if (!(t instanceof SkipPageException)){      
  67.         out = _jspx_out;      
  68.         if (out != null && out.getBufferSize() != 0)      
  69.           out.clearBuffer();      
  70.         if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);      
  71.       }      
  72.      
  73.     } finally {      
  74.      
  75.       if (_jspxFactory != null) _jspxFactory.releasePageContext(_jspx_page_context);      
  76.     }      
  77.   }      

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

  
  
  
  
  1. public void _jspInit(){ ..}       
  2. -- 当JSP网页一开始执行时,最先执行此方法,执行初始化工作     
  3. public void _jspDestory(){...} – JSP网页最后执行的方法     
  4. public void _jspService(HttpServletRequest request, HttpServletResponse response)     
  5.         throws java.io.IOException, ServletException { 

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

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

  
  
  
  
  1. <%@ page language="java" contentType="text/html;charset=gb2312" %> 
  2. response.setContentType("text/html;charset=gb2312");    
  3. //通过 response响应设置返回客户端的页面属性 

第二部分:HTML标签

  
  
  
  
  1. <html>      
  2. <head>      
  3. <title>Show time</title>      
  4. </head>      
  5. ..      
  6. </html> 
  7.  
  8. out.write("\r\n");  
  9. out.write("<html>\r\n");  
  10. out.write("<head>\r\n");  
  11. out.write("<title>Show time</title>\r\n");  
  12. out.write("</head>\r\n");  
  13. out.write("<body> \r\n");  
  14. out.write("\tHello : \r\n");  
  15. out.write("\t");  
  16. //通过 out对象 向客户端写HTML标签 ,out.write()输出html 标签

第三部分:声明的对象

  
  
  
  
  1. <%      
  2.          SimpleDateFormat format = new SimpleDateFormat("yyyy/MM/dd");      
  3.          String str = format.format(new Date());      
  4. %> 

在_jspService 方法中声明的局部变量:

  1. SimpleDateFormat format = new SimpleDateFormat("yyyy/MM/dd");      
  2. String str = format.format(new Date());   
  3. 在这里<% %>中的代码会在类文件的相应位置中保存不变。例如
  4. 在jsp中添加如下代码<%if(path!=""){%
  5. <p>hello</p>
  6. <%}%>
  7. 则会在java文件中代码的相应位置产生如下代码:
  8. if(path!=""){                         //处在<% %>标签中
  9.       out.write(" \t\t <p>hello</p>");    //不在<% %>标签中,直接回用out.write()输出
  10. }                                          //处在<% %>标签中
  11. 如果需要的话,也可以在<% %>中输出代码,使用out.print();例如:
  12. <%if(path!=""){out.print(world);} %>
  13. 则在类文件中会有相应代码
  14. if(path!=""){
  15. out.print(world);
  16. }这也可以向客户端输出内容。

 

 

第四部分:表达式

  
  
  
  
  1. <%=str %>      
  2. out.print(str ); //写即打印str变量的值 
  3. 表达式<% %>会直接用out.print()输出。

你可能感兴趣的:(jsp,servlet)