標籤:style c class blog code java
1 前言
搞java開發的人也許都知道在jsp中引入項目中其他檔案有如下兩種方式
<%@include file="xxx.jsp"%> <jsp:include page="xxx.jsp"></jsp:include>
我們也許會使用這兩種方式,但是也許很多人不名稱這兩種方式的區別。下面我們來看看下面的兩個例子
2 開門見山引出問題
(1) /include/include.jsp
<%@ page language="java" pageEncoding="UTF-8"%><%String path = request.getContextPath();%><h1>include頁面</h1>
(2)/ index1.jsp頁面
<%@ page language="java" pageEncoding="UTF-8"%><%String path = request.getContextPath();%><!DOCTYPE HTML><html> <head> </head> <body> <h1>index頁面</h1> <%@include file="/include/include.jsp"%> </body></html>
(3) /index2.jsp
<%@ page language="java" pageEncoding="UTF-8"%><%String path = request.getContextPath();%><!DOCTYPE HTML><html> <head> </head> <body> <h1>index頁面</h1> <jsp:include page="/include/include.jsp"></jsp:include> </body></html>
現在我們訪問index1.jsp,訪問結果如下
那我們繼續訪問index2.jsp,結果如下
為什麼呢,怎麼index1.jsp為什麼訪問報錯了啊,看來@include與jsp:include是有區別的吧。只有搞懂@include與jsp:include這兩種方式的底層區別,我們就知道為什麼index1.jsp頁面會發生錯誤了。請繼續看下去你就會明白了。
3 @include與jsp:include內部區別
為了示範出@include的正確效果,我們再寫兩個頁面
(1)/include/include1.jsp
<%@ page language="java" pageEncoding="UTF-8"%><h1>include1頁面</h1>
(2) /index3.jsp
<%@ page language="java" pageEncoding="UTF-8"%><%String path = request.getContextPath();%><!DOCTYPE HTML><html> <head> </head> <body> <h1>index頁面</h1> <%@include file="/include/include1.jsp" %> </body></html>
我們訪問index3.jsp頁面
OK,我們發現結果正確了,可以對比了include1.jsp與include.jsp看看哪裡改動了。我們知道當我們訪問jsp頁面時,servlet容器(如tomcat)會把jsp編譯成servlet java代碼。下面我們來看看tomcat對index1.jsp與index3.jsp產生的servlet java代碼。在tomcat中我們可以在 “/tomcat目錄/work/Catalina/localhost/項目名稱/“中找到tomcat將jsp編譯成servlet的代碼。
(1) index3.jsp對應的servlet代碼
(2) index2.jsp頁面對應的servlet代碼
訪問ndex2.jsp時候在也產生了include.jsp對應的servlet代碼
從tomcat產生的servlet代碼我們可以得出兩者之間的區別
4 結論
@include:頁面請求之前先行編譯,所有程式碼封裝含進來之後,一起進行處理,把所有代碼合在一起,編譯成一個servlet
jsp:include 所有代碼分別處理,在頁面被請求的時候才編譯,被編譯成多個servlet,頁面文法相對獨立,處理完成之後再將代碼的顯示結果(處理結果)組合進來。
5 再次回到問題
為什麼本文中剛開始的那個問題index1.jsp頁面報錯呢,大家知道了嗎,原因就是include.jsp頁面中和index1.jsp頁面中同時都包含如下代碼。
<% String path = request.getContextPath(); %>
因為我們採用的include的方式,這樣頁面請求之前所有代碼先包含進來之後再一起處理,這樣代碼中就有兩個path變數。這樣就不符合java文法了。所有就報500錯誤了。為什麼index2.jsp沒有錯誤了,因為採用的jsp:include方式,這樣兩個頁面時單獨編譯的,最後才將編譯的結果合并起來。所有就不會出錯。
收工,搞定,完畢!