jsp中的@include與jsp:include區別詳解

來源:互聯網
上載者:User

標籤: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方式,這樣兩個頁面時單獨編譯的,最後才將編譯的結果合并起來。所有就不會出錯。

收工,搞定,完畢!

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.