不少人都會認爲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。
<%@ 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變量的值