JSP
目錄
簡介
JSP(JavaServer Pages)是由Sun Microsystems公司倡導、許多公司參與一起建立的一種動態網頁技術標準。JSP技術JSP有點類似ASP技術,它是在傳統的網頁HTML文件(*.htm,*.html)中插入Java程序段(Scriptlet)和JSP標記(tag),從而形成JSP文件(*.jsp)。
用JSP開發的Web應用是跨平台的,即能在Linux下運行,也能在其他操作系統上運行。
JSP技術使用Java編程語言編寫類XML的tags和scriptlets,來封裝產生動態網頁的處理邏輯。網頁還能通過tags和scriptlets訪問存在於服務端的資源的應用邏輯。JSP將網頁邏輯與網頁設計和顯示分離,支持可重用的基於組件的設計,使基於Web的應用程序的開發變得迅速和容易。
Web服務器在遇到訪問JSP網頁的請求時,首先執行其中的程序段,然後將執行結果連同JSP文件中的HTML代碼一起返回給客戶。插入的Java程序段可以操作數據庫、重新定向網頁等,以實現建立動態網頁所需要的功能。
JSP與Java Servlet一樣,是在服務器端執行的,通常返回該客戶端的就是一個HTML文本,因此客戶端只要有瀏覽器就能瀏覽。
JSP的1.0規範的最後版本是1999年9月推出的,12月又推出了1.1規範。目前較新的是JSP1.2規範,JSP2.0規範的徵求意見稿也已出台。
JSP頁面由HTML代碼和嵌入其中的Java代碼所組成。服務器在頁面被客戶端請求以後對這些Java代碼進行處理,然後將生成的HTML頁面返回給客戶端的瀏覽器。Java Servlet 是JSP的技術基礎,而且大型的Web應用程序的開發需要Java Servlet和JSP配合才能完成。JSP具備了Java技術的簡單易用,完全的面向對象,具有平台無關性且安全可靠,主要面向因特網的所有特點。
JSP技術的強勢
(1)一次編寫,到處運行。在這一點上Java比PHP更出色,除了系統之外,代JSP碼不用做任何更改。
(2)系統的多平台支持。基本上可以在所有平台上的任意環境中開發,在任意環境中進行系統部署,在任意環境中擴展。相比ASP/PHP的局限性是現而易見的。
(3)強大的可伸縮性。從只有一個小的Jar文件就可以運行Servlet/JSP,到由多台服務器進行集群和負載均衡,到多台Application進行事務處理,消息處理,一台服務器到無數台服務器,Java顯示了一個巨大的生命力。
(4)多樣化和功能強大的開發工具支持。這一點與ASP很像,Java已經有了許多非常優秀的開發工具,而且許多可以免費得到,並且其中許多已經可以順利的運行於多種平台之下。
JSP技術的弱勢
(1) 與ASP一樣,Java的一些優勢正是它致命的問題所在。正是由於為了跨平台的功能,為了極度的伸縮能力,所以極大的增加了產品的複雜性。
(2) Java的運行速度是用class常駐內存來完成的,所以它在一些情況下所使用的內存比起用戶數量來說確實是「最低性能價格比」了。從另一方面,它還需要硬盤空間來儲存一系列的.java文件和.class文件,以及對應的版本文件。
JSP六種內置對象
request, response, out, session, application, config, pagecontext, page, exception.
request對象:該對象封裝了用戶提交的信息,通過調用該對象相應的方法可以獲取封裝的信息,即使用該對象可以獲取用戶提交信JSP息。response對象: 對客戶的請求做出動態的響應,向客戶端發送數據。session對象:1.什麼是session:session對象是一個JSP內置對象,它在第一個JSP頁面被裝載時自動創建,完成會話期管理。從一個客戶打開瀏覽器並連接到服務器開始,到客戶關閉瀏覽器離開這個服務器結束,被稱為一個會話。當一個客戶訪問一個服務器時,可能會在這個服務器的幾個頁面之間反覆連接,反覆刷新一個頁面,服務器應當通過某種辦法知道這是同一個客戶,這就需要session對象。2.session對象的ID:當一個客戶首次訪問服務器上的一個JSP頁面時,JSP引擎產生一個session對象,同時分配一個String類型的ID號,JSP引擎同時將這個ID號發送到客戶端,存放在Cookie中,這樣session對象和客戶之間就建立了一一對應的關係。當客戶再訪問連接該服務器的其他頁面時,不再分配給客戶新的session對象,直到客戶關閉瀏覽器後,服務器端該客戶的session對象才取消,並且和客戶的會話對應關係消失。當客戶重新打開瀏覽器再連接到該服務器時,服務器為該客戶再創建一個新的session對象。aplication對象:1.什麼是application:服務器啟動後就產生了這個application對象,當客戶再所訪問的網站的各個頁面之間瀏覽時,這個application對象都是同一個,直到服務器關閉。但是與session不同的是,所有客戶的application對象都是同一個,即所有客戶共享這個內置的application對象。2.application對象常用方法:(1)public void setAttribute(String key,Object obj): 將參數Object指定的對象obj添加到application對象中,並為添加的對象指定一個索引關鍵字。(2)public Object getAttribute(String key): 獲取application對象中含有關鍵字的對象。out對象:out對象是一個輸出流,用來向客戶端輸出數據。out對象用於各種數據的輸出。Cookie:1.什麼是Cookie:Cookie是Web服務器保存在用戶硬盤上的一段文本。Cookie允許一個Web站點在用戶的電腦上保存信息並且隨後再取回它。舉例來說,一個Web站點可能會為每一個訪問者產生一個唯一的ID,然後以Cookie文件的形式保存在每個用戶的機器上。 如果您使用IE瀏覽器訪問Web,您會看到所有保存在您的硬盤上的Cookie。它們最常存放的地方是:c:windowscookies(在Window2000中則是C:Documents and Settings您的用戶名Cookies )Cookie是以「關鍵字key=值value「的格式來保存紀錄的.2.創建一個Cookie對象,調用Cookie對象的構造函數可以創建Cookie。Cookie對象的構造函數有兩個字符串參數:Cookie名字和Cookie值。 Cookie c=new Cookie(「username」,」john」);3. JSP中如果要將封裝好的Cookie對象傳送到客戶端,使用response的addCookie()方法。格式:response.addCookie(c)4.讀取保存到客戶端的Cookie,使用request對象的getCookies()方法,執行時將所有客戶端傳來的Cookie對象以數組的形式排列,如果要取出符合需要的Cookie對象,就需要循環比較數組內每個對象的關鍵字。
JSP動態網站開發技術
早期的動態網站開發技術使用的是CGI-BIN接口。開發人員編寫與接口相關的單獨的程序和基於Web的應用程序,後者通過Web服務器來調用前者。這種開發技術存在着嚴重的擴展性問題——每一個新的CGI程序要求在服務器上新增一個進程。如果多個用戶並發地訪問該程序,這些進程將耗盡該Web服務器所有的可用資源,直至其崩潰。 jsp應用測試如圖為克服這一弊端,微軟公司提出了Active Server Pages(ASP)技術,該技術利用「插件」和API簡化了Web應用程序的開發。ASP與CGI相比,其優點是可以包含HTML標籤,可以直接存取數據庫及使用無限擴充的ActiveX控件,因此在程序編制上更富有靈活性。但該技術基本上是局限於微軟的操作系統平台之上,主要工作環境是微軟的IIS應用程序結構,所以ASP技術不能很容易地實現跨平台的Web服務器程序開發。 Hypertext Preprocessor(超文本預處理器),即PHP動態網站開發技術與ASP相似,也是一種嵌入HTML文檔的服務器端腳本語言。其語法大部分與C、Java、Perl等語言相似,並形成了自己的獨有風格,利用該語言Web程序員可以快速地開發出動態網頁。PHP在大多數Unix平台、GUN/Linux和微軟Windows平台上均可以運行。PHP的優點主要有:安裝方便,學習過程簡單;數據庫連接方便,兼容性強;擴展性強;可以進行面向對象編程等。但PHP也存在一些弱點,主要是PHP是一種解釋型語言,不支持多線程結構,支持平台和連接的數據庫都有限,特別是在支持的標準方面存在先天不足,對於某些電子商務應用來說,PHP是不適合的。 還有一些技術,如Java Servlets技術,利用該技術可以很容易地用Java語言編寫交互式的服務器端代碼。一個Java Servlets就是一個基於Java技術的運行在服務器端的程序(與Applet不同,後者運行在瀏覽器端)。開發人員編寫這樣的Java Servlets,以接收來自Web瀏覽器的HTTP請求,動態地生成響應(可能需要查詢數據庫來完成這種請求),然後發送包含HTML或XML文檔的響應到瀏覽器。這種技術對於普通的頁面設計者來說要輕易地掌握是很困難的。採用這種方法,整個網頁必須都在Java Servlets中製作。如果開發人員或者Web管理人員想要調整頁面顯示,就不得不編輯並重新編譯該Java Servlets。 太陽微系統公司(Sun Microsystems Inc.)在Web服務器、應用服務器、交易系統以及開發工具供應商間廣泛支持與合作下,整合併平衡了已經存在的對Java編程環境(例如Java Servlets和JavaBeans)進行支持的技術和工具後產生了一種新的、開發基於Web應用程序的方法——JavaServer Pages技術(JSP)。這種動態網站開發技術主要有以下一些特點: 能夠在任何Web或應用程序服務器上運行; 分離了應用程序的邏輯和頁面顯示; 能夠進行快速的開發和測試; 簡化了開發基於Web的交互式應用程序的過程。
JSP的技術方法
為了快速方便地進行動態網站的開發,JSP在以下幾個方面做了改進,使其成為快速建立跨平台的動態網站的首選方案。 1.將內容的生成和顯示進行分離 用JSP技術,Web頁面開發人員可以使用HTML或者XML標識來設計和格式化最終頁面,並使用JSP標識或者小腳本來 JSP程序流程圖生成頁面上的動態內容(內容是根據請求變化的,例如請求賬戶信息或者特定的一瓶酒的價格等)。生成內容的邏輯被封裝在標識和JavaBeans組件中,並且捆綁在腳本中,所有的腳本在服務器端運行。由於核心邏輯被封裝在標識和JavaBeans中,所以Web管理人員和頁面設計者,能夠編輯和使用JSP頁面,而不影響內容的生成。 在服務器端,JSP引擎解釋JSP標識和腳本,生成所請求的內容(例如,通過訪問JavaBeans組件,使用JDBC技術訪問數據庫或者包含文件),並且將結果以HTML(或者XML)頁面的形式發送回瀏覽器。這既有助於作者保護自己的代碼,又能保證任何基於HTML的Web瀏覽器的完全可用性。 2.可重用組件 絕大多數JSP頁面依賴於可重用的、跨平台的組件(JavaBeans或者Enterprise JavaBeans組件)來執行應用程序所要求的複雜的處理。開發人員能夠共享和交換執行普通操作的組件,或者使得這些組件為更多的使用者和客戶團體所使用。基於組件的方法加速了總體開發過程,並且使得各種組織在他們現有的技能和優化結果的開發努力中得到平衡。 3.採用標識 Web頁面開發人員不會都是熟悉腳本語言的編程人員。JSP技術封裝了許多功能,這些功能是在易用的、與JSP相關的XML標識中進行動態內容生成所需要的。標準的JSP標識能夠訪問和實例化JavaBeans組件,設置或者檢索組件屬性,下載Applet,以及執行用其他方法更難於編碼和耗時的功能。 4.適應平台 幾乎所有平台都支持Java,JSP+JavaBeans幾乎可以在所有平台下通行無阻。從一個平台移植到另外一個平台,JSP和JavaBeans甚至不用重新編譯,因為Java字節碼都是標準的與平台無關的。 JSP視圖5.數據庫連接 Java中連接數據庫的技術是JDBC,Java程序通過JDBC驅動程序與數據庫相連,執行查詢、提取數據等操作。Sun公司還開發了JDBC-ODBC bridge,利用此技術Java程序可以訪問帶有ODBC驅動程序的數據庫,目前大多數數據庫系統都帶有ODBC驅動程序,所以Java程序能訪問諸如Oracle、Sybase、MS SQL Server和MS Access等數據庫。 此外,通過開發標識庫,JSP技術可以進一步擴展。第三方開發人員和其他人員可以為常用功能創建自己的標識庫。這使得Web頁面開發人員能夠使用熟悉的工具和如同標識一樣的執行特定功能的構件來進行工作。 JSP技術很容易整合到多種應用體系結構中,以利用現存的工具和技巧,並且能擴展到支持企業級的分布式應用中。作為採用Java技術家族的一部分,以及Java 2(企業版體系結構)的一個組成部分,JSP技術能夠支持高度複雜的基於Web的應用。 由於JSP頁面的內置腳本語言是基於Java的,而且所有的JSP頁面都被編譯成為Java Servlets,所以JSP頁面具有Java技術的所有好處,包括健壯的存儲管理和安全性。作為Java平台的一部分,JSP擁有Java編程語言「一次編寫,各處運行」的特點。
JSP的應用模型
利用JSP技術,動態信息由JSP頁面來表現,JSP頁面由安裝在Web服務器或者使用JSP的應用服務器上的JSP引擎執行。JSP引擎接受客戶端對JSP頁面的請求,並且生成JSP頁面作為對客戶端的響應。 JSP頁面通常被編譯成為Java Servlets,這是一個標準的Java擴展。頁面開發人員能夠訪問全部的Java應用環境,以利用Java技術的擴展性和可移植性。當JSP頁面第一次被調用時,如果它還不存在,就會被編譯成為一個Java Servlets類,並且存儲在服務器的內存中。這就使得在接下來的對該頁面的調用中,服務器會有非常快的響應(這避免了CGI-BIN為每個HTTP請求生成一個新的進程的問題)。 JSP頁面可以包含在多種不同的應用體系結構或者模型中,可以用於由不同協議、組件和格式所組成的聯合體中。基於JSP的動態信息發布技術是一個開放的、可擴展的建立動態Web頁面的標準。不論採用什麼創建工具,開發人員都可以使用JSP頁面來創建可移植的Web應用,在不同的Web應用服務器上運行。
JSP2.0的最新改進
JSP2.0版是對JSP1.2的升級,引入的最主要的新特性包括:1、一種簡單的表達式語言(ONGL),能夠用來容易地從JSP頁面訪問數據,這種表達式語言 簡化了基於JSP的不含腳本的應用程序的編寫,不需要使用Java Scriptlet或者Java表達 式; 2、用於直接使用JSP技術來定義可重用的自定義行為的新語法,該語法使用.tag和.tagx 文件,這類文件可由開發人員或者網頁作者編寫;
一. JSP表達式語言 - EL擴展表達式語言 在JSP2.0之前,網頁作者只能使用 表達式訪問系統的值,比如:"或者而表達式語言允許網頁作者使用簡單的語法訪問對象。比如要訪問一個簡單變量,可以 像下面這樣寫:
二. 簡單標誌庫擴展 _SimpleTag
在jsp1.2時代已經有標記庫了, 並且功能強大,但標記庫的編程和調用都比較複雜,導 致真正使用到WEB開發中的還是不多。JSP2.0推出的簡單標記庫擴展解決了以上的問題。 簡單標記庫相對JSP1.2中的標記庫來說,優點在於: 對後台程序員來說:結構更簡單,實現接口更少,可以輕鬆實現後台程序
JSP 2.0中加入了新的創建自製標記的API:javax.servlet.jsp.tagext.SimpleTag,該 API定義了用來實現簡單標記的接口。和JSP 1.2中的已有接口不同的是,SimpleTag接口 不使用doStartTag()和doEndTag()方法,而提供了一個簡單的doTag()方法。這個方法在 調用該標記時只被使用一次。而需要在一個自製標記中實現的所有邏輯過程、循環和對 標記體的評估等都在這個方法中實現。從這個方面來講,SimpleTag可以和IterationTag達到同等的作用。但SimpleTag的方法和處理周期要簡單得多。在SimpleTag中還有用來 設置JSP內容的setJspBody()和getJspBody()方法。Web容器會使用setJspBody()方法定 義一個代表JSP內容的JspFragment對象。實現SimpleTag標記的程序可以在doTag方法中 根據需要多次調用getJspBody().invoke()方法以處理JSP內容。 對於前台WEB頁面製作人員:在JSP1.2時代,Taglib頁面調用實際上是比較複雜的,SimpleTag+EL表達式語言極大的簡化了Taglib調用,真正達到不懂JAVA的人員也可以輕鬆編寫 JSP頁面的目的。
主要句法
一個JSP頁面可以被分為以下幾部分:
靜態數據
靜態數據在輸入文件中的內容和輸出給HTTP 響應的內容完全一致。此時,該JSP輸入文件會是一個沒有內嵌JAVA或動作的HTML頁面。而且,客戶端每次請求都會得到相同的響應內容。
JSP 指令
JSP指令控制JSP編譯器如何去生成 servlet,以下是可用的指令:
包含指令include – 包含指令通知JSP編譯器把另外一個文件完全包含入當前文件中。效果就好象被包含文件的內容直接被粘貼到當前文件中一樣。這個功能和C preprocessor所提供的很類似。被包含文件的擴展名一般都是 「jspf」 (即 JSP Fragment,JSP碎片);
頁面指令page – 頁面指令有以下幾個選項:
import 使一個JAVA導入聲明被插入到最終頁面文件。
contentType 規定了生成內容的類型。當生成非HTML內容或者當前字符集character set並非默認字符集時使用。
errorPage 處理HTTP請求時,如果出現異常則顯示該錯誤提示信息頁面。
isErrorPage 如果設置為TRUE,則表示當前文件是一個錯誤提示頁面。
isThreadSafe 表示最終生成的servlet 是否安全線程( thread safe)。
標籤庫指令taglib – 標籤庫指令描述了要使用的JSP標籤庫。該指令需要指定一個前綴prefix(和C++的命名空間很類似)和標籤庫的描述URI:;
JSP腳本元素和變量
標準腳本變量:以下是永遠可用的腳本變量:
out – JSPWriter用來寫入響應流的數據
page – servlet自身
pageContext – 一個 PageContext 實例包括和整個頁面相聯繫的數據,一個給定的HTML頁面可以在多個JSP之間傳遞。
request – HTTP request 對象
response – HTTP response 對象
session – HTTP session 對象,在多個請求之間追蹤一個客戶的信息。
腳本元素:有三個基本的腳本元素,作用是使JAVA代碼可以直接插入 servlet.
一種是聲明標籤,在JAVA SERVLET的類體中放入一個變量的定義。靜態的數據成員也可以如此定義。
一種是腳本標籤,在JAVA SERVLET的類的_jspService()方法中放入所包含的語句。
一種是表達式標籤,在JAVA SERVLET的類中放入待賦值的表達式,表達式注意不能以分號結尾。
JSP 動作
JSP動作是一系列可以調用內建於網絡服務器中的功能的XML標籤。JSP提供了以下動作:
jsp:include 和子過程類似,JAVA SERVLET暫時接管對其它指定的JSP頁的請求和響應。當處理完該JSP頁後就馬上把控制權交還當前JSP頁。這樣JSP代碼就可以在多個JSP頁中共享而不用複製。
jsp:param 可以在jsp:include, jsp:forward 或 jsp:params塊之間使用。指定一個將加入請求的當前參數組中的參數。
jsp:forward 用於處理對另一個JSP或SERVLET的請求和響應。控制權永遠不會交還給當前JSP頁。
jsp:plugin Netscape Navigator 的老版本和 Internet Explorer 使用不同的標籤以嵌入一個applet。這個動作產生為嵌入一個APPLET所需要的指定瀏覽器標籤。
jsp:fallback 如果瀏覽器不支持APPLETS則會顯示的內容。
jsp:getProperty 從指定的JavaBean。
jsp:setProperty 在指定的JavaBean中設置一個屬性值。
jsp:useBean 創建或者復用一個JavaBeans 變量到JSP頁。
JSP標籤庫
除了JSP預定義動作之外,開發者還可以使用JSP標籤擴展API添加他們自定義的動作。開發者寫一種實現一個標籤的界面和一個標籤庫的XML描述文件的JAVA類,這就能指定標籤和實現標籤的JAVA類。
與ASP的比較
JSP(Java Server Page)與ASP(Active Server Page)兩者都是常用的動態網頁技術,也都是可以嵌入HTML中的程序,但兩者是有着本質的不同,主要從以下幾個方面對其進行比較:
1.Web服務器的支持:大多數通用的 Web服務器如:Apache、Netscape和Microsoft IIS都支持JSP頁面,只有微軟本身的Microsoft IIS和Personal Web Server可以支持ASP。
2.平台的支持:JSP具有平台獨立性,只要是一般的Java程序可以運行的平台,都支持JSP程序。Windows平台可以很好的支持ASP,但ASP對於基於Win32逐漸模型的依賴,使得它難於一直到其它平台上。
3.組件模型:JSP是建立在可重用的、跨平台的組件(如:JavaBeans、Enterprises JavaBeans 和用戶定製的標籤庫等組件)之上的,而ASP使用的是基於Win32的COM組件模型。
4.腳本語言:JSP可以使用Java編程語言或JavaScript作為腳本語言,而ASP使用VBScript或Jscript作為腳本語言。
5.安全性:JSP使用Java安全模型,而ASP使用Windows NT的安全結構。
6.與Access數據庫的連接:JSP使用JDBC建立與Access數據庫的連接,而ASP對Access數據庫使用Data Active Objects。
7.用戶定製的標籤:JSP可以使用用戶定製標籤庫進行擴充,而ASP中沒有用戶定製標籤庫,ASP是不能擴充的。