1. 程式人生 > >JSP工作流程及執行原理

JSP工作流程及執行原理

JSP起源
在很多動態網頁中,絕大部分內容都是固定不變的,只有區域性內容需要動態產生和改變。
如果使用Servlet程式來輸出只有區域性內容需要動態改變的網頁,其中所有的靜態內容也需要程式設計師用Java程式程式碼產生,整個Servlet程式的程式碼將非常臃腫,編寫和維護都將非常困難。
對大量靜態內容的美工設計和相關HTML語句的編寫,並不是程式設計師所要做的工作,程式設計師對此也不一定在行。網頁美工設計和製作人員不懂Java程式設計,更是無法來完成這樣的工作。
為了彌補Servlet的缺陷,SUN公司在Servlet的基礎上推出了JSP(Java Server Pages)技術作為解決方案。
JSP是簡化Servlet編寫的一種技術,它將Java程式碼和HTML語句混合在同一個檔案中編寫,只對網頁中的要動態產生的內容採用Java程式碼來編寫,而對固定不變的靜態內容採用普通靜態HTML頁面的方式編寫。
建立對JSP的直觀認識
JSP頁面是由HTML語句和巢狀在其中的Java程式碼組成的一個普通文字檔案,JSP 頁面的副檔名必須為.jsp。
在JSP頁面中編寫的Java程式碼需要巢狀在<%和%>中,巢狀在<%和%>之間的Java程式碼被稱之為指令碼片段(Scriptlets),沒有巢狀在<%和%>之間的內容被稱之為JSP的模版元素。
JSP中的Java程式碼可以使用out.println語句將其他Java程式程式碼產生的結果字串輸出給客戶端,也可以使用System.out.println語句將它們列印到命令列視窗。
JSP檔案就像普通的HTML檔案一樣,它們可以放置在WEB應用程式中的除了WEB-INF及其子目錄外的其他任何目錄中,JSP頁面的訪問路徑與普通HTML頁面的訪問路徑形式也完全一樣。
JSP
JSP全稱是Java Server Pages,它和servle技術一樣,都是SUN公司定義的一種用於開發動態web資源的技術。
JSP這門技術的最大的特點在於,寫jsp就像在寫html,但它相比html而言,html只能為使用者提供靜態內容,而Jsp技術允許在頁面中巢狀java程式碼,為使用者提供動態資料。
Jsp快速入門:在jsp頁面中輸出當前時間。
不管是JSP還是Servlet,雖然都可以用於開發動態web資源。但由於這2門技術各自的特點,在長期的軟體實踐中,人們逐漸把servlet作為web應用中的控制器元件來使用,而把JSP技術作為資料顯示模板來使用。
其原因為,程式的資料通常要美化後再輸出:
讓jsp既用java程式碼產生動態資料,又做美化會導致頁面難以維護。
讓servlet既產生資料,又在裡面巢狀html程式碼美化資料,同樣也會導致程式可讀性差,難以維護。
因此最好的辦法就是根據這兩門技術的特點,讓它們各自負責各的,servlet只負責響應請求產生資料,並把資料通過轉發技術帶給jsp,資料的顯示jsp來做。
JSP的執行原理
WEB容器(Servlet引擎)接收到以.jsp為副檔名的URL的訪問請求時,它將把該訪問請求交給JSP引擎去處理。Tomcat中的JSP引擎就是一個Servlet程式,它負責解釋和執行JSP頁面。
每個JSP 頁面在第一次被訪問時,JSP引擎將它翻譯成一個Servlet源程式,接著再把這個Servlet源程式編譯成Servlet的class類檔案,然後再由WEB容器(Servlet引擎)像呼叫普通Servlet程式一樣的方式來裝載和解釋執行這個由JSP頁面翻譯成的Servlet程式。
Tomcat 5.x把為JSP頁面建立的Servlet原始檔和class類檔案放置在“<TOMCAT_HOME>\work\Catalina<主機名><應用程式名>\”目錄中,Tomcat將JSP頁面翻譯成的Servlet的包名為org.apache.jsp.<JSP頁面在WEB應用程式內的目錄名> 。
JSP規範也沒有明確要求JSP中的指令碼程式程式碼必須採用Java語言,JSP中的指令碼程式程式碼可以採用Java語言之外的其他指令碼語言來編寫,但是,JSP頁面最終必須轉換成Java Servlet程式。
可以在WEB應用程式正式釋出之前,將其中的所有JSP頁面預先編譯成Servlet程式。
分析JSP所生成的Servlet程式碼
JSP頁面翻譯成的Servlet繼承了org.apache.jasper.runtime.HttpJspBase類,HttpJspBase類是HttpServlet的一個子類,因此JSP頁面翻譯成的Servlet是HttpServlet的一個孫子類。HttpJspBase類實現了javax.servlet.jsp.HttpJspPage介面中的部分方法,因此,HttpJspBase類是抽象的。
SUN公司為JSP的WEB容器開發商和JSP頁面開發人員提供了一套專門應用於開發JSP程式的Java類,這套Java類被稱為JSP API。HttpJspPage介面和JspPage介面屬於JSP API,在HttpJspPage介面中只定義了一個_jspService方法,但它繼承了JspPage介面,JspPage介面中定義了兩個方法:jspInit()和jspDestroy()。
HttpJspBase的init方法呼叫了jspInit和_jspInit方法,destroy方法內部呼叫了jspDestroy和_jspDestroy方法,service方法內部呼叫了_jspService方法。在HttpJspBase中實現的init、service和destroy方法都被宣告成了final型別。
JSP頁面中的位於<% %>外面的每行和緊臨<%%>兩邊的每段文字被轉換成以這些文字作為引數的一條條out.write語句,JSP指令碼片斷(位於<%%>內的一段java程式碼)中的java程式碼被原封不動地搬移進了_jspService方法中的相應位置處,JSP表示式(位於<%=和%>之中的內容)則是被轉換成以其中的變數或表示式作為引數的out.print語句。
JSP的執行過程
JSP的執行過程主要可以分為以下幾點:
客戶端發出請求。
Web容器將JSP轉譯成Servlet原始碼。
Web容器將產生的原始碼進行編譯。
Web容器載入編譯後的程式碼並執行。
把執行結果響應至客戶端。
在這裡插入圖片描述


