什么是jsp?
JSP(Java Server Pages)是指:
在HTML中嵌入Java腳本代碼
由應用服務器中的JSP引擎來編譯和執行嵌入的Java腳本代碼
然后將生成的整個頁面信息返回給客戶端
Jsp和html的區別:jsp動態網頁,可以傳遞數據html:靜態網頁,獲取不到數據
JSP執行過程
web容器處理JSP文件請求需要經過3個階段:
- 翻譯階段:JSP文件會被Web容器中的JSP引擎轉換成Java源碼
- 編譯階段:Java源碼會被編譯成可執行的字節碼
- 執行階段:容器接受了客戶端的請求后,執行編譯成字節碼的JSP文件;處理完請求后,容器把生成的頁面反饋給客戶端進行顯示
- 頁面中java的多,就用servlet,如果靜態html的多,就用jsp,一般一個項目中jsp和servlet搭配使用
指令元素之include指令
include指令用於在JSP頁面中靜態包含一個文件,該文件可以是JSP頁面、HTML網頁、文本文件或一段Java代碼。使用了include指令的JSP頁面在轉換時,JSP容器會在其中插入所包含文件的文本或代碼。
語法:<%@ include file="file URL"%>
file URL寫相對於當前JSP頁面的URL。
可以將一些共性的內容寫入一個單獨的文件中,然后通過include指令引用該文件,從而降低代碼的冗余問題,也便於修改共性內容。
例子:想用代碼實現訪問控制,沒登錄不允許看到主頁,這個功能就可以使用include指令來簡化。
- 創建登錄驗證文件 checklogin.jsp
<%@ page import="s2jsp.sg.ch07.User"%>
<%
User user = (User) session.getAttribute("LOGINED_USER");
if (user == null) {
response.sendRedirect(“login.html");
}
%>
- 在后台首頁面(index.jsp)中使用include指令引用登錄驗證文件
<%@ include file="checklogin.jsp"%>
指令元素之taglib指令
taglib指令允許頁面使用用戶定制的標簽。用來引入標簽庫。
語法:
<%@ taglib uri="URIToTagLibrary" prefix="tagPrefix" %>
其中uri屬性用來指定標簽庫的存放位置,prefix屬性用來指定該標簽庫使用的前綴。
靜態include和動態include的區別
include指令是編譯階段的指令,即include所包含的文件的內容是編譯的時候插入到JSP文件中,JSP引擎在判斷JSP頁面未被修改,否則視為已被修改。由於被包含的文件是在編譯時才插入的,因此如果只修改了include文件內容,而沒有對JSP修改,得到的結構將不會改變,所以直接執行已經存在的字節碼文件,而沒有重新編譯。因此對不經常變化的內容,用include指令是合適的,如果需要的內容是經常變化的,則需要動作元素<jsp:include>.
(1)include指令
include可以在JSP頁面轉換成Servlet之前,將JSP代碼插入其中。它的主要優點是功能強大,所包含的代碼可以含有總體上影響主頁面的JSP構造,比如屬性、方法的定義和文檔類型的設定。它的缺點是難於維護只要被包含的頁面發生更改,就得更改主頁面,這是因為主頁面不會自動地查看被包含的頁面是否發生更改。
語法:<%@ include file="sample.jsp" %>
2.include動作
jsp:include動作是在主頁面被請求時,將次級頁面的輸出包含進來。盡管被包含的頁面的輸出中不能含有JSP,但這些頁面可以是其他資源所產生的 結果。服務器按照正常的方式對指向被包含資源的URL進行解釋,因而這個URL可以是Servlet或JSP頁面。服務器以通常的方式運行被包含的頁面, 將產生的輸出放到主頁面中,這種方式與RequestDispatcher類的include方法一致。它的優點是在被包含的頁面發生更改時,無須對主頁 面做出修改。它的缺點是所包含的是次級頁面的輸出,而非次級頁面的實際代碼,所以在被包含的頁面中不能使用任何有可能在整體上影響主頁面的JSP構造。
語法: <jsp:include page="sample.jsp" flush="true"> <jsp:param
name="name" value="value"/> </jsp:include>
其中參數設置可以沒有,如果沒有參數設置,則必須采用<jsp:include page="sample.jsp" flush="true"/>形式。
EL表達式
EL表達式語法
EL 存取變量數據的方法很簡單,例如:${username}。它的意思是取出某一范圍中名稱為username的變量。因為我們並沒有指定哪一個范圍的username,所以它的默認值會先從Page 范圍找,假如找不到,再依序到Request、Session、Application范圍。假如途中找到username,就直接回傳,不再繼續找下去,但是假如全部的范圍都沒有找到時,就回傳null。
自動所搜范圍如下:
Page-------------PageScope
Request---------RequestScope
Session----------SessionScope
Application-----ApplicationScope
指定搜索范圍如下標准寫法
${ PageScope .username}:取出page范圍的username的變量
${ RequestScope }:取出request范圍的username的變量
${ SessionScope }:取出session范圍的username的變量
${ ApplicationScope }:取出application范圍的username的變量
表達式語言
${sessionScope.user.name}等同於${sessionScope.user["name"]}
兩種方式比較:
(1) 當要存取的屬性名稱中包含一些特殊字符,如 . 或 – 等並非字母或數字的符號,就一定要使用 [ ],例如:
${user.My-Name } 上述是不正確的方式,應當改為:${user["My-Name"] }
(2) 我們來考慮下列情況:
${sessionScope.user[data]}。此時,data 是一個變量,假若data的值為"sex"時,那上述的例子等於${sessionScope.user.sex};假若data 的值為"name"時,它就等於${sessionScope.user.name}。因此,如果要動態取值時,就可以用上述的方法來做,但 . 無法做到動態取值。