淺談JSP的那些事

  • JSP的底層原理

在說JSP的原理之前,先簡單介紹下JSP是怎麼回事?JSP全名Java Server Pages,中文名叫Java服務器頁面。爲什麼會有JSP技術,這還要從Servlet說起,當我們新建一個Servlet的時候,可以看到Servlet的doGet和doPost方法體中有響應的html片段代碼。也就是每一次瀏覽器請求HTML頁面的時候,需要在doGet和doPost中使用out.println()的方式將HTML頁面的內容輸出並返回給瀏覽器。

在Web開發最開始的時候,通常情況是美工將寫好的HTML靜態頁面發給Java程序員。Java程序員在Servlet中調用Service拿到數據後,逐句複製html靜態頁面上的html語句到Servlet中,並根據情況將後端的數據與html片段拼接在一起,然後就是重複的out.println("<span>用戶名:"+user.username+"</span>")的方式瘋狂輸出。

按這種方式,要想拼接數據並完整輸出一個html頁面,沒有上百千行的out.println()是不可能的。所以此時就引出了JSP。

我們可以直接在JSP文件裏寫HTML代碼,可以把它當做html文件。而且JSP中的HTML/CSS/JS等的寫法和HTML文件中的寫法是一模一樣的。但它畢竟不是HTML,而且本質上差了十萬八千里。JSP的本質上是一個Java類(Servlet),是在服務器上運行的,只不過它輸出的結果是Html。

Web容器接收到以.jsp爲擴展名的URL訪問請求時,它將把該請求交給JSP引擎處理。Tomcat中的JSP引擎就是一個Servlet程序,它負責解釋和執行JSP頁面。每個JSP頁面在第一次訪問時,JSP引擎將它翻譯成一個Servlet源程序,接着再把這個Servlet源程序編譯成Servlet的Class類文件,然後再由Web容器調用普通Servlet程序一樣的方式來裝載和解釋執行這個由JSP頁面翻譯成的Servlet程序。

瀏覽器請求服務器想要訪問某一個jsp文件,先在tomcat服務器安裝目錄下的“\work\Catalina\localhost”的文件下,先判斷是否已經存在翻譯成java和.class的字節碼文件,沒有就將JSP轉換成這兩個文件,java文件的底層其實就是Servlet對象的創建並使用,都是通過獲取response的輸出流,再依次將jsp中的html代碼依次寫出。

  • JSP的基本語法

腳本代碼塊。使用方式<% Java代碼塊 %>,兩個腳本代碼之間也可以嵌套Html標籤,比如帶有For循環的腳本代碼。其實腳本代碼都是在_jspService方法中原封不動輸出的Java代碼。

JSP的聲明。使用方式爲:<%! Java代碼 %>,JSP聲明中可以包括方法、變量等,這些都是放在_jspService()方法的同級下創建方法和變量。

JSP註釋。使用方式爲<%-- 註釋內容 --%>,JSP註釋不會再JSP頁面上顯示,Servlet中也不會存在,比較節約內存。

JSP Page指令:<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

靜態與冬天的包含。包含其實就是講其他的JSP引入到當前JSP文件中,將多個JSP的相同部分提煉出來,避免重複代碼的編寫。包含分靜態和動態,靜態包含只會生成一個Servlet,而動態包含會生成多個Servlet。

腳本表達式:<%=x>,就是具體的輸出某個參數,或者某個方法的返回的結果。

錯誤頁面:錯誤頁面是指在JSP中Java代碼執行出錯時,跳轉到出錯界面中去,使用的方法是:

  • JSP的內置對象

JSP的內置對象包括:Request、Response、Session、Page、ServletContext、ServletConfig、PageContext、Exception和JSPWriter。

 

 

這九大內置對象中的Request、Session、ServletContext、PageContext都是爲域對象。四個域對象也存在一個等級範圍,由小到大爲:PageContext ---Request---Session----ServletContext。

  • PageContext

pageContext是一個域對象,也可以獲取其他八大內置對象的應用(Exception需要設置爲錯誤頁面)。可以自己模擬實現一個PageContext對象。

首先PageContext是一個域對象,所以在PageContext中存在一個Map集合,而且由於PageContext是可以獲取到其他內置對象,所以在PageContext中都有其他內置對象的屬性。

提供一個PageContext的設計工廠返回PageContext對象。

 

防JspFactory

 

繼承HttpServlet。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章