JSP頁面中兩種頁面include方式及其區別
阿新 • • 發佈:2019-01-28
JSP頁面可以進行巢狀,巢狀有兩種方法<%@include %>(靜態的)與<jsp:include>(動態的)
【準備知識】
JSP在首次執行時主要有以下幾個步驟:
1、JSP程式碼翻譯為Java程式碼;
2、Java程式碼便宜為class;
3、class部署為Servlet;
4、呼叫該Servlet。
需要稍微說明下的是,1、2步驟可以在打包WAR的時候提前完成。
【分析】
關鍵區別在於<%@include %>是編譯指令,是JSP執行器在將JSP翻譯為Java程式碼的時候進行處理的指令,因此會自動找到目標檔案並將它插入到當前jsp檔案中,就好像你通過文字編輯器的copy/paste操作一樣;相反,<jsp:include>則是執行時程式碼(本質是個Tag標籤),要在主jsp頁面被請求的時候才會去定位被包含檔案。
這種區別產生了不同的行為,我們來看些例項就能瞭解了,假設有a.jsp,在a中include檔案b,那麼:
1) 發生修改時
<%@include %>:如果b被修改了,a不會發現b的改變,除非a也被修改了。
<jsp:include>:執行時馬上察覺到變化。
2) 允許包含的內容
<%@include %>:b必須是基本的文字或jsp片斷等,不能是一個java servlet。
<jsp:include>:允許包括servlet(實際上,JSP最終將編譯為servlet)。
3) 時間與空間
<%@include %>在某些情況下要比<jsp:include>更有效率,但是它佔用更多的硬碟空間(指生成Servlet後)。當然,在此,兩者的執行效率不太重要。
4) 變數作用域
<%@include %>:a、b是整合在一起的檔案,所以變數是共享的(換句話說變數名會產生衝突問題),它們必須保持一致!
<jsp:include>:可以對不同的變數使用相同名字,對同一個標籤庫使用不同字首,a、b是相互獨立的檔案。
5) 上下文
看起來,用<%@include %>開發似乎更為高效,非常簡單的實現了合併。但是這使得程式的邏輯變得複雜混亂,因此,正規開發中,個人強烈反對使用<%@include %>指令,而建議使用<jsp:include>指令。
【準備知識】
JSP在首次執行時主要有以下幾個步驟:
1、JSP程式碼翻譯為Java程式碼;
2、Java程式碼便宜為class;
3、class部署為Servlet;
4、呼叫該Servlet。
需要稍微說明下的是,1、2步驟可以在打包WAR的時候提前完成。
【分析】
關鍵區別在於<%@include %>是編譯指令,是JSP執行器在將JSP翻譯為Java程式碼的時候進行處理的指令,因此會自動找到目標檔案並將它插入到當前jsp檔案中,就好像你通過文字編輯器的copy/paste操作一樣;相反,<jsp:include>則是執行時程式碼(本質是個Tag標籤),要在主jsp頁面被請求的時候才會去定位被包含檔案。
這種區別產生了不同的行為,我們來看些例項就能瞭解了,假設有a.jsp,在a中include檔案b,那麼:
1) 發生修改時
<%@include %>:如果b被修改了,a不會發現b的改變,除非a也被修改了。
<jsp:include>:執行時馬上察覺到變化。
2) 允許包含的內容
<%@include %>:b必須是基本的文字或jsp片斷等,不能是一個java servlet。
<jsp:include>:允許包括servlet(實際上,JSP最終將編譯為servlet)。
3) 時間與空間
<%@include %>在某些情況下要比<jsp:include>更有效率,但是它佔用更多的硬碟空間(指生成Servlet後)。當然,在此,兩者的執行效率不太重要。
4) 變數作用域
<%@include %>:a、b是整合在一起的檔案,所以變數是共享的(換句話說變數名會產生衝突問題),它們必須保持一致!
<jsp:include>:可以對不同的變數使用相同名字,對同一個標籤庫使用不同字首,a、b是相互獨立的檔案。
5) 上下文
兩種情況下,request和response均是持續的,所以request裡面的attribute和parameter均是相同的,a和b可以利用request來傳遞資料。