zoukankan      html  css  js  c++  java
  • 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. <html>     
    4. <head>     
    5. <title>Show time</title>     
    6. </head>     
    7. <body>      
    8.      Hello :      
    9.      <%     
    10.          SimpleDateFormat format = new SimpleDateFormat("yyyy/MM/dd");     
    11.          String str = format.format(new Date());     
    12.       %>     
    13.       <%=str %>     
    14. </body>     
    15. </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");      
    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(" ");      
    45.       out.write("<html> ");      
    46.       out.write("<head> ");      
    47.       out.write("<title>Show time</title> ");      
    48.       out.write("</head> ");      
    49.       out.write("<body>  ");      
    50.       out.write(" Hello :  ");      
    51.       out.write(" ");      
    52.      
    53.          SimpleDateFormat format = new SimpleDateFormat("yyyy/MM/dd");      
    54.          String str = format.format(new Date());      
    55.      
    56.       out.write(" ");      
    57.       out.write("  ");      
    58.       out.print(str );      
    59.       out.write(" ");      
    60.       out.write("</body> ");      
    61.       out.write("</html>");      
    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.   }      

    当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(" ");  
    9. out.write("<html> ");  
    10. out.write("<head> ");  
    11. out.write("<title>Show time</title> ");  
    12. out.write("</head> ");  
    13. out.write("<body>  ");  
    14. out.write(" Hello :  ");  
    15. out.write(" ");  
    16. //通过 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变量的值
  • 相关阅读:
    三数之和
    罗马数字与整数
    Oracle 开启或关闭归档
    Oracle RMAN scripts to delete archivelog
    Oracle check TBS usage
    Oracle kill locked sessions
    场景9 深入RAC运行原理
    场景7 Data Guard
    场景4 Data Warehouse Management 数据仓库
    场景5 Performance Management
  • 原文地址:https://www.cnblogs.com/Seachal/p/5407131.html
Copyright © 2011-2022 走看看