JSP转译成Servlet详细过程

来源:互联网 发布:身高体重测试软件 编辑:程序博客网 时间:2024/05/21 04:20

很多人都会认为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.     
  5. Show time    
  6.     
  7.      
  8.      Hello :     
  9.      <%    
  10.          SimpleDateFormat format = new SimpleDateFormat("yyyy/MM/dd");    
  11.          String str = format.format(new Date());    
  12.       %>    
  13.       <%=str %>    
  14.     

当部署好 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");     
  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.       out.write("/r/n");     
  45.       out.write("/r/n");     
  46.       out.write("/r/n");     
  47.       out.write("Show time/r/n");     
  48.       out.write("/r/n");     
  49.       out.write(" /r/n");     
  50.       out.write("/tHello : /r/n");     
  51.       out.write("/t");     
  52.     
  53.          SimpleDateFormat format = new SimpleDateFormat("yyyy/MM/dd");     
  54.          String str = format.format(new Date());     
  55.     
  56.       out.write("/r/n");     
  57.       out.write("/t ");     
  58.       out.print(str );     
  59.       out.write("/r/n");     
  60.       out.write("/r/n");     
  61.       out.write("");     
  62.     } catch (Throwable t) {     
  63.     
  64.       if (!(t instanceof SkipPageException)){     
  65.         out = _jspx_out;     
  66.         if (out != null && out.getBufferSize() != 0)     
  67.           out.clearBuffer();     
  68.         if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);     
  69.       }     
  70.     
  71.     } finally {     
  72.     
  73.       if (_jspxFactory != null) _jspxFactory.releasePageContext(_jspx_page_context);     
  74.     }     
  75.   }     
  76. }

当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.      
  2.      
  3. Show time     
  4.      
  5. ..     
  6.  
  7. out.write("/r/n"); 
  8. out.write("/r/n"); 
  9. out.write("/r/n"); 
  10. out.write("Show time/r/n"); 
  11. out.write("/r/n"); 
  12. out.write(" /r/n"); 
  13. out.write("/tHello : /r/n"); 
  14. out.write("/t"); 
  15. //通过 out对象 向客户端写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());   

第四部分:表达式

  1. <%=str %>     
  2. out.print(str ); //写即打印str变量的值
原创粉丝点击