JSP,Java Server Pages(Java伺服器頁面)
JSP 簡介 什麼是Java Server Pages(Java伺服器頁面)? JSP全稱Java Server Pages,是一種動態網頁開發技術。它使用JSP標籤在HTML網頁中插入Java程式碼。標籤通常以<%開頭以%>結束。 JSP是一種Javaservlet(伺服器小程式),主要用於實現Javaweb應用程式的使用者介面部分。網頁開發者們通過結合HTML程式碼、XHTML程式碼、XML元素以及嵌入JSP操作和命令來編寫JSP。 JSP通過網頁表單獲取使用者輸入資料、訪問資料庫及其他資料來源,然後動態地建立網頁。 JSP標籤有多種功能,比如訪問資料庫、記錄使用者選擇資訊、訪問JavaBeans元件等,還可以在不同的網頁中傳遞控制資訊和共享資訊。 http:/ /www.iis7.com/b/plc/ 。。。 為什麼使用JSP? JSP程式與CGI(公共閘道器介面)程式有著相似的功能,但和CGI程式相比,JSP程式有如下優勢: -效能更加優越,因為JSP可以直接在HTML網頁中動態嵌入元素而不需要單獨引用CGI檔案。 -伺服器呼叫的是已經編譯好的JSP檔案,而不像CGI/Perl那樣必須先載入直譯器和目標指令碼。 -JSP基於Java Servlets API,因此,JSP擁有各種強大的企業級Java API,包括JDBC,JNDI,EJB,JAXP等等。 -JSP頁面可以與處理業務邏輯的servlets一起使用,這種模式被Java servlet 模板引擎所支援。 最後,JSP是Java EE不可或缺的一部分,是一個完整的企業級應用平臺。這意味著JSP可以用最簡單的方式來實現最複雜的應用。 。。。 JSP的優勢 以下列出了使用JSP帶來的其他好處: -與ASP相比:JSP有兩大優勢。首先,動態部分用Java編寫,而不是VB或其他MS專用語言,所以更加強大與易用。第二點就是JSP易於移植到非MS平臺上。 -與純 Servlets相比:JSP可以很方便的編寫或者修改HTML網頁而不用去面對大量的println語句。 -與SSI相比:SSI無法使用表單資料、無法進行資料庫連結。 -與JavaScript相比:雖然JavaScript可以在客戶端動態生成HTML,但是很難與伺服器互動,因此不能提供複雜的服務,比如訪問資料庫和影象處理等等。 -與靜態HTML相比:靜態HTML不包含動態資訊。 :::::::::::::::::::::::::::::::::::::::: JSP 開發環境搭建 JSP開發環境是您用來開發、測試和執行JSP程式的地方。 我們來搭建JSP開發環境,具體包括以下幾個步驟:
- 配置Java開發工具(JDK) 這一步涉及Java SDK的下載和PATH環境變數的配置。 您可以從Oracle公司的Java頁面中下載SDK:Java SE Downloads(JavaSE下載) JavaSDK下載完後,請按照給定的指示來安裝和配置SDK。最後,通過設定PATH和JAVA_HOME環境變數來指明包括java和javac的資料夾路徑,通常是java_install_dir/bin和java_install_dir。 假如您用的是Windows系統並且SDK的安裝目錄為C::\jdk1.5.0_20,那麼您就需要在 C:\autoexec.bat 檔案中新增以下兩行: set PATH=C:\jdk1.5.0_20\bin;%PATH% set JAVA_HOME=C:\jdk1.5.0_20 或者,在Windows NT/2000/XP下,您可以直接右擊我的電腦圖示,選擇屬性,然後高階,然後環境變數,接下來您就可以很方便地設定PATH變數並且確定退出就行了。 在Linux/Unix系統下,如果SDK的安裝目錄為/usr/local/jdk1.5.0_20並且使用的是C shell,那麼您就需要在.cshrc檔案中新增以下兩行: setenv PATH /usr/local/jdk1.5.0_20/bin:$PATH setenv JAVA_HOME /usr/local/jdk1.5.0_20 或者,假如您正在使用類似於Borland JBuilder、Eclipse、IntelliJ IDEA和Sun ONE Studio這樣的整合開發環境,可以試著編譯並執行一個簡單的程式來確定IDE(整合開發環境)是否已經知道 SDK的安裝目錄。
- 設定Web伺服器:Tomcat 目前,市場上有很多支援JSP和Servlets開發的Web伺服器。他們中的一些可以免費下載和使用,Tomcat就是其中之一。 Apache Tomcat是一個開源軟體,可作為獨立的伺服器來執行JSP和Servlets,也可以整合在 Apache Web Server中。以下是Tomcat的配置方法: 下載最新版本的Tomcat:http://tomcat.apache.org/。 下載完安裝檔案後,將壓縮檔案解壓到一個方便的地方,比如Windows下的C:\apache-tomcat-5.5.29目錄或者Linux/Unix下的/usr/local/apache-tomcat-5.5.29目錄,然後建立CATALINA_HOME環境變數指向這些目錄。 在Windows機器下,Tomcat可以通過執行以右命令來啟動:%CATALINA_HOME%\bin\startup.bat 或者 C:\apache-tomcat-5.5.29\bin\startup.bat 在Linux/Unix機器下,Tomcat可以通過執行以右命令來啟動:CATALINA_HOME/bin/shutdown.sh 或者 /usr/local/apache-tomcat-5.5.29/bin/shutdown.sh
- 設定CLASSPATH環境變數 由於servlets不是Java SE的一部分,所以您必須標示出servlet類的編譯器。 假如您用的是Windows機器,您需要在C:\autoexec.bat檔案中新增以下兩行: set CATALINA=C:\apache-tomcat-5.5.29 set CLASSPATH=%CATALINA%\common\lib\jsp-api.jar;%CLASSPATH% 或者,在Windows NT/2000/XP下,您只要右擊我的電腦,選擇屬性,然後點選高階,然後點選環境變數,接下來便可以設定CLASSPATH變數並且確定退出即可。 在Linux/Unix機器下,假如您使用的是C shell,那麼您就需要在.cshrc檔案中新增以下兩行: setenv CATALINA=/usr/local/apache-tomcat-5.5.29 setenv CLASSPATH CLASSPATH 注意:如果您的開發路徑是C:\JSPDev (Windows)或者 /usr/JSPDev (Linux/Unix),那麼您就需要將這些路徑新增進CLASSPATH變數中。 :::::::::::::::::::::::::::::::::::::::::::::::::::::: Eclipse JSP/Servlet 環境搭建 我們可以使用 Eclipse 來搭建 JSP 開發環境,首先我們分別下載一下軟體包: Eclipse J2EE:http://www.eclipse.org/downloads/ Tomcat:http://tomcat.apache.org/download-70.cgi 。。。 Tomcat 下載安裝 你可以根據你的系統下載對應的包(以下以Window系統為例): 注意目錄名不能有中文和空格。目錄介紹如下: bin:二進位制執行檔案。裡面最常用的檔案是startup.bat,如果是 Linux 或 Mac 系統啟動檔案為 startup.sh。 conf:配置目錄。裡面最核心的檔案是server.xml。可以在裡面改埠號等。預設埠號是8080,也就是說,此埠號不能被其他應用程式佔用。 lib:庫檔案。tomcat執行時需要的jar包所在的目錄 logs:日誌 temp:臨時產生的檔案,即快取 webapps:web的應用程式。web應用放置到此目錄下瀏覽器可以直接訪問 work:編譯以後的class檔案。 接著我們可以雙擊 startup.bat 啟動 Tomcat 這個時候,本地的伺服器就已經搭建起來了。如果想關閉伺服器,可以直接關閉上面的視窗,或者在裡面輸入Ctrl+C禁止服務。 接著我們在瀏覽器中輸入 http://localhost:8080/,表示tomcat安裝成功並且啟動起來了 :::::::::::::::::::::::::::::::::::::::::::::::: JSP 結構 網路伺服器需要一個JSP引擎,也就是一個容器來處理JSP頁面。容器負責截獲對JSP頁面的請求。本教程使用內嵌JSP容器的Apache來支援JSP開發。 JSP容器與Web伺服器協同合作,為JSP的正常執行提供必要的執行環境和其他服務,並且能夠正確識別專屬於JSP網頁的特殊元素。 。。。 JSP處理 以下步驟表明了Web伺服器是如何使用JSP來建立網頁的: -就像其他普通的網頁一樣,您的瀏覽器傳送一個HTTP請求給伺服器。 -Web伺服器識別出這是一個對JSP網頁的請求,並且將該請求傳遞給JSP引擎。通過使用URL或者.jsp檔案來完成。 -JSP引擎從磁碟中載入JSP檔案,然後將它們轉化為servlet。這種轉化只是簡單地將所有模板文字改用println()語句,並且將所有的JSP元素轉化成Java程式碼。 -JSP引擎將servlet編譯成可執行類,並且將原始請求傳遞給servlet引擎。 -Web伺服器的某元件將會呼叫servlet引擎,然後載入並執行servlet類。在執行過程中,servlet產生HTML格式的輸出並將其內嵌於HTTP response中上交給Web伺服器。 -Web伺服器以靜態HTML網頁的形式將HTTP response返回到您的瀏覽器中。 -最終,Web瀏覽器處理HTTP response中動態產生的HTML網頁,就好像在處理靜態網頁一樣。 一般情況下,JSP引擎會檢查JSP檔案對應的servlet是否已經存在,並且檢查JSP檔案的修改日期是否早於servlet。如果JSP檔案的修改日期早於對應的servlet,那麼容器就可以確定JSP檔案沒有被修改過並且servlet有效。這使得整個流程與其他指令碼語言(比如PHP)相比要高效快捷一些。 總的來說,JSP網頁就是用另一種方式來編寫servlet而不用成為Java程式設計高手。除了解釋階段外,JSP網頁幾乎可以被當成一個普通的servlet來對待。 ::::::::::::::::::::::::::::::::::::::::::::::: JSP 生命週期 理解JSP底層功能的關鍵就是去理解它們所遵守的生命週期。 JSP生命週期就是從建立到銷燬的整個過程,類似於servlet生命週期,區別在於JSP生命週期還包括將JSP檔案編譯成servlet。 以下是JSP生命週期中所走過的幾個階段: 編譯階段:servlet容器編譯servlet原始檔,生成servlet類 初始化階段:載入與JSP對應的servlet類,建立其例項,並呼叫它的初始化方法 執行階段:呼叫與JSP對應的servlet例項的服務方法 銷燬階段:呼叫與JSP對應的servlet例項的銷燬方法,然後銷燬servlet例項 。。。 JSP編譯 當瀏覽器請求JSP頁面時,JSP引擎會首先去檢查是否需要編譯這個檔案。如果這個檔案沒有被編譯過,或者在上次編譯後被更改過,則編譯這個JSP檔案。 編譯的過程包括三個步驟: 解析JSP檔案。 將JSP檔案轉為servlet。 編譯servlet。 。。。 JSP初始化 容器載入JSP檔案後,它會在為請求提供任何服務前呼叫jspInit()方法。如果您需要執行自定義的JSP初始化任務,複寫jspInit()方法就行了,就像下面這樣: public void jspInit(){ // 初始化程式碼 } 一般來講程式只初始化一次,servlet也是如此。通常情況下您可以在jspInit()方法中初始化資料庫連線、開啟檔案和建立查詢表。 。。。 JSP執行 這一階段描述了JSP生命週期中一切與請求相關的互動行為,直到被銷燬。 當JSP網頁完成初始化後,JSP引擎將會呼叫_jspService()方法。 _jspService()方法需要一個HttpServletRequest物件和一個HttpServletResponse物件作為它的引數,就像下面這樣: void _jspService(HttpServletRequest request,HttpServletResponse response) { // 服務端處理程式碼 } _jspService()方法在每個request中被呼叫一次並且負責產生與之相對應的response,並且它還負責產生所有7個HTTP方法的迴應,比如GET、POST、DELETE等等。 。。。 JSP清理 JSP生命週期的銷燬階段描述了當一個JSP網頁從容器中被移除時所發生的一切。 jspDestroy()方法在JSP中等價於servlet中的銷燬方法。當您需要執行任何清理工作時複寫jspDestroy()方法,比如釋放資料庫連線或者關閉資料夾等等。 jspDestroy()方法的格式如下: public void jspDestroy() { // 清理程式碼 } ::::::::::::::::::::::::::::::::::::::::: JSP 語法 。。。 指令碼程式 指令碼程式可以包含任意量的Java語句、變數、方法或表示式,只要它們在指令碼語言中是有效的。 指令碼程式的語法格式:<% 程式碼片段 %>或者,您也可以編寫與其等價的XML語句,就像下面這樣: jsp:scriptlet 程式碼片段 </jsp:scriptlet> 任何文字、HTML標籤、JSP元素必須寫在指令碼程式的外面。 注意:請確保Apache Tomcat已經安裝在C:\apache-tomcat-7.0.2目錄下並且執行環境已經正確設定。 將以上程式碼儲存在hello.jsp中,然後將它放置在 C:\apache-tomcat-7.0.2\webapps\ROOT目錄下,開啟瀏覽器並在位址列中輸入http://localhost:8080/hello.jsp。 。。。 JSP宣告 一個宣告語句可以宣告一個或多個變數、方法,供後面的Java程式碼使用。在JSP檔案中,您必須先宣告這些變數和方法然後才能使用它們。 JSP宣告的語法格式:<%! declaration; [ declaration; ]+ … %> 或者,您也可以編寫與其等價的XML語句,就像下面這樣: jsp:declaration 程式碼片段 </jsp:declaration> 。。。 JSP表示式 一個JSP表示式中包含的指令碼語言表示式,先被轉化成String,然後插入到表示式出現的地方。 由於表示式的值會被轉化成String,所以您可以在一個文字行中使用表示式而不用去管它是否是HTML標籤。 表示式元素中可以包含任何符合Java語言規範的表示式,但是不能使用分號來結束表示式。 JSP表示式的語法格式:<%= 表示式 %> 同樣,您也可以編寫與之等價的XML語句: jsp:expression 表示式 </jsp:expression> 。。。 JSP註釋 JSP註釋主要有兩個作用:為程式碼作註釋以及將某段程式碼註釋掉。 JSP註釋的語法格式:<%-- 這裡可以填寫 JSP 註釋 --%> 不同情況下使用註釋的語法規則: 語法 描述 <%-- 註釋 --%> JSP註釋,註釋內容不會被髮送至瀏覽器甚至不會被編譯
<% 代表靜態 <%常量 %> 代表靜態 %> 常量 ’ 在屬性中使用的單引號 " 在屬性中使用的雙引號 。。。 JSP指令 JSP指令用來設定與整個JSP頁面相關的屬性。 JSP指令語法格式: <%@ directive attribute=“value” %> 這裡有三種指令標籤: 指令 描述 <%@ page … %> 定義頁面的依賴屬性,比如指令碼語言、error頁面、快取需求等等 <%@ include … %> 包含其他檔案 <%@ taglib … %> 引入標籤庫的定義,可以是自定義標籤 。。。 JSP行為 JSP行為標籤使用XML語法結構來控制servlet引擎。它能夠動態插入一個檔案,重用JavaBean元件,引導使用者去另一個頁面,為Java外掛產生相關的HTML等等。 行為標籤只有一種語法格式,它嚴格遵守XML標準:<jsp:action_name attribute=“value” /> 行為標籤基本上是一些預先就定義好的函式,下面羅列出了一些可用的JSP行為標籤:: 語法 描述 jsp:include 用於在當前頁面中包含靜態或動態資源 jsp:useBean 尋找和初始化一個JavaBean元件 jsp:setProperty 設定 JavaBean元件的值 jsp:getProperty 將 JavaBean元件的值插入到 output中 jsp:forward 從一個JSP檔案向另一個檔案傳遞一個包含使用者請求的request物件 jsp:plugin 用於在生成的HTML頁面中包含Applet和JavaBean物件 jsp:element 動態建立一個XML元素 jsp:attribute 定義動態建立的XML元素的屬性 jsp:body 定義動態建立的XML元素的主體 jsp:text 用於封裝模板資料 。。。 JSP隱含物件 JSP支援九個自動定義的變數,江湖人稱隱含物件。這九個隱含物件的簡介見下表: 物件 描述 request HttpServletRequest類的例項 response HttpServletResponse類的例項 out PrintWriter類的例項,用於把結果輸出至網頁上 session HttpSession類的例項 application ServletContext類的例項,與應用上下文有關 config ServletConfig類的例項 pageContext PageContext類的例項,提供對JSP頁面所有物件以及名稱空間的訪問 page 類似於Java類中的this關鍵字 Exception Exception類的物件,代表發生錯誤的JSP頁面中對應的異常物件 。。。 控制流語句 JSP提供對Java語言的全面支援。您可以在JSP程式中使用Java API甚至建立Java程式碼塊,包括判斷語句和迴圈語句等等。 。。。 判斷語句 If…else塊 。。。 迴圈語句 在JSP程式中可以使用Java的三個基本迴圈型別:for,while,和 do…while。 。。。 JSP運算子 JSP支援所有Java邏輯和算術運算子。 下面羅列出了JSP常見運算子,優先順序從高到底: 類別 操作符 結合性 字尾 () [] . (點運算子) 左到右 一元 ++ - - ! ~ 右到左 可乘性 * / % 左到右 可加性 + - 左到右 移位 >> >>> << 左到右 關係 > >= < <= 左到右 相等/不等 == != 左到右 位與 & 左到右 位異或 ^ 左到右 位或 | 左到右 邏輯與 && 左到右 邏輯或 || 左到右 條件判斷 ?: 右到左 賦值 = += -= *= /= %= >>= <<= &= ^= |= 右到左 逗號 , 左到右 。。。 JSP常量 JSP語言定義了以下幾個常量: -布林值(boolean):true 和 false; -整型(int):與Java中的一樣; -浮點型(float):與Java中的一樣; -字串(string):以單引號或雙引號開始和結束; -Null:null。 ::::::::::::::::::::::::::::::::::: JSP 指令 JSP指令用來設定整個JSP頁面相關的屬性,如網頁的編碼方式和指令碼語言。 語法格式如右:<%@ directive attribute=“value” %> 指令可以有很多個屬性,它們以鍵值對的形式存在,並用逗號隔開。 JSP中的三種指令標籤: 指令 描述 <%@ page … %> 定義網頁依賴屬性,比如指令碼語言、error頁面、快取需求等等 <%@ include … %> 包含其他檔案 <%@ taglib … %> 引入標籤庫的定義 。。。 Page指令 Page指令為容器提供當前頁面的使用說明。一個JSP頁面可以包含多個page指令。 Page指令的語法格式:<%@ page attribute=“value” %> 等價的XML格式:<jsp:directive.page attribute=“value” /> 。。。 屬性 下面列出與Page指令相關的屬性: 屬性 描述 buffer 指定out物件使用緩衝區的大小 autoFlush 控制out物件的 快取區 contentType 指定當前JSP頁面的MIME型別和字元編碼 errorPage 指定當JSP頁面發生異常時需要轉向的錯誤處理頁面 isErrorPage 指定當前頁面是否可以作為另一個JSP頁面的錯誤處理頁面 extends 指定servlet從哪一個類繼承 import 匯入要使用的Java類 info 定義JSP頁面的描述資訊 isThreadSafe 指定對JSP頁面的訪問是否為執行緒安全 language 定義JSP頁面所用的指令碼語言,預設是Java session 指定JSP頁面是否使用session isELIgnored 指定是否執行EL表示式 isScriptingEnabled 確定指令碼元素能否被使用 。。。 Include指令 JSP可以通過include指令來包含其他檔案。被包含的檔案可以是JSP檔案、HTML檔案或文字檔案。包含的檔案就好像是該JSP檔案的一部分,會被同時編譯執行。 Include指令的語法格式如右:<%@ include file=“relative url” %> Include指令中的檔名實際上是一個相對的URL。如果您沒有給檔案關聯一個路徑,JSP編譯器預設在當前路徑下尋找。 等價的XML語法:<jsp:directive.include file=“relative url” /> 。。。 Taglib指令 JSP API允許使用者自定義標籤,一個自定義標籤庫就是自定義標籤的集合。 Taglib指令引入一個自定義標籤集合的定義,包括庫路徑、自定義標籤。 Taglib指令的語法:<%@ taglib uri=“uri” prefix=“prefixOfTag” %> uri屬性確定標籤庫的位置,prefix屬性指定標籤庫的字首。 等價的XML語法:<jsp:directive.taglib uri=“uri” prefix=“prefixOfTag” /> :::::::::::::::::::::::::::::::::::::: JSP 動作元素 與JSP指令元素不同的是,JSP動作元素在請求處理階段起作用。JSP動作元素是用XML語法寫成的。 利用JSP動作可以動態地插入檔案、重用JavaBean元件、把使用者重定向到另外的頁面、為Java外掛生成HTML程式碼。 動作元素只有一種語法,它符合XML標準:<jsp:action_name attribute=“value” /> 動作元素基本上都是預定義的函式,JSP規範定義了一系列的標準動作,它用JSP作為字首,可用的標準動作元素如下: 語法 描述 jsp:include 在頁面被請求的時候引入一個檔案。 jsp:useBean 尋找或者例項化一個JavaBean。 jsp:setProperty 設定JavaBean的屬性。 jsp:getProperty 輸出某個JavaBean的屬性。 jsp:forward 把請求轉到一個新的頁面。 jsp:plugin 根據瀏覽器型別為Java外掛生成OBJECT或EMBED標記。 jsp:element 定義動態XML元素 jsp:attribute 設定動態定義的XML元素屬性。 jsp:body 設定動態定義的XML元素內容。 jsp:text 在JSP頁面和文件中使用寫入文字的模板 。。。 常見的屬性 所有的動作要素都有兩個屬性:id屬性和scope屬性。 id屬性:id屬性是動作元素的唯一標識,可以在JSP頁面中引用。動作元素建立的id值可以通過PageContext來呼叫。 scope屬性:該屬性用於識別動作元素的生命週期。 id屬性和scope屬性有直接關係,scope屬性定義了相關聯id物件的壽命。 scope屬性有四個可能的值: (a) page, (b)request, ©session, 和 (d) application。 jsp:include動作元素 jsp:include動作元素用來包含靜態和動態的檔案。該動作把指定檔案插入正在生成的頁面。語法格式如右:<jsp:include page=“relative URL” flush=“true” /> 前面已經介紹過include指令,它是在JSP檔案被轉換成Servlet的時候引入檔案,而這裡的jsp:include動作不同,插入檔案的時間是在頁面被請求的時候。 以下是include動作相關的屬性列表。 屬性 描述 page 包含在頁面中的相對URL地址。 flush 布林屬性,定義在包含資源前是否重新整理快取區。 。。。 jsp:useBean動作元素 jsp:useBean動作用來裝載一個將在JSP頁面中使用的JavaBean。 這個功能非常有用,因為它使得我們既可以發揮Java元件重用的優勢,同時也避免了損失JSP區別於Servlet的方便性。 jsp:useBean動作最簡單的語法為:<jsp:useBean id=“name” class=“package.class” /> 在類載入後,我們既可以通過 jsp:setProperty 和 jsp:getProperty 動作來修改和檢索bean的屬性。 以下是useBean動作相關的屬性列表: 屬性 描述 class 指定Bean的完整包名。 type 指定將引用該物件變數的型別。 beanName 通過 java.beans.Beans 的 instantiate() 方法指定Bean的名字。 。。。 jsp:setProperty動作元素 jsp:setProperty用來設定已經例項化的Bean物件的屬性,有兩種用法。首先,你可以在jsp:useBean元素的外面(後面)使用jsp:setProperty,如下所示: <jsp:useBean id=“myName” … /> … <jsp:setProperty name=“myName” property=“someProperty” …/> 此時,不管jsp:useBean是找到了一個現有的Bean,還是新建立了一個Bean例項,jsp:setProperty都會執行。第二種用法是把jsp:setProperty放入jsp:useBean元素的內部 如下所示: <jsp:useBean id=“myName” … > … <jsp:setProperty name=“myName” property=“someProperty” …/> </jsp:useBean> 此時,jsp:setProperty只有在新建Bean例項時才會執行,如果是使用現有例項則不執行jsp:setProperty。