JSP學習思維導圖一、什么是JSP? JSP(java Server Pages)是一種跨平臺的動態(tài)網(wǎng)頁技術(shù),在靜態(tài)網(wǎng)頁中嵌入JAVA代碼和JSP標記(tag),由Web服務器中的JSP引擎來進行編譯并執(zhí)行嵌入的JAVA代碼,生成頁面信息返回給客戶端。二、JSP的優(yōu)勢(1) JSP開發(fā)的Web應用是跨平臺的,即能在linux下運行,也能在其他操作系統(tǒng)上運行。(2) JSP將網(wǎng)頁邏輯與網(wǎng)頁設(shè)計和顯示分離,支持可重用的基于組件的設(shè)計,使基于Web的應用程序的開發(fā)變得迅速和容易。(3)JSP支持服務器端組件。JSP可以使用成熟的JAVA BEANS 組件來實現(xiàn)復雜商務功能。(4)JSP具有強大的可伸縮性。從只有一個小的.Jar文件就可以運行Servlet/JSP,到由多臺服務器進行集群和負載均衡,到多臺application進行事務處理,消息處理。(5)JSP標簽可擴充性。JSP技術(shù)允許開發(fā)者擴展JSP標簽,定制JSP標簽庫,所以網(wǎng)頁制作者充分利用與xml兼容的標簽技術(shù)強大的功能,大大減少對腳本語言的依賴.由于定制標簽技術(shù),使網(wǎng)頁制作者降低了制作網(wǎng)頁的復雜度。三、JSP的劣勢(1)正是由于為了跨平臺的功能,為了極度的伸縮能力,所以極大的增加了產(chǎn)品的復雜性。(2)java的高效率運行需要占用大量的內(nèi)存和硬盤空間. 一方面,java的高速運行是通過 .class文件常駐內(nèi)存來實現(xiàn)的.另一方面,還需要硬盤空間來存儲一系列的.java 文件和.class文件以及對應的版本文件。四、JSP與PHP的比較| 項目 | PHP | JAVA |
| 可復用性 | 低 | 高 |
| 開發(fā)速度 | 快 | 慢 |
| 易維護性 | 差 | 優(yōu) |
| 可移植性 | 優(yōu)-Linux | Windows、Unix |
| Unix安全性 | 低 | 高 |
| 開發(fā)費用 | 低 | 高 |
| 多層架構(gòu) | 差 | 優(yōu) |
| 數(shù)據(jù)庫訪問 | 接口不統(tǒng)一 | 接口統(tǒng)一 |
| 可擴展性 | 差 | 優(yōu) |
| 面向?qū)ο?/td> | 差 | 優(yōu) |

