JSP 的技術原理
JSP 是Servlet 的擴充,在沒有JSP 之前,就已經出現了Servlet 技術。Servlet 是利用輸出資料流動態產生HTML 頁面,包括每一個HTML 標籤和每個在HTML 頁面中出現的內容。
由於包括大量的HTML 標籤、大量的靜態文本及格式等,導致Servlet 的開發效率極為低下。所有的表現邏輯,包括布局、色彩及映像等,都必須耦合在Java 代碼中,這的確讓人不勝其煩。JSP 的出現彌補了這種不足, JSP 通過在標準的HTML 頁面中插入Java 代碼,其靜態部分無須Java 程式控制,只有那些需要從資料庫讀取並根據程式動態產生資訊時,才使用Java 指令碼控制。從表面上看, JSP 頁面已經不再需要Java 類,似乎完全脫離了Java 物件導向的特徵。
事實上, JSP 是Servlet 的一種特殊形式,每個JSP 頁面就是一個Servlet 執行個體一-JSP 頁面由系統編譯成Servlet , Servlet 再負責響應使用者請求。JSP 其實也是Servlet 的一種簡化,使用JSP 時,其實還是使用Servlet ,因為Web 應用程式中的每個JSP 頁面都會由Servlet 容器產生對應的Servlet 。對於Tomcat 而言, JSP 頁面產生的Servlet 放在work 路徑對應的Web 應用程式下。
某個測試jsp頁面代碼:
<%
public int count;
out.println(count++);
%>
在瀏覽器中測試該頁面時,可以看到正常輸出了count 值,每重新整理一次, count 值將加1,同時也可以看到正常輸出了info 方法的傳回值。
開啟多個瀏覽器,甚至可以在不同的機器上開啟瀏覽器重新整理該頁面,發現每個用戶端count 值是完全連續的,所有的用戶端共用了同一個count 變數。這是因為: JSP 頁面
會編譯成一個Servlet 類,每個Servlet 在容器中只有一個執行個體:而在JSP 中聲明的變數是類的成員變數,成員變數只在建立執行個體時初始化,該變數的值將一直儲存,直到執行個體銷毀。