Download presentation
Presentation is loading. Please wait.
Published byがんま ちとく Modified 6年之前
1
第4章 JSP元素與隱含物件 4-1 JSP的腳本元素 4-2 JSP的指引元素 4-3 JSP的動作元素 4-4 JSP的隱含物件
4-5 Servlet相關的page和config物件 4-6 out物件的輸出與緩衝區處理 4-7 response物件的標頭和快取處理 4-8 物件範圍的變數存取
2
4-1 JSP的腳本元素 4-1-1 JSP腳本元素的基礎 4-1-2 Declarations元素 – 宣告變數
4-1-3 Declarations元素 – 宣告Java方法
3
4-1 JSP的腳本元素 JSP程式檔案的內容主要分為HTML標籤的範本本文和JSP元素兩大部分,如下所示:
範本本文(Template Text):這部分是直接送到客戶端瀏覽程式顯示的資料,主要是指靜態網頁內容的HTML標籤或一般文字內容,用來作為網頁內容的範本(因為我們是在HTML標籤中插入動態顯示的JSP元素)。 JSP元素(JSP Elements):JSP元素是JSP容器需要處理或翻譯成Servlet程式碼的部分,可以分為腳本元素(Scripting Elements)、指引元素(Directive Elements)和動作元素(Action Elements)三種。
4
4-1-1 JSP腳本元素的基礎-說明 JSP程式架構是為了方便我們開發Servlet程式,所以JSP程式需要翻譯成Servlet類別檔的程式碼,然後在Servlet容器編譯和執行,翻譯成的Servlet程式檔案是一個類別檔案,Resin是繼承自JavaPage類別,Tomcat是繼承自HttpJspBase類別,這兩個類別都實作Servlet介面。
5
4-1-1 JSP腳本元素的基礎-Servlet類別檔
JSP腳本元素(Scripting Elements)翻譯成Servlet類別檔的說明,如下所示: Expression和Scriptlets元素:Java程式碼片斷是翻譯成置於_jspService()方法之中的程式碼。 Declarations元素:翻譯成類別的實例變數和方法(或稱為物件屬性)。
6
4-1-1 JSP腳本元素的基礎-呼叫過程 Servlet類別的_jspService()方法並不能覆寫(Overridden),不過我們可以在Declarations元素宣告jspInit()和jspDestroy()方法來初始JSP和結束JSP的執行,如下圖所示:
7
4-1-1 JSP腳本元素的基礎-處理HTTP請求和回應
因為Servlet支援多執行緒,各執行緒的_jspService()方法都可以負責處理HTTP請求和回應,如下圖所示:
8
4-1-2 Declarations元素 – 宣告變數(說明)
JSP的Declarations元素是位在"<%!"和"%>"符號之間的程式碼,Declarations元素並不會產生輸出,其宣告的變數將翻譯成Servlet的實例變數,如下所示: <%! int pageCount = 0; %>
9
4-1-2 Declarations元素 – 宣告變數(範圍)
對比在Scriptlets元素宣告的變數,以Servlet類別檔來說,如下所示: Declarations元素宣告的變數:Servlet實例的全域變數,所有提出請求同一頁JSP程式的每位使用者都可以存取這些變數。 Scriptlets元素宣告的變數:_jspService()方法的區域變數,只有請求JSP程式的這位使用者可以存取此變數。
10
4-1-3 Declarations元素 – 宣告Java方法(說明)
JSP程式的Declarations元素還可以宣告Java方法(在Scriptlets元素不可以宣告方法,因為程式碼會轉換置於_jspService()方法),不過在使用上有一些限制,宣告的方法並不能直接存取本章後的JSP隱含物件,換句話說,我們只能用來建立JSP程式所需的一些工具函數。
11
4-1-3 Declarations元素 – 宣告Java方法(範例)
在Declarations元素宣告的方法是翻譯成Servlet的實例方法。例如:溫度轉換的convert()方法,如下所示: <%! double convert(double c) { double f; f = (9.0 * c) / ; return f; } %>
12
4-2 JSP的指引元素 4-2-1 page指引元素 4-2-2 include指引元素 4-2-3 taglib指引元素
13
4-2 JSP的指引元素 JSP指引元素可以提供JSP程式的特殊資訊給伺服端的JSP容器,JSP提供多種指引元素:page、include和taglib等,其語法格式,如下所示: directive attribute1="value1" attribute2="value2" ……… attributeN="valueN"%> directive是指引元素指令,attribute1~N是指令的屬性,如有多個請以空白字元分隔,value1~N是對應的屬性值。
14
4-2-1 page指引元素-說明1 page指引元素是指定JSP程式的相關處理資訊,提供屬性設定JSP容器的相關參數,如下表:
15
4-2-1 page指引元素-說明2
16
4-2-1 page指引元素-說明3
17
4-2-1 page指引元素-contentType屬性
page指引元素常用的屬性有contentType和import屬性,對於中文內容的網頁,JSP程式可以使用contentType屬性指定網頁編碼為中文Big5,如下所示: page contentType="text/html; charset=Big5"%> 指定網頁編碼為Big5一般來說可解決大部分中文亂碼的問題,如果網頁中仍然顯示中文亂碼,請更改charset為微軟中文編碼MS950,如下: page contentType="text/html; charset=MS950"%>
18
4-2-1 page指引元素-import屬性 雖然JSP程式在編譯時即預設匯入一些常用的Java套件,所以JSP程式可以建立陣列、執行字串處理和使用Math類別,如果不是預設匯入的套件,在使用前,JSP程式需要匯入所需的Java套件,例如:日期/時間的Date類別需要匯入java.util.*套件,如下所示: page import="java.util.*"%> 上述程式碼是JSP的指引元素page,使用import屬性匯入java.util.*套件,如此在JSP程式就可以使用Date類別建立Date物件,如下所示: Date today = new Date();
19
4-2-2 include指引元素 JSP的include指引元素可以在JSP程式插入其它檔案,這是在翻譯成Servlet階段進行的檔案插入,通常是使用在網站共通部分的導覽、表格、標題列、頁首或頁尾,以便網站擁有一致的網頁外觀。 include指引元素主要是用來取代SSI(Server Side Include)指令#include。例如:在首尾插入版權宣告的網頁,副檔名通常是.jspf、.jsf或.inc,如下所示:. include file="copyright.inc"%> include file="navigation.jsp"%>
20
4-2-3 taglib指引元素 JSP的taglib指引元素可以指定JSP程式使用的自訂標籤庫,標籤庫是用來定義自訂標籤(Custom Tags),這是JSP 1.1版新增的功能,可以讓JSP程式的開發者隱藏複雜的程式碼,直接使用自訂的XML標籤來執行相關功能,其基本語法如下所示: taglib uri="標籤庫的URI" prefix="標籤字首"%>
21
4-3 JSP的動作元素 4-3-1 JavaBeans的動作元素
4-3-2 <jsp:include>與<jsp:param>元素 4-3-3 <jsp:forward>與<jsp:param>元素 4-3-4 <jsp:plugin>、<jsp:params>和<jsp:fallback>元素
22
4-3 JSP的動作元素 JSP的動作元素在JSP 2.0版新增到二十多個,依版本和功能可以分為數種,如下所示:
標準動作元素(Standard Action Elements):標準動作元素是JSP 1.2版就存在的動作元素。 JSP文件(JSP Document)的動作元素:JSP文件的動作元素是用來建立XML格式的JSP程式,這是使用XHTML和JSP元素所建立的JSP程式。 標籤檔(Tag File)的動作元素:標籤檔的動作元素是只能在標籤檔使用的動作元素,這也是JSP 2.0版新增的元素。
23
4-3-1 JavaBeans的動作元素- <jsp:useBean>元素
JavaBeans的動作元素是用來存取JavaBeans元件,在這一節筆者只準備簡易說明其基本語法,詳細的使用說明請參閱第10章。 <jsp:useBean>動作元素可以在JSP程式宣告和初始化JavaBeans元件,其基本語法如下所示: <jsp:useBean id="name" class="package.class" scope="page"/> 上述元素屬性id是參考JavaBean的變數名稱,class屬性指定JavaBean的完整套件名稱,scope屬性指定物件範圍。
24
4-3-1 JavaBeans的動作元素- <jsp:setProperty>元素
<jsp:setProperty>動作元素可以指定JavaBean的屬性值,其基本語法如下所示: <jsp:setProperty name="beans_name" property="property_name" value="property_value"/> 上述元素屬性name是對應<jsp:useBean>元素載入JavaBeans的id屬性,property屬性是指定的屬性名稱,value是屬性值。
25
4-3-1 JavaBeans的動作元素- <jsp:getProperty>元素
<jsp:getProperty>動作元素可以取得JavaBean指定的屬性值,其基本語法如下所示: <jsp:getProperty name="beans_name" property="property_name"/> 上述元素屬性name是對應<jsp:useBean>元素載入JavaBeans的id屬性,property屬性是取得的屬性名稱。
26
4-3-2 <jsp:include>與<jsp:param>元素-說明
27
4-3-2 <jsp:include>與<jsp:param>元素-語法
<jsp:include page="relative URL | <%=Expression%>" flush="true | false"/> 上述<jsp.include>動作元素擁有2個屬性,page是相對路徑的URL網址或Expression元素,flush屬性值在JSP 1.2版前一定是true,2.0版可以是true或false,true表示當緩衝區已滿時,送出緩衝區內容。
28
4-3-2 <jsp:include>與<jsp:param>元素-傳遞參數
<jsp:include page="included.jsp" flush="true"> <jsp:param name="cols" value="6" /> <jsp:param name="rows" value="4" /> </jsp:include>
29
4-3-2 <jsp:include>與<jsp:param>元素-取得參數
<jsp:param>動作元素傳遞的參數是使用request隱含物件的getParameter()方法來取得參數值的字串,如下所示: int rows = Integer.parseInt( request.getParameter("rows")); int cols = Integer.parseInt( request.getParameter("cols")); 上述程式碼getParameter()方法的參數字串就是參數名稱,Integer.parseInt()是Math類別的類別方法,可以將字串轉換成整數。
30
4-3-3 <jsp:forward>與<jsp:param>元素
<jsp:forward>動作元素可以將網頁請求轉址到其它HTML文件或JSP程式,也就是任何合法的URL網址,其基本語法如下所示: <jsp:forward page="relative URL | <%=Expression%>"/> 同樣的,<jsp:forward>動作元素也可以使用<jsp:param>動作元素來傳遞參數,如下所示: <jsp:forward page="included.jsp"> <jsp:param name="cols" value="6" /> <jsp:param name="rows" value="4" /> </jsp:forward>
31
4-3-4 <jsp:plugin>、<jsp:params>和<jsp:fallback>元素-說明
<jsp:plugin>動作元素可以在瀏覽程式插入物件,通常是用來插入Java Applet或JavaBeans,相當於是HTML的<OBJECT>、<APPLET>或<EMBED>標籤。
32
4-3-4 <jsp:plugin>、<jsp:params>和<jsp:fallback>元素-語法
<jsp:plugin type="bean | applet" code="物件的檔案名稱路徑" codebase="物件的基礎路徑" align="對齊方式" archive="其它相關檔案的清單" height="顯示高度" hspace="水平間距" vspace="垂直間距" width="顯示寬度" jversion="JRE的版本" name="物件名稱" nspluginurl="Netscapte需要使用的Plugin下載位址" iepluginurl="IE需要使用的Plugin下載位址"> <jsp:params> <jsp:param name="參數名稱1" value="參數值1"/> ……….. <jsp:param name="參數名稱N" value="參數值N"/> </jsp:params> <jsp:fallback>瀏覽程式並不支援物件的顯示</jsp:fallback> </jsp:plugin>
33
4-3-4 <jsp:plugin>、<jsp:params>和<jsp:fallback>元素-範例
在JSP程式插入TestApplet.class的Java Applet,傳遞Inc和Offset參數,如下所示: <jsp:plugin type="applet" code="TestApplet.class" width="300" height="160"> <jsp:params> <jsp:param name="Inc" value="20"/> <jsp:param name="Offset" value="25"/> </jsp:params> <jsp:fallback>載入Java Applet失敗....</jsp:fallback> </jsp:plugin>
34
4-4 JSP的隱含物件 4-4-1 隱含物件(Implicit Objects) 4-4-2 物件範圍(Object Scope)
35
4-4-1 隱含物件-說明 在JSP 2.0版定義9種隱含物件(Implicit Objects) :application、session、page、pageContext、out、request、response、config和exception。 JSP的隱含物件可以直接在Expression和Scriptlets元素的Java程式碼使用,而不用自行建立這些物件,這是因為JSP程式在翻譯成Servlet類別檔時,_jspService()方法預設傳入隱含物件request和response參數,並且在方法開頭依序取得這些隱含物件的變數。
36
4-4-1 隱含物件-物件說明
37
4-4-2 物件範圍-說明 JSP程式的物件範圍(Object Scope)簡稱範圍(Scope),這是JSP組織Web應用程式各種資料(物件)的方法,大部分是指上一節建立的隱含物件或第5章的EL隱含物件。例如:有些物件屬於整個Web應用程式的Application範圍,有些物件是使用者專屬的Session範圍。 在JSP程式的物件可能是使用者以Java程式碼建立、JSP指引元素或動作元素等所建立的物件,例如:<jsp:include>和<jsp:forward>元素傳遞的參數就會建立request物件。
38
4-4-2 物件範圍-圖例 在JSP程式的物件依其生命周期(Life-Cycles)區分為四種物件範圍:Application、Session、Request和Page範圍,如下圖所示:
39
4-4-2 物件範圍-範圍說明1 Application範圍(Application Scope):Application範圍的物件只需屬於同一個Web應用程式的生命周期,直到卸除Web應用程式或JSP容器關機前的JSP程式都可以存取,這是最大的物件範圍。JSP的application隱含物件所建立的變數就屬於此範圍,關於Web應用程式的說明請參閱第8章。 Session範圍(Session Scope):Session範圍的物件只需屬於同一個交談期(Session)生命周期的JSP程式都可以存取。JSP的session隱含物件所建立的變數就是屬於此範圍,關於交談期的進一步說明請參閱第8章。
40
4-4-2 物件範圍-範圍說明2 Request範圍(Request Scope):HTTP請求所產生的物件,因為HTTP請求是從一頁JSP程式到另一個JSP程式(例如:<jsp:include>和<jsp:forward>動作元素),所以其生命周期可以跨越2頁JSP程式,之後就消失,除非持續使用HTTP請求,如此才能跨過多頁JSP程式。JSP的request隱含物件屬於此範圍。 Page範圍(Page Scope):在目前JSP程式所建立的物件,也只有目前JSP程式可以存取,這是最小的物件範圍。JSP的page、pageContext、response、out、config和exception隱含物件都屬於此範圍。
41
4-5 Servlet相關的page和config物件
42
4-5-1 page隱含物件 JSP的page隱含物件代表翻譯成Servlet類別檔的Servlet類別,在Tomcat伺服器是java.lang.Object類別的物件,Resin伺服器是javax.servlet.Servlet類別的物件。 在JSP程式很少會直接使用page物件,我們通常只會使用page物件的getServletInfo()方法來取得page指引元素的info屬性值,如下所示: <%= page.getServletInfo() %>
43
4-5-2 config隱含物件-說明 JSP的config隱含物件可以取得JSP程式轉換成Servlet初始資訊的相關參數,屬於javax.servlet.ServletConfig類別的物件。 目前JSP程式並沒有辦法直接取得Servlet初始資訊的相關參數,除非先編譯JSP程式成為Servlet,然後將它註冊成為Servlet容器的Servlet程式。如此,編譯成Servlet的JSP程式才能夠取得Servlet初始資訊的參數。
44
4-5-2 config隱含物件-方法 config隱含物件的相關方法說明,如下表所示:
45
4-6 out物件的輸出與緩衝區處理-說明 JSP的out隱含物件是Java I/O輸出串流,這是javax.jsp.JspWriter物件,屬於page範圍,可以將資料輸出到客戶端瀏覽程式顯示和執行緩衝區處理。
46
4-6 out物件的輸出與緩衝區處理-輸出 out物件可以將資料輸出到客戶端瀏覽程式顯示,即之前在JSP程式使用的print()和println()方法,其說明如下所示:
47
4-6 out物件的輸出與緩衝區處理-緩衝區處理(說明)
out物件另一項功能是緩衝區處理,JSP容器在執行JSP程式碼時,可以選擇將處理的結果馬上輸出到客戶端的瀏覽程式顯示,或是先輸出到暫放的緩衝區,等到JSP程式執行完或緩衝區已滿,才送到瀏覽程式顯示,如下圖所示:
48
4-6 out物件的輸出與緩衝區處理-緩衝區處理(輸出內容)
JSP程式可以直接將輸出內容送到瀏覽程式顯示,或將輸出結果先輸出到緩衝區,當遇到下列情況才將輸出的內容送到瀏覽程式,如下所示: 執行完JSP程式後。 如果page指引元素的autoFlush屬性為true,當緩衝區已滿自動送出緩衝區內容。 執行到的out.close()方法關閉輸出串流時,此時已執行部分就會送出。 執行到out..flush()方法馬上將緩衝區的內容送出。
49
4-6 out物件的輸出與緩衝區處理-緩衝區處理(方法)
50
4-7 response物件的標頭和快取處理 4-7-1 使用Refresh標頭定時更新網頁
4-7-2 Cache-Control標頭的快取處理 4-7-3 轉址到其它的網頁或JSP程式 4-7-4 設定輸出文件的資料類型
51
4-7-1 使用Refresh標頭定時更新網頁 response.的setIntHeader()和setHeader()方法可以使用Refresh標頭來指定間隔時間,以便定時更新網頁內容,如下所示: response.setIntHeader("Refresh", 2); 如果想在一定的間隔時間後,轉址到其它網址或JSP程式,此時的第2個參數就是加上URL網址的字串,如下所示: response.setHeader("Refresh", "2;url=Ch4_1_3.jsp"); 上述第2個參數字串的url參數指定網址或其它JSP程式,在2秒後,就會自動轉址到此URL網址。
52
4-7-2 Cache-Control標頭的快取處理-說明
在客戶端電腦啟動瀏覽程式瀏覽網頁時,伺服端、客戶端電腦或Proxy伺服器都會將網頁內容保留在指定快取空間的資料夾或磁碟,以便加速網頁的瀏覽。 當客戶端重複瀏覽同一頁網頁時,瀏覽程式會先到客戶端和Proxy伺服器的快取找找看是否檔案已經存在,如果有,就直接由快取取出網頁內容,而不是每次都連結到伺服端快取或網站重新下載網頁內容,如此,可以節省下載檔案時間,提高網頁瀏覽的效率。
53
4-7-2 Cache-Control標頭的快取處理-設定
不過對於一些需要輸入保密資料的網頁,為了安全原因或是希望每次都連結網頁下載網頁內容,所以並不能將網頁內容保留在快取之中,或是只讓它保留一段指定的時間。JSP程式可以使用setHeader()方法指定Cache-Control標頭的快取處理,如下所示: response.setHeader("Cache-Control", "no-cache"); 上述程式碼指定Cache-Control標頭值為no-cache,也就是關閉快取功能,這是HTTP 1.1版支援的標頭。
54
4-7-2 Cache-Control標頭的快取處理-參數值
55
4-7-2 Cache-Control標頭的快取處理-另一種方法
JSP程式除了可以指定快取處理的參數外,我們還可以使用Expires標頭指定保留在快取的時間(max-age只適用在HTTP 1.1版),如下所示: response.setDateHeader("Expires", 0); 上述程式碼的第2個參數是保留在快取的毫秒數,0表示不保留在快取。
56
4-7-3 轉址到其它的網頁或JSP程式 轉址功能是指在執行JSP程式時,可以轉址到其它URL網址或網站的其它網頁或JSP程式。在response物件sendRedirect()方法的參數可以指定轉址的URL網址,如下所示: response.sendRedirect(“Ch4_1_2.jsp"); 上述程式碼轉址到同一個目錄的Ch4_1_2.jsp,參數可以是完整URL網址或同一個網站的相對路徑,也可以是HTML文件,如下所示: response.sendRedirect(" response.sendRedirect(“../Ch03/Ch3_2_1.jsp");
57
4-7-4 設定輸出文件的資料類型 JSP程式除了可以使用page指引元素的contentType屬性指定HTTP通訊協定傳送資料到瀏覽程式的MIME資料類型外,response物件的setContentType()方法也一樣可以指定MIME資料類型,如下所示: response.setContentType("text/xml"); 上述程式碼指定Content-type型態為text/xml,表示傳送的內容是XML文件。
58
4-8 物件範圍的變數存取-存取方法 在JSP物件範圍對應的request、session、application和pageContext物件都擁有的一組通用方法,可以存入和取出物件屬性,也就是儲存在物件的變數值,其相關方法的說明,如下表所示:
59
4-8 物件範圍的變數存取-建立範圍變數 在JSP程式可以使用pageContext、request、session和application隱含物件的setAttribute()方法來建立Page、Request、Session和Application物件範圍的變數,如下所示: pageContext.setAttribute("name", "陳會安"); request.setAttribute("name", "陳會安"); session.setAttribute("name", "陳會安"); application.setAttribute("name", "陳會安");
60
4-8 物件範圍的變數存取-取得變數值 同樣的,我們可以使用pageContext、request、session和application物件的getAttribute()方法取得各範圍的變數值,如下所示: Page範圍: <%=pageContext.getAttribute("name")%><br> Request範圍: <%=request.getAttribute("name")%><br> Session範圍: <%=session.getAttribute("name")%><br> Application範圍: <%=application.getAttribute("name")%><br>
Similar presentations