JSP工作原理
JSP執(zhí)行過程 WEB容器(Servlet引擎)接收到以.jsp為擴展名的URL的訪問請求時,它將把該訪問請求交給JSP引擎去處理。Tomcat中的JSP引擎就是一個Servlet程序,它負責解釋和執(zhí)行JSP頁面,具體工作流程如下:(1) 每個JSP頁面在第一次被訪問時,JSP引擎將它翻譯成一個Servlet源程序,在轉(zhuǎn)換過程中如果發(fā)現(xiàn)JSP文件有語法錯誤,轉(zhuǎn)換過程將中斷,并向服務端和客戶端輸出出錯信息;(2) 如果轉(zhuǎn)換成功,JSP引擎用javac把該Java源文件編譯成相應的.class文件并將該.class文件加載到內(nèi)存中。(3)創(chuàng)建一個該Servlet的實例,并執(zhí)行該實例的jspInit()方法(jspInit()方法在Servlet的生命周期中只被執(zhí)行一次)。(4)創(chuàng)建并啟動一個新的線程,新線程調(diào)用實例的jspService()方法,Servlet容器會把瀏覽器的請求和對瀏覽器的回應封裝成HttpServletRequest和HttpServletResponse對象作為參數(shù)傳遞到j(luò)spService()方法中。(對于每一個請求,JSP引擎會創(chuàng)建一個新的線程來處理該請求。如果有多個客戶端同時請求該JSP文件,則JSP引擎會創(chuàng)建多個線程,每個客戶端請求對應一個線程)。(5)jspService()方法執(zhí)行后會將HTML內(nèi)容返回給客戶端。
(6) 如果JSP文件被修改了,服務器將對該文件進行重新編譯。如果需要重新編譯,則將編譯結(jié)果取代內(nèi)存中的Servlet,并繼續(xù)上述處理過程。 如果在任何時候由于系統(tǒng)資源不足,JSP引擎將以某種不確定的方式將Servlet從內(nèi)存中移去。當這種情況發(fā)生時,先調(diào)用jspDestroy()方法, 然后Servlet實例便被標記加入“垃圾收集”處理。
六、JSP的九大內(nèi)置對象(1) 內(nèi)置對象特點
| 分類 | 對象 |
| 輸出輸入對象 | request、response、out |
| 通信控制對象 | pageContext、session、application |
| Servlet對象 | page、config |
| 錯誤處理對象 | exception |
| 作用域 | 對象 |
| request | request |
| session | session |
| page | response、out、pageContext、config、page、exception |
| application | application、 |
JSP編譯指令是通知JSP引擎的消息,在將JSP編譯成 Servlet 時起作用,處理指令通常可替換成 Java腳本,是 JSP腳本的標準化寫法。它不直接生成輸出。編譯指令都有默認值。
語法格式:<%@ 編譯指令名 屬性名="屬性值"...%>
(1) page指令:該指令是針對當前頁面的指令,對整個頁面有效,主要用來設(shè)定一些參數(shù),比如contentType,language等。
(2) include指令:用于指定包含另一個頁面(靜態(tài)包含),在進行jsp向servlet轉(zhuǎn)換之前,首先是將inclue file里面的內(nèi)容執(zhí)行,然后再進行轉(zhuǎn)換,最終只會轉(zhuǎn)換成為一個單一的servlet。
(3) taglib指令:用于定義和訪問自定義標簽。
八、JSP的七個動作指令動作指令與編譯指令不間,編譯指令是通知 Servlet 引擎的處理消息,而動作指令只是運行時的腳本動作。
(1)forward指令:用于將頁面響應轉(zhuǎn)發(fā)給另外的頁面。既可以轉(zhuǎn)發(fā)給靜態(tài)的HTML頁面,也可以轉(zhuǎn)發(fā)到動態(tài)的JSP頁面,或者轉(zhuǎn)發(fā)到容器中的Servlet。
執(zhí)行forward指令轉(zhuǎn)發(fā)請求時,客戶端的請求參數(shù)不會丟失。
執(zhí)行forward指令轉(zhuǎn)發(fā)請求時,用戶請求的地址沒有發(fā)生變化,但頁面內(nèi)容完全變?yōu)楸籪orward目標頁的內(nèi)容。
(2)include指令:是一個動態(tài)include指令,也用于導入某個頁面,它不會導入被include頁面的編譯指令,僅僅將被導入頁面的body內(nèi)容插入本頁面。
靜態(tài)include和動態(tài)include的區(qū)別:靜態(tài)include是把父頁面和包含進來的頁面,代碼合并后,才一起翻譯成servlet,反饋到前臺,形成一個HTML頁面(編譯是發(fā)生)。動態(tài)include是把父頁面和包含進來的頁面單獨編譯,單獨翻譯成servlet后,在前臺拼成一個HTML頁面(請求時發(fā)生)。
(3) useBean指令:表示用來在JSP頁面中創(chuàng)建一個BEAN實例并指定它的名字以及作用范圍。
(4) getPRoperty指令:表示獲取BEAN的屬性的值并將之轉(zhuǎn)化為一個字符串,然后將其插入到輸出的頁面中。
(5) setProperty指令:表示用來設(shè)置Bean中的屬性值。
(6) plugin指令:表示執(zhí)行一個applet或Bean,有可能的話還要下載一個Java插件用于執(zhí)行它。
(7)param指令:用于設(shè)置參數(shù)值。
九、JSP標準標簽庫:JSTLJSP的標簽函數(shù)庫主要分為五大類:
JSTL | 前置名稱 | URI | 范例 |
核心標簽庫 | c | http://java.sun.com/jsp/jstl/core | <c:out> |
I18N格式標簽庫 | fmt | http://java.sun.com/jsp/jstl/fmt | <fmt:formatDate> |
SQL標簽庫 | sql | http://java.sun.com/jsp/jstl/sql | <sql:query> |
XML標簽庫 | Xml | http://java.sun.com/jsp/jstl/xml | <x:forEach> |
函數(shù)標簽庫 | fn | http://java.sun.com/jsp/jstl/functions | <fn:split> |
核心標簽庫:
功能分類 | 標簽名稱 |
表達式操作 | out、set、remove、catch |
流程控制 | if、choose、when、otherwise |
迭代操作 | forEach、forTokens |
URL操作 | import、param、url、redirect |
所有EL都是以${為起始、以}為結(jié)尾的。
EL 提供 . 和 [ ] 兩種運算符來導航數(shù)據(jù)。下列兩者所代表的意思是一樣的:${sessionScope.user.sex}等于${sessionScope.user["sex"]}
. 和 [ ] 也可以同時混合使用:${sessionScope.shoppingCart[0].price}
新聞熱點
疑難解答
圖片精選