JSP(Java server page)是Java EE規范最基本成員,他是Java Web開發的重點知識,雖然我們一直在用,但其原理知之甚少。今天重點研究一些JSP核心內容以及其工作原理。
JSP和Servlet的本質是一樣的,因為JSP最終需要編譯成Servlet才能運行,換句話說JSP是生成Servler的草稿文件。
JSP比較簡單,就是在HTML中嵌入Java代碼,或者使用JSP標簽,包括使用用戶自定義標簽,從而可以動態的提供內容。早起JSP應用比較廣泛,一個web應用可以全部由JSP頁面組成,只需要少量的JavaBean即可,但是這樣導致了JSP職責過於復雜,這是Java EE標准的出現無疑是雪中送炭,因此JSP慢慢發展成單一的表現技術,不再承擔業務邏輯組件以及持久層組件的責任。
JSP的本質是servlet,當用戶指定servlet發送請求時,servlet利用輸出流動態生成HTML頁面。由於包含大量的HTML標簽。靜態文本等格式導致servlet的開發效率極低,所有的表現邏輯,包括布局、色彩及圖像等,都必須耦合在Java代碼中,起靜態的部分無需Java程序控制,只有那些需要從數據庫讀取或者需要動態生成的頁面內容才使用Java腳本控制。
靜態部分:HTML標簽
動態部分:Java腳本
JSP注釋用於標注程序開發過程中的開發提示,不會輸出到客戶端。<%-- 注釋內容 --%>
JSP聲明用於聲明變量和方法,在JSP中聲明方法看起來很特別,似乎不需要定義類就可以直接定義方法,方法似乎可以脫離類獨立存在。實際上JSP聲明會轉換成servlet的成員變量或成員方法,因此JSP聲明仍然符合Java語法。<%! 聲明部分 %>
輸出JSP表達式
<%=表達式 %>
以前JSP應用非常廣泛,通俗點講任何可以執行的Java代碼都可以通過JSP腳本嵌入到HTML頁面中。<% Java腳本 %>
該指令是針對當前頁面的指令,通常位於JSP頁面的頂端,一個JSP頁面可以使用多條page指令。
用於指定包含另一個頁面的指令,使用include指令可以將一個外部文件嵌入到當前JSP文件中,同時解析這個頁面中的JSP。include即可以包含靜態文本,又可以包含動態JSP頁面。
用於定義和訪問自定義標簽。
用於將頁面響應轉發到另一個頁面,既可以轉發到靜態的HTML,也可以轉發到動態的JSP頁面,或者轉發到容器中的servlet。
用於執行參數,必須與其支持參數的標簽一起使用。本身不能單獨使用,因為單獨的param指令沒有實際意義。
用於動態引入一個JSP頁面,它是一個動態include指令,也用於包含某個頁面,不會導入被include頁面的編譯指令,僅僅將被導入頁面的body內容插入本頁面。
用於下載JavaBean或applet到客戶端執行。
創建一個JavaBean的實例
設置JavaBean實例的屬性值
輸出JavaBean實例的屬性值
javax.servlet.ServletContext的實例,該實例代表JSP所屬的web應用本身,可以用於JSP頁面,或者servlet之間交換信息。
javax.servlet.ServletConfig的實例,該實例代表JSP的配置信息
java.lang.Throwable的實例,該實例代表其他頁面中的異常和錯誤。
javax.servlet.jsp.JspWriter的實例,該實例代表JSP的輸出流,用於輸出內容,形成HTML頁面。
代表頁面本身,通常沒有太大用處。
javax.servlet.jsp.PageContext的實例。該對象代表JSP頁面的上下文,使用該對象可以訪問頁面中的共享數據。
javax.servlet.http.HttpServletRequest的實例,該對象封裝了一次請求,客戶端請求的參數都被封裝在這個對象裡。
javax.servlet.http.HttpServletResponse的實例,代表服務器對客戶端的響應,通常很少使用該對象直接響應,而是使用out對象,除非需要生成非字符響應。
javax.servlet.http.HttpSession的實例,該對象代表一次會話,當客戶端浏覽器與站點連接時,會話開始,當客戶端關閉浏覽器是會話結束。