效果圖:
效果圖:
執行csstestone.jsp中的<%@include file="csstesttwo.jsp" %> 或者 <jsp:include page="csstesttwo.jsp" flush="true"/>,由于csstestone.jsp和csstesttwo.jsp中都定義了.my-p的樣式,被包含進來的頁面中定義的樣式會覆寫首頁面的樣式。
如果不想造成樣式的混亂,最好還是将每個頁面的樣式區分開來。或者通過執行<iframe src="csstesttwo.jsp" style="width:100%;"></iframe>,不會導緻頁面的樣式的覆寫。
首先在兩個檔案<head></head>之間加入同名js變量x,例如:分别加入<script>var x = "hjzgg_one";</script>和<script>var x = "hjzgg_tow";</script>, 然後在首頁面中進行如下操作:include前調用js的alert(x) 以及 include調用後的alert(x)。
發現是可以允許有同名的js變量的,無論是<jsp:include page="csstesttwo.jsp" flush="true"/>,還是<%@include file="csstesttwo.jsp" %>。如果在include之前通路同名變量,則通路的首頁面的變量,否則通路的被包含頁面的變量。
首先在兩個檔案<head>和<body>之間加入同名java變量x,例如:分别加入<%string x = "hjzgg_one";%>和<%string x = "hjzgg_two";%>,然後分别調用<jsp:include page="csstesttwo.jsp" flush="true"/>和<%@include file="csstesttwo.jsp" %>。然後在include之後執行alert("<%=x%>");
發現在加入<%@include file="csstesttwo.jsp" %>(靜态包含),編譯器就已經通知有“變量重名的錯誤”。而通過<jsp:include page="csstesttwo.jsp" flush="true"/>(動态包含)不僅不會,而且正常運作。
分析一下:<%@include file="csstesttwo.jsp" %>引入靜态文本,在jsp頁面被轉化成servlet之前和它融和到一起.先包含,後編譯,不會檢查所含檔案的變化,适用于包含靜态頁面,可以了解為純粹是把代碼寫在外面的一種共享方法,所有的變量都是可以和include它的主檔案共享, 兩者高度緊密結合,不能有變量同名的沖突。而頁面設定也可以借用主檔案的。 <jsp:include page="csstesttwo.jsp" flush="true"/>引入執行頁面或servlet所生成的應答文本. 被包含的檔案先編譯,後包含進來,然後顯示。
為了驗證上面的分析,首先找到這樣的一個目錄(即tomcat jsp生成的java檔案位置),先找到你的eclipse workspace,然後會有子目錄:.metadata\.plugins\org.eclipse.wst.server.core\tmp0\work\catalina\localhost,在這個目錄裡會看見你的項目目錄,例如我的項目目錄名是“csstest”,然後一路的找下去,最終有一個名稱為"jsp"的目錄(最終目錄:f:\eclipseee_workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\work\catalina\localhost\csstest\org\apache\jsp),這裡就是存放jsp轉成servlet(java檔案)的地方。
将之前添加的各種變量語句統統去掉, include語句也去掉, 并将剛才找到的目錄的檔案删除,接着在浏覽器中通路csstestone.jsp這個頁面。目錄裡多了兩個檔案,如下圖所示:
再将目錄中的檔案删除,并在首頁面中加入<%@include file="csstesttwo.jsp" %>,接着在浏覽器中通路csstestone.jsp這個頁面。目錄中的内容如下圖所示,注意,對應檔案的大小發生了變化。
再将目錄中的檔案删除,删除<%@include file="csstesttwo.jsp" %>,并在首頁面中加入<jsp:include page="csstesttwo.jsp" flush="true"/>,接着在浏覽器中通路csstestone.jsp這個頁面。目錄中的内容如下圖所示,注意,目錄中多了被包含jsp的.class檔案和.java檔案。
1.動态include和靜态include都和include它的頁面的request範圍是一緻。而<iframe>範圍不一緻。
2.動态include和靜态include都允許有同名的js變量
3.動态include中允許有java的同名變量,而靜态include中不允許有java的同名變量。
說明:它總是會檢查所含檔案中的變化,适合用于包含動态頁面,并且可以帶參數,先編譯之後再進行處理。
原因:1、靜态include的結果是把其他jsp引入目前jsp,兩者合為一體。
2、靜态include純粹是把代碼寫在外面的一種共享方法,所有的變量都是可以和include它的主檔案共享,兩者高度緊密結合,不能有變量同名的沖突.而頁面設定也可以借用主檔案的.
說明:用include僞碼實作,定不會檢查所含檔案的變化,适用于包含靜态頁面,直接将内容先包含後處理。
原因:1、動态include的結構是兩者獨立,直到輸出時才合并。
2、動态include的jsp檔案獨立性很強,是一個單獨的jsp檔案,需要使用的對象,頁面設定,都必須有自己建立,當然,還好它和include它的頁面的request範圍是一緻的。
https://github.com/hjzgg/jspincludetest (最好自己親手試一下,别怪我誤導了你哦!)