JSP的基本原理
JSP的本質是Servlet,用戶向指定的Servlet發送請求時,Servlet利用輸出流動態生成和TML界面,包括每一個HTML標籤和所有在其中顯式的內容
JSP通過在標準的和TML頁面中潛入JAVA代碼,其靜態部分無需Java程序控制,只有那些需要從數據庫讀取或需要動態生成的界面內容,才使用Java腳本控制
組成:
靜態部分:標準的和TML標籤、靜態的界面內容
動態部分:受Java程序控制的內容,由Java程序來動態生成
每個JSP頁面就是Servlet一個實例,JSP界面由系統編譯成Servlet,Servlet再相應用戶的請求。
證據:在Tomcat啓動後,可以在work\Catalina\localhost\應用名\org\apache\jsp目錄下找到,test_jsp.java和test_jsp.class
進入源代碼
可以看到其中包含了init初始化方法、destory銷燬方法和_jspService響應方法
其中定義了PageContext pagecontext、HttpSession session、ServletContext application、ServletConfig config、JspWriter out、Object page等JSP內置對象
當然還有參數中的HttpServletRequest request和HttpServletResponse對象, 除此對象exception有被throw,IOException、ServletException;
從客戶端訪問到返回結果流程:
Client訪問JSP---》如果是第一次,則JSP編譯爲Servlet;如果JSP界面對應的Servlet已經存在,則根據請求動態生成HTML界面---》返回標準的HTML界面
根據JSP的工作原理,可以得出結論
1.JSP文件必須在JSP服務器內部運行
2.JSP必須生成Servlet才能執行
3.每個JSP頁面的第一個訪問者速度會很慢,因爲需要等待JSP編譯成Sevlet
4.JSP界面的訪問者無需安裝任何客戶端,甚至不需要可以運行Java的運行環境,因爲JSP頁面輸送到客戶端的是標準HTML界面
JSP聲明
語法:<%聲明部分%>
從JSP對應Servlet源文件可以看出:聲明部分的代碼被轉換成對應Servlet的成員變量或方法
由此可知:JSP聲明部分定義的變量和方法可以使用private、public等控制符修飾,也可以用static,將其變成屬性和李誒方法。但不可使用abstract修飾
聲明部分的方法,因爲還湊餉方法導致JSP對應的Servlet變成抽象類,無法實例化
JSP腳本中可以防止任何可執行的語句,所以可以充分利用Java語言的功能,例如連接數據庫和執行數據庫操作
JSP的三個編譯指令
page:針對當前界面的指令
include:指定包含另一個界面
taglib:定義和訪問自定義標籤
page指令屬性
language:當前JSP界面使用的腳本語言的種類,該屬性通常是JAVA,默認也是JAVA,所以無需設置
extends:在JSP界面編譯所產生的JAVA類所集成的弗雷,或所實現的接口
import:導入包;默認導入包:java.lang.*、javax.servlet.*、javax.servlet.jsp.*、javax.servlet.http.*
session:設定這個JSP頁面是否需要HTTP Session
buffer:指定輸出緩衝區的大小。輸出緩衝區的JSP內部對象:
out用於緩存JSP頁面對客戶瀏覽器的輸出,默認值是8KB,可以設置爲none,也可以設置爲其他值,單位是KB
autoFlush:當輸出緩衝區即將溢出時,是否需要強制輸出緩衝區內容。爲true,則正常輸出;false,則拋出異常
info:設置該JSP程序的信息,也可以看作說明,可以通過Servlet.getServletInfo()方法獲取該值;在JSP中,直接調用getServletInfo();
errorPage:指定錯誤處理頁面。如果頁面產生了異常或錯誤,沒有對應處理碼,則跳轉到指定JSP
isErrorPage:設置本JSP界面是否爲錯誤處理程序。如果本身是錯誤處理界面,無需指定errorPage屬性
contentType:用於設定生成網頁的文件格式和編碼字符集
pageEncoding:指定網頁的編碼字符集
errorPage實際上是JSP的異常處理機制,JSP腳本不要求強制處理異常,即使該異常是checked異常
體外話:開發者都應該取消Internet選項---》高級---》顯式友好HTTP錯誤信息
include指令
include指令可以將一個外部文件潛入到當前JSP文件,同時解析這個界面的JSP語句
靜態的include指令,會把目標頁面的其他編譯指令也包含進來,融合成一個頁面,因此被包含的頁面甚至不需要是一個完整頁面
靜態指令:<%include file="scriptlet.jsp" %>
動態include指令則不會,如果被潛入的JSP經常改變,則使用<jsp:include>指令,這是動態的
注意:靜態include命令將目標頁面的其他編譯指令包含進來時,如果指令衝突,那麼頁面會報錯