過程介紹
在這裡插入圖片描述

客戶端發出請求,請求為JSP,web容器就會找出相應的servlet進行處理
在這裡插入圖片描述
將servlet轉成位元組碼檔案
在這裡插入圖片描述
將位元組碼檔案載入到web容器裡
在這裡插入圖片描述
這時會在web容器裡建立例項
在這裡插入圖片描述
進行初始化
在這裡插入圖片描述
通過service接受請求
在這裡插入圖片描述
然後web容器會自動產生兩個物件servlet和service最後進行銷燬
在這裡插入圖片描述

JSP的執行過程:
(1)客戶端發出Request(請求);
(2)JSP Container將JSP轉譯成Servlet的原始碼;
(3)將產生的Servlet的原始碼經過編譯後,並載入到記憶體;
(4)把結果Response(響應)至客戶端。
一般人會認為JSP的執行效能會和Servlet相差很多,其實執行效能上的差別只是在第一次的執行。因為JSP在執行第一次後,會被編譯成Servlet檔案,即為xxx.class,當在重複呼叫執行時,就直接執行第一次所產生的Servlet,而不用在重新把JSP編譯成Servlet。因此,除了第一次的編譯會花較久的時間之外,之後JSP和Servlet的執行速度就幾乎相同了。
在執行JSP頁面時,通常可分為兩個時期:轉移時期和請求時期:
轉移時期:JSP頁面轉譯成Servlet類(將JSP頁面轉移為Servlet原始碼(.java))
請求時期:Servlet類執行後,響應結果至客戶端(將Servlet原始碼(.java)編譯成Servlet類(.class))
當JSP頁面在執行時,JSP Container會做檢查的工作,若發現JSP頁面有更新修改時,JSP Container才會再次編譯JSP為Servlet;JSP沒有更新時,就直接執行前面產生的Servlet