jsp是有自己的編譯引擎的


什么是jsp?

JSPJava Server Pages)是指:

HTML中嵌入Java腳本代碼

由應用服務器中的JSP引擎來編譯和執行嵌入的Java腳本代碼

然后將生成的整個頁面信息返回給客戶端

Jsphtml的區別: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 范圍找,假如找不到,再依序到RequestSessionApplication范圍。假如途中找到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}。因此,如果要動態取值時,就可以用上述的方法來做,但 . 無法做到動態取值。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM