一、引入
JSP(Java Server Pages):以Java語言爲基礎的動態網頁開發技術。在html代碼中嵌套Java代碼。JSP的目的是將數據處理與頁面顯示分離。
二、工作原理
當一個JSP頁面被第一次請求是,服務器首先將JSP文件轉換爲一個實現了HttpServlet接口的Java源代碼,然後編譯該Java源代碼,生成.class 的字節碼文件,之後服務器將class文件加載到內存。然後服務器會創建該Servlet的實例,對該JSP頁面的請求會有該Servlet來完成響應。
JSP本質上還是一個Servlet
三、JSP語法
1、 腳本元素
(1)、聲明標籤
用途:成員變量和成員方法的聲明,聲明的變量是全局變量,聲明的方法將轉換爲Servlet的方法,此標籤中的內容在JSP引擎產生Servlet文件是直接拷貝到當前Servlet類中,Java類中可以放置的內容均可以放置在此處
<%!
private int num = 10;
public static String getName(){
return "jingxin";
}
public void print(){
System.out.println("hello");
}
%>
(2)、表達式標籤
用途:表達式的計算結果轉換成字符串,使用隱含對象out進行輸出,結果顯示在頁面中標籤所在的位置,等價於out.print(表達式)
<%= num1+num2 %>
(3)、代碼塊標籤
用途:一個JSP頁面可以有許多代碼塊,這些代碼塊將被JSP服務器按照順序執行,JSP引擎會將此標籤中的內容直接拷貝到Servlet的service方法中,此標籤中只能放置可以在一個方法中放置的內容,聲明的變量是局部變量,不能定義方法
<%
int a = 100;
out.print(a);
out.print(getName());
this.method();
%>
2、JSP註釋
JSP有兩種註釋
(1)、JSP註釋
註釋內容不會被髮送至瀏覽器甚至不會被編譯
<%--註釋 --%>
(2)、HTML註釋
通過瀏覽器查看源代碼時可以看見註釋內容
<!-- 註釋 -->
四、JSP指令
(一)、作用
配置頁面信息,提供給JSP引擎生成Java代碼
(二)、格式
指令可以放置在JSP頁面的任何位置,但建議放在頁面頭部
<%@ 指令名 attribute="value" %>
(三)、page 指令
定義網頁依賴屬性,比如腳本語言、error頁面、緩存需求等等。
1. pageEncoding:JSP頁面的字符編碼,優先權高於contentType
<%@page pageEncoding="utf-8"%>
2. contentType: 配置當前頁面的MIME類型和字符編碼
<%@page contentType="text/html; charset=utf-8" %>
3. import:用來導入Java的包或類,多個包之間用”,”分隔,也可寫多條指令
<%@page import="java.util.Date,java.sql.*,java.io.File"%>
4. language:定義當前JSP頁面所使用的腳本語言,默認爲Java
<%@page language="java" %>
5. info:確定當前頁面的描述信息,getServletInfo()方法的返回信息
<%@page info="my first jsp" %>
6. session:確定當前頁面是否使用session,默認值爲true,當值爲false時,如果在當前頁面中使用了session對象,則會拋出異常
<%@page session="true" %>
7. extends:指定servlet從哪一個類繼承,默認值爲HttpJspBase,一般不使用
<%@page extends="com.manongsushe.JSPDemo" %>
8. isErrorPage:指定當前頁面是否可以作爲另一個JSP頁面的錯誤處理頁面,默認值爲false,只有當值爲true時,纔可以使用exception的內置對象
<%@page isErrorPage="true" %>
9. errorPage:指定當JSP頁面發生異常時需要轉向的錯誤處理頁面
<%@page errorPage="error.jsp" %>
10. buffer:指定out對象使用緩衝區的大小,默認爲8KB
<%@page buffer="8kb" %>
11. autoFlush:表示是否自動刷新緩衝區,true表示自動刷新,若設置爲false,需要手動編碼刷新,默認值爲true
<%@page autoFlush="true" %>
12. isThreadSafe:指定對JSP頁面的訪問是否爲線程安全,用來設置當前JSP頁面是否能夠同時響應超過一個以上的用戶請求,當值爲true時,是線程不安全的,可以有一個以上的用戶同時訪問,當值爲false時,同時只能有一個用戶訪問,Servlet類實現了一個標記接口SingleThreadModel
<%@page isThreadSafe="true" %>
13. isELIgnored:指定是否忽略EL表達式,默認值爲false,若爲true,則不執行JSP頁面中的EL表達式
<%@page isELIgnored="false" %>
(四)、include指令
JSP可以通過include指令來包含其他文件。被包含的文件可以是JSP文件、HTML文件或文本文件。包含的文件就好像是該JSP文件的一部分,會被同時編譯執行。被引入的文件可以有任意的拓展名。
<%@ include file="文件相對 url 地址" %>
(五)、Taglib指令
JSP API允許用戶自定義標籤,一個自定義標籤庫就是自定義標籤的集合。
Taglib指令引入一個自定義標籤集合的定義,包括庫路徑、自定義標籤。
<%@ taglib uri="uri" prefix="prefixOfTag" %>
uri:確定標籤庫的位置,prefix:指定標籤庫的前綴
五、JSP的九大內置對象
- pageContext
類型:PageContext
作用:當前JSP頁面的上下文對象,管理當前JSP頁面的,域對象之一,具有其他隱式對象的引用,可以爲其他域對象設置值,也可進行全域查找。
作用範圍:當前JSP頁面 - request
類型:HttpServletRequest
作用:封裝請求信息,域對象之一
作用範圍:一次請求 - session
類型:HttpSession
作用:域對象之一
作用範圍:一次會話 - application
類型:ServletContext
作用:域對象之一
作用範圍:整個Web應用 - config
類型:ServletConfig
作用:當前Servlet的配置信息(初始化參數) - response
類型:HttpServletResponse
作用:封裝響應信息,由於JSP已經使用了Writer,所以不能利用response。getO utputStream()獲得字節輸出流,只能使用response.getWriter(); - exception
類型:Throwable
作用:錯誤頁面中獲得異常信息,只有錯誤頁面才能使用這個對象 - out
類型:JSPWriter
作用:用來向瀏覽器輸出信息,是字符流 - page
類型:Object
作用:當前類的引用(this)
六、JSP常用標籤
只要支持JSP文件,常用標籤就可以直接使用
1、jsp:forward
完成頁面轉發
page 屬性指定轉發的資源
內部可以使用標籤設置請求參數
<jsp:forward page="forward.jsp">
<jsp:param value="張三" name="name"/>
</jsp:forward>
注意:
被forward轉發的資源必須與發送請求的頁面處於相同的上下文環境中,每當遇到此標籤時,容器就會停止執行當前的JSP,轉而執行被轉發的資源
2、jsp:include
完成在當前JSP頁面的執行期間引入被引入資源的輸出內容,當前JSP頁面與被動態引入的資源是兩個彼此獨立的執行實體,被動態引入的資源必須是一個能夠獨立被web容器調用和執行的資源。
內部同樣可以使用標籤設置請求參數
<jsp:include page="include.jsp">
<jsp:param value="張三" name="name"/>
</jsp:include>