JSP學習思維導圖
項目 PHP JAVA 可復用性 低 高 開發速度 快 慢 易維護性 差 優 可移植性 優-Linux Windows、Unix Unix 安全性 低 高 開發費用 低 高 多層架構 差 優 數據庫訪問 接口不統一 接口統一 可擴展性 差 優 面向對象 差 優
(1) 語言比較 PHP是解釋執行的服務器腳本語言,首先php有簡單容易上手的特點。語法和c語言比較象。 JSP需要先學好java的語法和熟悉一些核心的類庫,懂得面向對象的程序設計方法。所以java不如php好學。 Java首先要編譯成字節碼.class文件,然後在java虛擬機上解釋執行。Jsp可以通過servlet和JavaBean的支持產生強大的功能。JavaBean 是一種可復用的、跨平台的軟件組件。使用javabean可以方便的實現java代碼和html的分離,能夠增強系統的功能和軟件的復用性。 (2) 數據庫訪問比較 Java通過JDBC來訪問數據庫,通過不同的數據庫廠商提供的數據庫驅動方便地訪問數據庫。訪問數據庫的接口比較統一。 PHP對於不同的數據庫采用不同的數據庫訪問接口,所以數據庫訪問代碼的通用性不強。 (3) 系統設計架構比較 PHP只能實現簡單的分布式兩層或三層的架構,而JAVA在這方面就比較強大,可以實現多層的網絡架構。運用MVC的設計模式,可具有更加高效、合理的系統架構。使得系統在可拓展性、需求應變性上更好的適應,而且項目越復雜,其優勢越明顯。而且現在不同的層都已經有一些成熟的開發框架的支持。 采用Java的Web開發技術,需要使用的是面向對象的系統設計方法,而PHP還是采用面向過程的開發方法。 用Java進行開發前期需要做大量的系統分析和設計的工作。 (4) 跨平台性 Java和PHP都有很好的跨平台的特性。幾乎都可以在不作任何修改的情況下運行在Linux或者Windows等不同的操作系統上。 (5) 性能比較
JSP工作原理
JSP執行過程
WEB容器(Servlet引擎)接收到以.jsp為擴展名的URL的訪問請求時,它將把該訪問請求交給JSP引擎去處理。Tomcat中的JSP引擎就是一個Servlet程序,它負責解釋和執行JSP頁面,具體工作流程如下:
(1) 每個JSP 頁面在第一次被訪問時,JSP引擎將它翻譯成一個Servlet源程序,在轉換過程中如果發現JSP文件有語法錯誤,轉換過程將中斷,並向服務端和客戶端輸出出錯信息;
(2) 如果轉換成功,JSP引擎用javac把該Java源文件編譯成相應的.class文件並將該.class文件加載到內存中。
(3) 創建一個該Servlet的實例,並執行該實例的jspInit()方法(jspInit()方法在Servlet的生命周期中只被執行一次)。
(4) 創建並啟動一個新的線程,新線程調用實例的jspService()方法,Servlet容器會把浏覽器的請求和對浏覽器的回應封裝成HttpServletRequest和HttpServletResponse對象作為參數傳遞到jspService()方法中。(對於每一個請求,JSP引擎會創建一個新的線程來處理該請求。如果有多個客戶端同時請求該JSP文件,則JSP引擎會創建多個線程,每個客戶端請求對應一個線程)。
(5) jspService()方法執行後會將HTML內容返回給客戶端。
(6) 如果JSP文件被修改了,服務器將對該文件進行重新編譯。如果需要重新編譯,則將編譯結果取代內存中的Servlet,並繼續上述處理過程。 如果在任何時候由於系統資源不足,JSP引擎將以某種不確定的方式將Servlet從內存中移去。當這種情況發生時,先調用jspDestroy()方法, 然後Servlet實例便被標記加入“垃圾收集”處理。
(1) 內置對象特點
作用域 對象 request request session session page response、out、pageContext、config、page、exception application application、
JSP編譯指令是通知JSP引擎的消息,在將JSP編譯成 Servlet 時起作用,處理指令通常可替換成 Java腳本,是 JSP腳本的標准化寫法。它不直接生成輸出。編譯指令都有默認值。
語法格式:<%@ 編譯指令名 屬性名="屬性值"...%>
(1) page指令:該指令是針對當前頁面的指令,對整個頁面有效,主要用來設定一些參數,比如contentType,language等。
(2) include指令:用於指定包含另一個頁面(靜態包含),在進行jsp向servlet轉換之前,首先是將inclue file裡面的內容執行,然後再進行轉換,最終只會轉換成為一個單一的servlet。
(3) taglib指令:用於定義和訪問自定義標簽。
動作指令與編譯指令不間,編譯指令是通知 Servlet 引擎的處理消息,而動作指令只是運行時的腳本動作。
(1) forward指令:用於將頁面響應轉發給另外的頁面。既可以轉發給靜態的HTML頁面,也可以轉發到動態的JSP頁面,或者轉發到容器中的Servlet。
執行forward指令轉發請求時,客戶端的請求參數不會丟失。
執行forward指令轉發請求時,用戶請求的地址沒有發生變化,但頁面內容完全變為被forward目標頁的內容。
(2) include指令:是一個動態include指令,也用於導入某個頁面,它不會導入被include頁面的編譯指令,僅僅將被導入頁面的body內容插入本頁面。
靜態include和動態include的區別:靜態include是把父頁面和包含進來的頁面,代碼合並後,才一起翻譯成servlet,反饋到前台,形成一個HTML頁面(編譯是發生)。動態include是把父頁面和包含進來的頁面單獨編譯,單獨翻譯成servlet後,在前台拼成一個HTML頁面(請求時發生)。
(3) useBean指令:表示用來在JSP頁面中創建一個BEAN實例並指定它的名字以及作用范圍。
(4) getProperty指令:表示獲取BEAN的屬性的值並將之轉化為一個字符串,然後將其插入到輸出的頁面中。
(5) setProperty指令:表示用來設置Bean中的屬性值。
(6) plugin指令:表示執行一個applet或Bean,有可能的話還要下載一個Java插件用於執行它。
(7) param指令:用於設置參數值。
JSP的標簽函數庫主要分為五大類:
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>
函數標簽庫
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都是以${為起始、以}為結尾的。
EL 提供 . 和 [ ] 兩種運算符來導航數據。下列兩者所代表的意思是一樣的:${sessionScope.user.sex}等於${sessionScope.user["sex"]}
. 和 [ ] 也可以同時混合使用:${sessionScope.shoppingCart[0].price}