文章目錄
- 什麼是 jsp, 它有什麼用?
- jsp 的本質是什麼。
- jsp 頭部的 page 指令
- 表達式腳本(常用)
- 代碼腳本
- jsp 九大内置對象
- jsp 四大域對象
- jsp 中的 out 輸出和 response.getWriter 輸出的差別
- jsp 的常用标簽
- jsp 的常用标簽
- **jsp 動态包含**
- 動态包含的底層原理
- jsp 标簽-轉發
- JSP和Servlet是什麼關系?
- 如何實作JSP或Servlet的單線程模式?
什麼是 jsp, 它有什麼用?
- jsp 的全換是 java server pages。 Java 的伺服器頁面
- jsp 的主要作用是代替 Servlet 程式回傳 html 頁面的資料。
- 因為 Servlet 程式回傳 html 頁面資料是一件非常繁鎖的事情。 開發成本和維護成本都極高。
jsp 的本質是什麼。
jsp的本質是一個servlet程式
當我們第一次通路jsp頁面的時候,Tomcat伺服器會幫我們把jsp頁面翻譯成為一個java源檔案,并且對它進行編譯成為.class位元組碼程式,
跟蹤原代碼發現, HttpjspBase 類。 z直接繼承了HttpServlet類,也即是說,jsp 翻譯出來的 java 類, 它間接了繼承了 HttpServlet 類。 也就是說, 翻譯出來的是一個 Servlet 程式
總結: 通過翻譯的 java 源代碼我們就可以得到結果: jsp 就是 Servlet 程式
去觀察翻譯出來的 Servlet 程式的源代碼, 不難發現。 其底層實作, 也是通過輸出流。 把 html 頁面資料回傳給用戶端
[外鍊圖檔轉存失敗,源站可能有防盜鍊機制,建議将圖檔儲存下來直接上傳(img-MmlXWcKA-1613905972909)(tu/04-1.png)]
jsp 頭部的 page 指令
jsp 的 page 指令可以修改 jsp 頁面中一些重要的屬性, 或者行為。
i. language 屬性 表示 jsp 翻譯後是什麼語言檔案。暫時隻支援 java。
ii. contentType 屬性 表示 jsp 傳回的資料類型是什麼。也是源碼中 response.setContentType()參數值
iii. pageEncoding 屬性 表示目前 jsp 頁面檔案本身的字元集。
iv. import 屬性 跟java 源代碼中一樣。用于導包,導類。
====兩個屬性是給 out 輸出流使用
v. autoFlush 屬性 設定當 out 輸出流緩沖區滿了之後,是否自動重新整理沖級區。預設值是 true。
vi. buffer 屬性 設定out 緩沖區的大小。預設是 8kb out緩沖區滿了之後不能自動重新整理,就會報錯
vii. errorPage 屬性 設定當 jsp 頁面運作時出錯,自動跳轉去的錯誤頁面路徑。
<!--
errorPage 表示錯誤後自動跳轉去的路徑 <br/>
這個路徑一般都是以斜杠打頭,它表示請求位址為http://ip:port/工程路徑/
映射到代碼的Web 目錄
-->
viii. isErrorPage 屬性 設定目前 jsp 頁面是否是錯誤資訊頁面。預設是 false。如果是 true 可以
擷取異常資訊。
ix. session 屬性 設定通路目前 jsp 頁面,是否會建立HttpSession 對象。預設是 true。
x. extends 屬性 設定jsp 翻譯出來的java 類預設繼承誰。
viii. isErrorPage 屬性 設定目前 jsp 頁面是否是錯誤資訊頁面。預設是 false。如果是 true 可以
擷取異常資訊。
ix. session 屬性 設定通路目前 jsp 頁面,是否會建立HttpSession 對象。預設是 true。
x. extends 屬性 設定jsp 翻譯出來的java 類預設繼承誰。
表達式腳本(常用)
表達式腳本的格式是: <%=表達式%>
表達式腳本的作用是: 的 jsp 頁面上輸出資料。
表達式腳本的特點:
1、 所有的表達式腳本都會被翻譯到_jspService() 方法中
2、 表達式腳本都會被翻譯成為 out.print()輸出到頁面上
3、 由于表達式腳本翻譯的内容都在_jspService() 方法中,是以_jspService()方法中的對象都可以直接使用。
4、 表達式腳本中的表達式不能以分号結束。
代碼腳本
代碼腳本的格式是:
<%
java 語句
%>
腳本代碼的特點:
- 翻譯之後都在_jspService 方法中
- 翻譯到_jspService()方法中, 是以在_jspService() 方法中的現有對象都可以直接使用
- 還可以由多個代碼腳本組合完成一個完整的java語句
- 代碼腳本還可以和表達式腳本一起組合使用,子啊jsp頁面上輸出資料
jsp 九大内置對象
jsp中的内置對象,是指Tomcat在翻譯jsp頁面成為Servlet 源代碼後,内部提供的九大内置對象,叫内置對象。
request | 封裝用戶端的請求,其中包含來自GET或POST請求的參數; | 1 |
response | 封裝伺服器對用戶端的響應 | 2 |
pageContext | 通過該對象可以擷取其他對象 | 3 |
session | 封裝使用者會話的對象 | 4 |
application | 封裝伺服器運作環境的對象 | 5 |
out | 輸出伺服器響應的輸出流對象; | 6 |
config | Web應用的配置對象; | 7 |
page | JSP頁面本身(相當于Java程式中的this); | 8 |
exception | 封裝頁面抛出異常的對象。 | 9 |
jsp 四大域對象
1 | pageContext | (PageContextImpl 類) | 目前 jsp 頁面範圍内有效 |
2 | request | (HttpServletRequest 類) | 一次請求内有效….一個請求可能跨越多個頁面,涉及多個Web元件;需要在頁面顯示的臨時資料可以置于此作用域。 |
3 | session | (HttpSession 類) | 一個會話範圍内有效(打開浏覽器通路伺服器, 直到關閉浏覽器) |
4 | application | (ServletContext 類) | 整個 web 工程範圍内都有效(隻要 web 工程不停止, 資料都在) |
域對象是可以像 Map 一樣存取資料的對象。 四個域對象功能一樣。 不同的是它們對資料的存取範圍。
雖然四個域對象都可以存取資料。 在使用上它們是有優先順序的。
由小到大
pageContext == request ==session >>> application
jsp 中的 out 輸出和 response.getWriter 輸出的差別
response中表示響應:設定傳回給用戶端的内容(輸出)
out 也是給使用者做輸出使用的。
總結:
目前jsp頁面中所有代碼執行完成後會
- 執行out.flush()操作:會把out緩沖區的資料追加寫入到response緩沖區
- 會執行response的重新整理操作,把全部資料寫給用戶端
由于 jsp 翻譯之後, 底層源代碼都是使用 out 來進行輸出, 是以一般情況下。 我們在 jsp 頁面中統一使用 out 來進行輸出。 避免打亂頁面輸出内容的順序
out.write() 輸出字元串沒有問題
out.print() 輸出任意資料都沒有問題(都轉換成為字元串後調用的 write 輸出)
jsp 的常用标簽
jsp 的常用标簽
JSP靜态包含
<%@ include file="/include/footer.jsp"%>
<%--
<%@ include file=""%>
就是靜态包含
file 屬性指定你要包含的 jsp 頁面的路徑
位址中第一個斜杠 / 表示為 http://ip:port/工程路徑/ 映射到代碼的 web 目錄
靜态包含的特點:
1、 靜态包含不會翻譯被包含的 jsp 頁面。
2、 靜态包含其實是把被包含的 jsp 頁面的代碼拷貝到包含的位置執行輸出。
--%>
jsp 動态包含
<jsp:include page="/include/footer.jsp">
<jsp:param name="username" value="bbj"/>
<jsp:param name="password" value="root"/>
</jsp:include>
動态包含的特點:
- 1、 動态包含會把包含的 jsp 頁面也翻譯成為 java 代碼
- 2、 動态包含底層代碼使用如下代碼去調用被包含的 jsp 頁面執行輸出。
JspRuntimeLibrary.include(request, response, "/include/footer.jsp", out, false);
- 3、 動态包含, 還可以傳遞參數
動态包含的底層原理
jsp 标簽-轉發
<jsp:forward page="/scope2.jsp"></jsp:forward>
<%--
<jsp:forward page=""></jsp:forward> 是請求轉發标簽, 它的功能就是請求轉發
page 屬性設定請求轉發的路徑
--%>
JSP和Servlet是什麼關系?
Servlet是一個特殊的Java程式,它運作于伺服器的JVM中,能夠依靠伺服器的支援向浏覽器提供顯示内容,jsp的本質是Servlet的一種簡易形式,JSP會被伺服器處理成為一個類似Servlet的Java程式.可以簡化頁面内容的生成,
Servlet和JSP最主要的不同點在于
- servlet的應用邏輯是在java檔案中,并且完全從表示層中的HTML分離開來,而JSP的情況是Java和HTML可以組合成一個擴充名為.jsp的檔案。
- Servlet就是在Java中寫HTML,而JSP就是在HTML中寫Java代碼,當然這個說法是很片面且不夠準确的。JSP側重于視圖,Servlet更側重于控制邏輯,在MVC架構模式中,JSP适合充當視圖(view)而Servlet适合充當控制器(controller)。
如何實作JSP或Servlet的單線程模式?
對于JSP頁面,可以通過page指令進行設定。
<%@page isThreadSafe=”false”%>
對于Servlet,可以讓自定義的Servlet實作SingleThreadModel辨別接口。
SingleThreadModel