1. JSP的基本原理:
JSP本質是Servlet,當用戶向指定Servlet發送請求時,Servlet利用輸出流動態生成HTML頁面,包括每一個靜態的HTML標籤和所有在HTML頁面中出現的內容。
JSP在標準的HTML頁面中嵌入Java代碼,其靜態的部無須Java程序控制,只有那些需要從數據庫讀取或需要動態生成的頁面內容,才使用Java腳本控制。
JSP頁面的內容可分成以下兩部分:
- 靜態部分:標準的HTML標籤、靜態的頁面內容,這些內容與靜態HTML頁面相同。
- 動態部分:受Java程序控制的內容,這些內容由Java程序來動態生成
JSP頁面工作原理圖
根據上面的JSP頁面工作原理,可以得到以下4個結論:
- JSP文件必須在JSP服務器內運行
- JSP文件必須生成Servlet才能運行
- 每個JSP頁面的第一個訪問者速度很慢,因爲必須等待JSP編譯成Servlet
- JSP頁面的訪問者無須安裝任何客戶端,甚至不需要可以運行Java的運行環境,因爲JSP碳輸送到客戶端的是標準HTML頁面
2.JSP註釋
<%--註釋內容--%>
JSP的註釋是無法通過源代碼查看到的,不會被髮送到客戶端
3. JSP聲明
<!聲明部分>
JSP頁面的聲明部分將轉換成對應Servlet的成員變量或成員方法(全局變量)4. JSP表達式
<%=表達式%>
輸出表達式語法後不能有(分號);
5. JSP腳本
<%Java代碼%>
JSP腳本部分聲明的變量是局部變量,不能使用private、public等訪問控制符修飾,不可以使用static修飾
6.JSP的3個編譯指令
指令標籤不會產生任何內容輸出到網頁中,主要用於整個JSP頁面的相關信息- page:該指令是針對當前頁面的指令,通常位於JSP頁面的頂端,一個JSP頁面可以有多條page指令
- include:用於指定包含另一個頁面(靜態)
- taglib:用於定義和訪問自定義標籤
使用編譯指令的語法格式如下:
<%@編譯指令名 屬性名="屬性值"...%>
6.1 page指令
page指令各屬性的意義:
-
language:聲明當前JSP頁面使用的腳本語言的種類,默認爲Java語言
-
extends:指定JSP頁面編譯所產生的Java類所繼承的父類,或所實現的接口
-
import:用來導入包。默認導入的包有:java.lang.*、javax.servlet.*、java.servlet.jsp.*、java.servlet.http.*。
-
sesseion:設定這個JSP頁面是否需要HTTP Session。
-
buffer:指定輸出緩衝區的大小。輸出緩衝區的JSP內置對象:out用於緩存JSP頁面對客戶瀏覽器的輸出,默認值爲8KB,可以設置爲none,也可以設置爲其他值,單位爲KB
-
autoFlush:當前輸出緩衝區即將溢出時,是否需要強制輸出緩衝區的內容。
-
info:設置該JSP程序的信息,也可以看做其說明,可以通過Servlet.getSessionInfo()方法獲取該值。
-
errorPage:指定錯誤處理頁面。
-
isErrorPage:設置本JSP頁面是否爲錯誤處理程序。
-
contentType:用於設定生成網頁的文件格式和編碼字符集,即MIME類型的頁面字符集類型,默認的MIME類型是text/html;默認的字符集類型爲ISO-8859-1。
-
pageEncoding:指定生成網頁的編碼字符集。
6.2 include指令
include用於文件包含。被包含的文件中的所有內容都被原樣包含到該JSP頁面中,如果被包含文件中有代碼,將不被執行。incluse編譯指令的語法如下:
<%@include file="relativeURLSpec"%>
6.3 taglib指令
該指令用於加載用戶自定義標籤,其語法格式如下:
<%@taglib prefix="fix" uri="tagUriorDir"%>
prefix屬性:用於設置加載自定義標籤的前輟
uri屬性:用於指定自定義標籤的描述文件位置
7. JSP的7個動作指令
動作指令與編譯指令的區別:
編譯指令是通知Servlet引擎的處理消息,而動作指令是運行時的動作。編譯指令在JSP編譯成Servlet時起作用,而動作指令通常可替換成JSP腳本,它只是JSP腳本的標準化寫法。
JSP動作指令主要有如下7個:
-
jsp:forward:執行頁面轉向,將請求的處理轉發到下一個頁面。請求依然是一次請求,所以請求參數、請求屬性不會丟失。
-
jsp:param:用於傳遞參數,必須與其他支持參數的標籤一起使用。
-
jsp:include:用於動態引入一個JSP頁面。
-
jsp:plugin:用於下載JavaBean或Applet到客戶端。
-
jsp:useBean:創建一個JavaBean的實例。
-
jsp:setProperty:設置JavaBean實例的屬性值。
-
jsp:getProperty:輸出JavaBean實例的屬性值。
7.1 forward指令
格式如下:
<jsp:forward page="relativrURL|<%=expression%>"/>
或
<jsp:forward page="relativrURL|<%=expression%>">
<jsp:param name="" value=""/>
</jsp:forward>
7.2 include指令
格式如下:
<jsp:include page="relativrURL|<%=expression%>" flush="true"/>
或
<jsp:include page="relativrURL|<%=expression%>" flush="true"> <jsp:param name="" value=""/> </jsp:include>
flush屬性:指定輸出緩存是否轉移到導入文件中。
7.3 useBean、setProperty、getProperty指令
useBean的語法格式如下:
<jsp:useBean id="name" class="classname" scope="page|request|session|application"/>
setProperty的語法格式如下:
<jsp:setProperty name="BeanName" property="propertyName" value="value"/>
getProperty的語法格式如下:
<jsp:getProperty name="BeanName" property="property"/>
7.4 param指令
語法格式如下:
<jsp:param name="paramName" value="paramValue"/>
該指令與以下三個指令結合使用:
- jsp:include
- jsp:forward
- jsp:plugin
8. JSP腳本中的9個內置對象(都是Servelt API接口的實例)
9個內置對象依次如下:
-
application:javax.servlet.ServletContext的實例,該實例代表JSP所屬的Web應用本身,可用於JSP頁面或者在Servlet之間交換信息。
-
config:javax.servlet.ServletConfig的實例,該實例代表該JSP的配置信息。
-
exception:java.lang.Throwable的實例,該實例代表其他頁面中的異常和錯誤。只有當頁面是錯誤處理頁面,即編譯指令page的isErrorPage屬性爲true時,該對象纔可以使用。
-
out:java.servlet.jsp.JspWriter的實例,該實例代表JSP表面的輸出流,用於輸出內容,形成HTML頁面。
-
page:代表該頁面本身,通常沒有太大用處。也就是Servlet中的this,其類型就是生成的Servlet類,能用page的地方就可以用this。
-
pageContext:javax.servlet.jsp.PageContext的實例,該對象代表JSP頁面上下文,使用該對象可以訪問頁面中的共享數據。常用的方法有getServletContext()和getServeltConfig()等。
-
request:javax.servlet.http.HttpServletRequest的實例,該對象封裝了一次請求,客戶端的請求參數都被封裝在該對象裏。這是一常用的對象,獲取客戶端請求參數必須使用該對象
-
response:javax.servlet.http.HttpServletResponse的實例,代表服務器對客戶端的響應。
-
session:javax.servlet.http.HttpSession的實例,該對象代表一次會話。當客戶端瀏覽器與站點建立連接時,會話開始;當客戶端關閉瀏覽器時,會話結束。
application、session、request、page範圍區別:
-
application:對於整個Web應用有效,一是JSP、Servlet將數據放入application中,該數據將可以被該應用下其他所有JSP、Servlet訪問。
-
session:僅對一次會話有效,一是JSP、Servlet將數據放入session中,該數據將可以被本次會話其他所有JSP、Servlet訪問。
-
request:僅對本次請求有效,一是JSP、Servlet將數據放入request中,該數據將可以被該請求下其他所有JSP、Servlet訪問。
-
page:僅對當前頁面有效,一是JSP、Servlet將數據放入page中,該數據將只可以被當前頁面的JSP腳本、聲明部分訪問。