JSP轉譯成Servlet詳細過程,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。
- (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 {
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("\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());
- %>
在_jspService 方法中聲明的局部變量:
- SimpleDateFormat format = new SimpleDateFormat("yyyy/MM/dd");
- String str = format.format(new Date());
第四部分:表達式
- <%=str %>
- out.print(str ); //寫即打印str變量的值