天天看點

jsp引入頁面,即包含檔案的兩種方法介紹

最近在練手做一個小demo中,比較多的用到了jsp引入另一個jsp的例子,感覺很簡單,但是不幸出現了錯誤500,于是查找了一些資料來了解一下關于jsp包含的方法,這裡分享出來,個人總結,可能不夠完善,歡迎批評指正。

我們都知道在jsp中include有兩種形式,分别是 :<%@ include file=”要引入的檔案 ”%> ;<jsp:include page=” 要引入的檔案” flush=”true”/> 

前者是指令元素、後者是行為元素。

<%@ include file=”要引入的檔案 ”%>

這種包含叫做靜态包含,首頁面不能夠向被包含的頁面傳遞參數,可以包含任意類型的檔案,将包含檔案的内容加載。也就是說,使用這種方法包含檔案,它不管其内容如何,不過是靜态頁面還是動态頁面都首先将頁面的内容先加進來。

<jsp:include page=” 要引入的檔案” flush=”true”/>

這種包含我們稱為動态包含,表示的是包含頁面可以向被包含的頁面傳遞參數和變量。他的特點是能動态差別加進來的是動态頁面還是靜态頁面,對于靜态頁面則直接将資源包含(僅取其文本),這個時候和上面的靜态包含差別不大,而對于動态頁面,如jsp頁面,他會先執行後加載。

靜态包含和動态包含各有各的特點,也有其分别适用的場景,隻有真正了解了他們的不同,才能夠更好的使用他們,對于靜态包含,無論它要包含什麼類型的檔案,它都是要先加載進來,然後合并之後再去被編譯,換言之,對系統而言,他們屬于一個頁面,隻被編譯一次。我們知道,jsp頁面不能原封不動地被傳送給浏覽器,所有的jsp元素都必須首先由伺服器進行處理。這是通過将jsp頁面轉達化成servlet,然後執行這個servlet來完成的。伺服器需要一個jsp容器來處理jsp頁面。jsp容器通常以servlet的形式來實作,這個servlet經過配置,可以處理對jsp頁面的所有請求。

這裡舉一個簡單的小例子來說明一下

首先寫一個首頁面:

被包含頁面:

運作include.jsp後出現的界面如下:

jsp引入頁面,即包含檔案的兩種方法介紹

可以看到它已經被成功的包含進去了,我們打開tomcat編譯後的class檔案夾下面可以看到:

jsp引入頁面,即包含檔案的兩種方法介紹

編譯之後,被包含檔案beincluded檔案找不到被編譯之後的class檔案,而是随包含檔案一起被編譯了。

現在我們使用動态包含,<jsp:include page="beincluded.jsp" flush="true"/>,其餘代碼不變,執行,打開編譯後的class檔案下我們可以看到,

jsp引入頁面,即包含檔案的兩種方法介紹

我們可以看到,動态包含對于系統來說,他們不屬于一個頁面,而是要被編譯兩次,産生兩個class編譯檔案,它是先被編譯執行之後,然後才被包含進去。明白了這一點,我們就能很好的把握這兩種包含方法了。

例如,對于靜态方法,由于它是先被包含後被編譯,是以,我們可以把參與靜态包含的頁面了解為一個頁面,這時他的編碼統一問題,例如出現錯誤500,可能是<%@ page language=”java” contenttype=”text/html;charset=utf-8%>這句被加載了兩次,這時我們可以直接删除被包含頁面的這句代碼。例如出現無法編譯,重複定義錯誤等情況,可能是兩個頁面有定義相同的方法名或變量,如:

包含頁面:

name重複,就會出現錯誤,而對于動态包含方法,這點可以不用考慮,因為它是先進行編譯後進行合并。

總之,了解他們底層原理之後,進行頁面的包含,出現例如編碼亂碼,重複定義等錯誤之後我們可以很輕松的搞定,合理使用包含方法也會使我們事半功倍。