JSP轉譯成Servlet詳細過程

不少人都會認爲JSP的執行性能會和Servlet相差不少,其實執行性能上的差異只在第一次的執行。由於JSP在執行第一次後,會被編譯成Servlet的類文件,即.class,當再重複調用執行時,就直接執行第一次所產生的Servlet,而再也不從新把JSP編譯成Servelt。 html

所以,除了第一次的編譯會花較久的時間以外,以後JSP和Servlet的執行速度就幾乎相同了。Web容器處理JSP文件請求的執行過程主要包括如下4個部分: java

1.客戶端發出Request請求 apache

2.JSP Container 將JSP轉譯成Servlet的源代碼 瀏覽器

3.將產生的Servlet源代碼通過編譯後,並加載到內存執行 服務器

4.把結果Response(響應)至客戶端 session

在執行JSP網頁時,一般能夠分爲兩個時期:轉譯時期(Translation Time)和請求時期(Request Time)。 app

◆轉譯時期:JSP網頁轉移成Servlet類。 jsp

◆請求時期:Servlet類執行後,響應結果至客戶端。 性能

轉譯期間作了兩件事情: this

◆轉譯時期:將JSP網頁轉移爲Servlet源代碼 .java.

◆編譯時期:將Servlet 源代碼 .java編譯成 Servlet類 .class.

當JSP網頁在執行時,JSP Container會作檢查工做,若是發現JSP網頁有更新修改時,JSP Container纔會再次編譯JSP成Servlet; 若是JSP沒有更新時,就直接執行前面所產生的Servlet。

showdate.jsp

<%@ page language="java" contentType="text/html;charset=gb2312" import="java.text.*,java.util.*;"%>     
<html>     
<head>     
<title>Show time</title>     
</head>     
<body>      
     Hello :      
     <%     
         SimpleDateFormat format = new SimpleDateFormat("yyyy/MM/dd");     
         String str = format.format(new Date());     
      %>     
      <%=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


package org.apache.jsp.ch04;      
     
import javax.servlet.*;      
import javax.servlet.http.*;      
import javax.servlet.jsp.*;      
import java.text.*;      
import java.util.*;;      
     
public final class showdate_jsp extends org.apache.jasper.runtime.HttpJspBase      
    implements org.apache.jasper.runtime.JspSourceDependent {      
     
  private static java.util.List _jspx_dependants;      
     
  public Object getDependants() {      
    return _jspx_dependants;      
  }      
     
  public void _jspService(HttpServletRequest request, HttpServletResponse response)      
        throws java.io.IOException, ServletException {      
     
    JspFactory _jspxFactory = null;      
    PageContext pageContext = null;      
    HttpSession session = null;      
    ServletContext application = null;      
    ServletConfig config = null;      
    JspWriter out = null;      
    Object page = 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>Show time</title>\r\n");      
      out.write("</head>\r\n");      
      out.write("<body> \r\n");      
      out.write("\tHello : \r\n");      
      out.write("\t");      
     
         SimpleDateFormat format = new SimpleDateFormat("yyyy/MM/dd");      
         String str = format.format(new Date());      
     
      out.write("\r\n");      
      out.write("\t ");      
      out.print(str );      
      out.write("\r\n");      
      out.write("</body>\r\n");      
      out.write("</html>");      
    } catch (Throwable t) {      
     
      if (!(t instanceof SkipPageException)){      
        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時,內容主要包含三個部分:

public void _jspInit(){ ..}// 當JSP網頁一開始執行時,最早執行此方法,執行初始化工做
    
public void _jspDestory(){...}// JSP網頁最後執行的方法
  
public void _jspService(HttpServletRequest request, HttpServletResponse response) throws java.io.IOException, ServletException {
將showdate.jsp和showdate_jsp.java作一個簡單對比:

第一部分:頁面屬性的對比

<%@ page language="java" contentType="text/html;charset=gb2312" %> 
response.setContentType("text/html;charset=gb2312");//經過 response響應設置返回客戶端的頁面屬性 
第二部分:HTML標籤

<html>      
<head>      
<title>Show time</title>      
</head>      
..      
</html> 
 
out.write("\r\n");  
out.write("<html>\r\n");  
out.write("<head>\r\n");  
out.write("<title>Show time</title>\r\n");  
out.write("</head>\r\n");  
out.write("<body> \r\n");  
out.write("\tHello : \r\n");  
out.write("\t");  
//經過 out對象 向客戶端寫HTML標籤
第三部分:聲明的對象

<%      
     SimpleDateFormat format = new SimpleDateFormat("yyyy/MM/dd");      
     String str = format.format(new Date());      
%>
SimpleDateFormat format = new SimpleDateFormat("yyyy/MM/dd");      
String str = format.format(new Date());
第四部分:表達式

<%=str %>
out.print(str ); //寫即打印str變量的值
相關文章
相關標籤/搜索