【JavaWeb-JSP】筆記彙總 --- JSP 規範;EL 表示式
JSP 規範:
JSP 規範介紹:
-
來自於 JAVAEE 規範中的一種
-
JSP 規範制定瞭如何開發 JSP 檔案代替響應物件將處理結果寫入到響應體的開發流程
-
JSP 規範制定了 Http 伺服器應該如何呼叫管理 JSP 檔案
響應物件存在弊端:
-
適合將資料量較少的處理結果寫入到響應體
-
如果處理結果數量過多,響應物件會增加開發難度
JSP 檔案優勢:
-
JSP 檔案在網際網路通訊過程,是響應物件的替代品
-
降低將處理結果寫入到響應體的開發工作量,降低處理結果維護難度
-
在 JSP 檔案開發時,可以直接將處理結果寫入到 JSP 檔案不需要手寫 print 命令,在 Http 伺服器呼叫 JSP 檔案時,根據 JSP 規範要求自動的將 JSP 檔案書寫的內容通過輸出流寫入到響應體
HTML 檔案與 JSP 檔案的區別:
-
資原始檔型別不同:HTML 檔案屬於靜態資原始檔,其相關命令需要瀏覽器編譯並執行;JSP檔案屬於動態資原始檔,其相關命令需要在服務端編譯並執行
-
呼叫形式不同:如果瀏覽器訪問 HTML 檔案,此時 Http 伺服器直接通過一個輸出流,將 HTML 檔案中所有的內容寫入到響應體;如果瀏覽器訪問 JSP 檔案。此時 Http 伺服器根據JSP 規範來操作 JSP 檔案【編輯---->編譯----->呼叫】
JSP 檔案運算原理
-
Tomcat 根據 JSP 規範,將被訪問的 JSP 檔案【編輯】為一個 java 檔案,這個 Java 檔案是 Servlet 介面實現類
(Tomcat 將 JSP 檔案編輯後生成的 Java 檔案,繼承於 HttpJspBase,通過 Apache 官方文件檢視其身份是 HttpServlet 的子類,所以 Tomcat 將 JSP 編輯為的檔案是一個 Servlet 介面實現類)
-
Tomcat 根據 JSP 規範,呼叫 JVM,將這個java檔案【編譯】為 class 型別
(Http伺服器【編輯】與【編譯】JSP 檔案的位置 --- work 資料夾)
-
Tomcat 根據 JSP 規範負責生成這個 class 檔案的例項物件,這個例項物件是一個 Servelt 介面例項物件
-
Tomcat 根據 JSP 規範通過例項物件呼叫 class 檔案中 _jspService 方法
-
_jspService 方法在執行時負責將 JSP檔案中書寫內容寫入到響應體中
_jspService 方法:
- 作用:當一個 JSP 檔案被訪問時,Tomcat 呼叫的並不是當前 JSP 檔案。而是 JSP 檔案對應的 Servlet介面 實現類中 _jspService 方法,_jspService 方法負責將開發人員在 JSP 檔案書寫的所有內容寫入到響應體中。
- 內部結構:【判斷當前請求方式】Jsp 檔案可以接收的請求方式有 POST,GET,HEAD
【宣告區域性變數】這些區域性變數都可以在 JSP 檔案開發時直接使用
【輸出部分】這部分執行時將 JSP 檔案內容通過輸出流寫入到響應體
在JSP檔案中如何書寫Java命令:
- 命令格式:
<%
這裡隨便寫 java 程式碼
%>
<%=java的變數名%>
<%=java的表示式%>
- 命令作用:通知 Http 伺服器將 JSP 檔案中 Java 命令與其他普通執行結果進行區分;通知Tomcat將輸出標記中【變數的值】或者輸出標記中【表示式運算結果】寫入到響應體
如何將 Servlet 中 doGet / doPost 方法執行結果交給 JSP 檔案輸出?
-
JSP 檔案被訪問時,並不是 JSP 檔案在執行。而是對應的 Servlet 在執行
-
自定義 Serlvet 介面實現類與 JSP 檔案之間的呼叫關係,等同於兩個 Servlet 之間的呼叫關係
-
自定義 Servelt 介面實現類與 JSP 檔案之間可以通過重定向方案或者請求轉發方案進行呼叫,考慮到執行效率問題,一般採用【請求轉發】
-
自定義 Servlet 介面實現類可以通過請求作用域物件將共享資料交給 JSP 來輸出到響應體
EL 表示式:
EL 工具包介紹:
-
由 Java 技術開發一個的 jar 包
-
作用:降低 JSP 檔案開發時 Java 命令開發強度
-
Tomcat 伺服器本身自帶了 EL 工具包
JSP檔案中主要開發步驟:
【將作用域中存放的處理結果讀取出來並寫入到響應體】
-
第一步:從指定的作用域物件讀取處理結果
-
第二步::將得到資料進行型別強轉
-
第三步::將轉換後的資料寫入到響應體
<%
String value = (String)request.getAttribute("key");
%>
<%=value%>
EL 表示式命令格式:
-
${作用域物件別名.共享資料名}
- 命令作用執行時從指定的【作用域物件】中讀取指定【共享資料】的內容並自動的寫入到響應體中
- EL 提供 . 和 [ ] 兩種運算子來導航資料。下列兩者所代表的意思是一樣的:
${sessionScope.user.sex}
${sessionScope.user["sex"]}
- . 和 [ ] 也可以同時混合使用,如下:
${sessionScope.shoppingCart[0].price}
- 當要存取的屬性名稱中包含一些特殊字元,如. 或 – 等並非字母或數字的符號,就一定要使用 [ ]
例如:${user.My-Name } //錯誤示範
${user["My-Name"] } //正確格式
- EL 表示式支援運算表示式:數學運算表示式 / 關係運算表示式 / 邏輯運算表示式
簡化版 EL 表示式:
- 命令格式:${作用域物件別名}
- 工作原理:由於在EL簡化版中沒有指定作用域物件別名,所以EL表示式採用"猜測演算法"
- 猜測演算法:首先到【pageContext】定位共享資料,如果定位成功讀取輸出並結束執行;
如果在【pageCotnext】沒有找到共享資料,到【request】定位共享資料,如果定位成功讀取輸出並結束執行;
如果在【request】沒有找到共享資料,到【session】定位共享資料,如果定位成功讀取輸出並結束執行;
如果在【session】沒有找到共享資料,到【application】定位共享資料,如果定位成功讀取輸出並結束執行;
如果在【application】沒有找到共享資料,此時返回 null。
- 弊端:增加程式執行時間;可能導致定位資料錯誤。
- 使用場景:簡化版設計之初就是為了從當前頁作用域物件讀取資料並輸出,所以從 request,session,application 讀取資料並輸出時應該避免使用簡化版。
EL 表示式將引用型別資料型別的屬性輸出:
- 命令格式:${作用域物件別名.共享資料名.屬性名}
- 命令作用:從作用域物件讀取到指定的引用變數,並將引用變數中指定屬性內容寫入到響應體