靜態include與動態include的區別


jsp中的include有兩種形式,分別是:
<%@ include file=""%>
<jsp:include page="" flush="true" />
前者是指令元素,后者是行為元素.
<%@ include file=""%>,jsp的include指令元素讀入指定頁面的內容,並把這些內容融合到一起(這個過程在翻譯階段:也就是jsp被轉化成servlet的階段進行的),也就是說,jsp頁面不能原封不動地被傳送給瀏覽器,所有的jsp元素都必須首先由服務器進行處理.這是通過將jsp頁面轉達化成servlet,然后執行這個servlet來完成的.服務器需要一個jsp容器來處理jsp頁面.jsp容器通常以servlet的形式來實現,這個servlet經過配置,可以處理對jsp頁面的所有請求.
     Jsp容器負責將jsp頁面轉化成servlet,並編譯這個servlet.這兩步就構成了翻譯階段.
     由此我們就會知道:jsp頁面是把include指令元素所指定的頁面的實際內容(也就是代碼段)加入到引入它的jsp頁面中,合成一個文件后被jsp容器將它轉化成servlet.可以看到這時會產生一個臨時class文件和一個java文件.
<jsp:include page="" flush="true" />,是在jsp頁面運行時才處理文件,被處理的文件在邏輯和語法上獨立於當前JSP頁面.會編譯成不同的java文件
下面用代碼測試動、靜態include的區別:

_01_include_01.jsp  

<!DOCTYPE HTML>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>jsp:include</title>
</head>
<body bgcolor="white">
    <font>
        <%@ include file="_02_date.jsp"%>
        <%= request + "--1--" + "<br>"%>
   
    </font>
</body>
</html>

 


_01_include_02.jsp

<!DOCTYPE HTML>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>jsp:include</title>
</head>
<body bgcolor="white">
    <font>
         <%/*
        * 注意:jsp標簽需要自己關閉,不要忘了關閉的橫線
        * jsp:include 是動態加載,在jsp編譯的時候,加載頁面和被加載頁面會被解析兩個java,Servlet文件
        * javac編譯器會編譯兩次,生成兩個class文件
        * 然后再jvm運行的過程中,這個時候包含文件才去調用被包含的class文件
        * 這就是動態包含
        *
        */%>
        <jsp:include page="_02_date.jsp" flush="true" />
        <%/*
        * 上面例子可以看出,因為生成是兩個不同的Servlet文件-->不同的class-->所以每個Servlet都有自己的request對象,不是同一個.但是第一個是生成一個Servlet所以是同一個
        */%>
        <%/*
        * 不同的頁面,不同的request之間可以傳值
        * 傳值別忘了寫flush,這里傳值也是IO流,需要flush
        * 然后把值傳遞到第二個頁面輸出
        */%>
        <jsp:include page="_02_date.jsp?username='123'" flush="true" />
    </font>
</body>
</html>

 

_02_date.jsp

<%@ page import="java.util.*"%>
<%= (new Date()).toLocaleString() + "<br />"%>
<%= request + "--2--" + "<br />"%>
<%= request.getParameter("username") + "<br />"%>

 


運行"_01_include_01"的結果:

從結果可以看出兩個request對象是同一個,同一個對象之間是不能夠傳參的,再看看編譯的java、class文件

可以看到這里只有一個java和一個class文件.


再運行"_01_include_02",


從結果可也看出兩個request對象顯然不是同一個,既然不是同一個,那肯定可以傳參了,再看看編譯的java、class文件


可以看到有兩個java文件和對應的class文件.

為什么呢?
因為靜態include的結果是把其他jsp引入當前jsp,兩者合為一體      
動態include的結構是兩者獨立,直到輸出時才合並( 看看jsp生成的java文件就可以知道了)
下面兩幅圖,是動態和靜態include的區別的圖解

 


靜態include圖解:

 

 

動態include圖解:



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM