很多人都會認為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.
- (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("rn");
- out.write("<html>rn");
- out.write("<head>rn");
- out.write("<title>Show time</title>rn");
- out.write("</head>rn");
- out.write("<body> rn");
- out.write("tHello : rn");
- out.write("t");
- SimpleDateFormat format = new SimpleDateFormat("yyyy/MM/dd");
- String str = format.format(new Date());
- out.write("rn");
- out.write("t ");
- out.print(str );
- out.write("rn");
- out.write("</body>rn");
- 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 {
JSP網頁中最主要的程序都是在此執行,將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("rn");
- out.write("<html>rn");
- out.write("<head>rn");
- out.write("<title>Show time</title>rn");
- out.write("</head>rn");
- out.write("<body> rn");
- out.write("tHello : rn");
- out.write("t");
- //通過 out對象 向客戶端寫HTML標籤
第三部分:聲明的對象
- <%
- SimpleDateFormat format = new SimpleDateFormat("yyyy/MM/dd");
- String str = format.format(new Date());
- %>
在_jspService 方法中聲明的局部變數:
- SimpleDateFormat format = new SimpleDateFormat("yyyy/MM/dd");
- String str = format
.format(new Date());
第四部分:表達式
- <%=str %>
- out.print(str ); //寫即列印str變數的值
[火星人 ] ·JSP轉譯成Servlet詳細過程已經有801次圍觀