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变量的值 
  • 相关阅读:
    2017-2018-2 20155228 《网络对抗技术》 实验八:Web基础
    2017-2018-2 20155228 《网络对抗技术》 实验七:网络欺诈防范
    2017-2018-2 20155228 《网络对抗技术》 实验六:信息搜集与漏洞扫描
    2017-2018-2 20155228 《网络对抗技术》 实验五:MSF基础应用
    2017-2018-2 20155228 《网络对抗技术》 实验四:恶意代码分析
    2017-2018-2 20155228 《网络对抗技术》 实验三:MAL_免杀原理与实践
    2017-2018-2 20155228 《网络对抗技术》 实验二:后门原理与实践
    2017-2018-2 20155228 《网络对抗技术》 实验一:PC平台逆向破解
    2017-2018 Exp9 网络欺诈技术防范 20155214
    2017-2018 Exp8 Web基础 20155214
  • 原文地址:https://www.cnblogs.com/lehaha/p/4182300.html
Copyright © 2011-2022 走看看