靜態Include和動態Include測試并總結

主要代碼

hjzgg.css

.center-div{width:auto;margin-left: 40%;margin-right: 40%;display: block;position: absolute;top:0px;left:0px;
}.text-div{margin-top: 80px;
}.hjzgg-div{color:transparent;font-size:20px;font-weight: bold;letter-spacing:2px;-webkit-animation-duration: 3s;-webkit-animation-fill-mode: forwards;-webkit-animation-name: hjzgg-move;float:left;
}.hjzgg-div-delay-1{-webkit-animation-delay: 1s;
}.hjzgg-div-delay-2{-webkit-animation-delay: 2s;
}.hjzgg-div-delay-3{-webkit-animation-delay: 3s;
}.hjzgg-div-delay-4{-webkit-animation-delay: 4s;
}.hjzgg-div-delay-5{-webkit-animation-delay: 5s;
}.hjzgg-div-delay-6{-webkit-animation-delay: 6s;
}@-webkit-keyframes hjzgg-move{from{margin-top: -35px;}to{margin-top: 10px;color:#000000;text-shadow: 2px 2px 3px #222222;}
}

?

cssTestOne.jsp

<%@ page language="java" contentType="text/html; charset=utf-8"pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>頁面包含</title>
<link rel="stylesheet" type="text/css" href="css/hjzgg.css" />
<script>var x = "hjzgg_one";
</script>
<style type="text/css">.my-p{color:red;font-size:40px;text-shadow: 2px 2px 3px #222222;text-align: center;}
</style>
</head>
<%String x = "hjzgg_one";
%>
<body><div class="center-div"><div class="hjzgg-div">CSS</div><div class="hjzgg-div hjzgg-div-delay-1"></div><div class="hjzgg-div hjzgg-div-delay-2"></div><div class="hjzgg-div hjzgg-div-delay-3"></div><div class="hjzgg-div hjzgg-div-delay-4"></div><div class="hjzgg-div hjzgg-div-delay-5"></div><div class="hjzgg-div hjzgg-div-delay-6"></div></div><div class="text-div"><p class="my-p">大家好,我是HJZGG</p></div><%@include file="cssTestTwo.jsp" %><%-- 測試css樣式覆蓋<jsp:include page="cssTestTwo.jsp" flush="true"/><iframe src="cssTestTwo.jsp" style="width:100%;"></iframe> --%><script>alert("<%=x%>");</script>
</body>
</html>

?

效果圖:

cssTestTwo.jsp

<%@ page language="java" contentType="text/html; charset=utf-8"pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>頁面包含</title>
<script>var x = "hjzgg_two";
</script>
<style type="text/css">/* .my-p{color:green;font-size:20px;text-align: center;} */
</style>
</head>
<%//測試java同名變量//String x = "hjzgg_one";
%>
<body><div class="text-div"><p class="my-p">大家好,我是HJZGG</p></div><script>alert("<%=request.getParameter("hjzgg")%>");</script>
</body>
</html>

?

效果圖:

  

css覆蓋測試:

  執行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>,不會導致頁面的樣式的覆蓋。

?

js中同名變量問題:

  首先在兩個文件<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之前訪問同名變量,則訪問的主頁面的變量,否則訪問的被包含頁面的變量。

?

java同名變量問題:

  首先在兩個文件<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文件)的地方。

?

測試1

   將之前添加的各種變量語句統統去掉, include語句也去掉, 并將剛才找到的目錄的文件刪除,接著在瀏覽器中訪問cssTestOne.jsp這個頁面。目錄里多了兩個文件,如下圖所示:

?

  

測試2

   再將目錄中的文件刪除,并在主頁面中加入<%@include file="cssTestTwo.jsp" %>,接著在瀏覽器中訪問cssTestOne.jsp這個頁面。目錄中的內容如下圖所示,注意,對應文件的大小發生了變化。

?

測試3

   再將目錄中的文件刪除,刪除<%@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的同名變量。

動態INCLUDE

  說明:它總是會檢查所含文件中的變化,適合用于包含動態頁面,并且可以帶參數,先編譯之后再進行處理。

  原因:1、靜態include的結果是把其他jsp引入當前jsp,兩者合為一體。

     2、靜態include純粹是把代碼寫在外面的一種共享方法,所有的變量都是可以和include它的主文件共享,兩者高度緊密結合,不能有變量同名的沖突.而頁面設置也可以借用主文件的.

靜態INCLUDE

  說明:用include偽碼實現,定不會檢查所含文件的變化,適用于包含靜態頁面,直接將內容先包含后處理。

  原因:1、動態include的結構是兩者獨立,直到輸出時才合并。

     2、動態include的jsp文件獨立性很強,是一個單獨的jsp文件,需要使用的對象,頁面設置,都必須有自己創建,當然,還好它和include它的頁面的request范圍是一致的。?

?

測試項目地址

  https://github.com/hjzgg/jspIncludeTest?(最好自己親手試一下,別怪我誤導了你哦!)

轉載于:https://www.cnblogs.com/hujunzheng/p/5051070.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/531364.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/531364.shtml
英文地址,請注明出處:http://en.pswp.cn/news/531364.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

linux終端常用快捷鍵

CTRLALTT 打開終端 CTRLD 關閉終端 CTRL SHIFT "" 放大終端字體 CTRL “-” 縮小終端字體 CTRL r 查找歷史命令 CTRLu 刪除光標前面所有內容 CTRLw 刪除光標左邊的單詞 CTRL k 刪除光標后面的所有內容 CTRLL 清除當前屏幕內容 CTRLa 光標移到開始位置 CTRLe 光標移到…

ueditor的配置和使用

ueditor下載好之后直接復制到項目的WebContent目錄下&#xff0c;并將ueditor\jsp\lib下的jar包復制或者剪切到項目的lib目錄下。先看一下效果&#xff0c;如下&#xff1a; 1.文件的上傳 首先在ueditor/jsp目錄下找到config.json文件&#xff0c;就拿Image上傳來說吧。 "…

windows上搭建NFS服務器

在進行嵌入式開發的時候&#xff0c;我們常用的做法是搭建NFS服務器&#xff0c;然后使把文件系統、調試程序放在NFS服務器上&#xff0c;這樣可以方便調試&#xff0c;以前都是在linux里面開啟NFS服務器&#xff0c;今天來說下window里的nfs服務器–haneWin 一、軟件安裝和使…

計算機是如何啟動的?從未上電到操作系統啟動

計算機是如何啟動的&#xff0c;網絡上很多博文1都從 BIOS 程序的加載開始說起&#xff0c;有的也跳到 BIOS 程序加載 Bootloader 階段。個人認為把這個過程稱為操作系統是如何被加載并啟動應該更加貼切一點。同時&#xff0c;也有計算機硬件大神的文章[1][5]詳細分析計算機加電…

Hibernate注解

前言&#xff1a; 最近正在學習Hibernate通過注解&#xff08;annotation&#xff09;來管理映射關系&#xff0c;以前都是通過XML映射文件。下面拿個小例子說一下。 數據庫物理模型&#xff1a; 數據庫的描述&#xff1a; 一篇博客隨筆可以分到不同的類中&#xff0c;一個類中…

js表單動態添加數據并提交

情景1&#xff1a;已經存在form對象了&#xff0c;動態為form增加對象并提交 function formAppendSubmit(){var myform$(#newArticleForm); //得到form對象var tmpInput$("<input typetext nameblogArticleForm.articleContent/>");tmpInput.attr("value&…

*++p和*p++的區別

首先你應該明白* 和 的優先級是相同的&#xff0c;而且他們的結合性是從又往左的 #include <stdio.h>int main(int argc ,char * argv[]) {int str[]{1,2,3,4,5,6,7,8,9,10};int *p str;int a *p;//a*p ,pp1即a1&#xff0c;p&str[1]int b *p;//pp1,b*p即p&s…

zyUpload+struct2完成文件上傳

前言&#xff1a; 最近在寫自己的博客網站&#xff0c;算是強化一下自己對s2sh框架的理解。期間遇到了很多問題&#xff0c;這些問題在寫之前都考慮過&#xff0c;感覺也就是那樣吧。但正真遇到了&#xff0c;也挺讓人難受的。就利用zyUpload這個js插件實現文件的上傳&#xff…

gbd的簡單使用(一)

這篇文章將gdb的簡單使用&#xff0c;通過此篇文章你能學習到使用gdb進行調試程序 在Linux中編寫程序時&#xff0c;如何進行程序的debug工作呢&#xff1f;今天來介紹下gdb這個工具&#xff0c;可以在Linux下直接man gdb查看幫助信息 &#xff08;一&#xff09;gdb命令介紹 …

java發送內嵌圖片郵件

前言&#xff1a; 博客系統中需要郵件服務的功能&#xff0c;以前寫過類似的功能&#xff0c;不過功能太簡單了&#xff0c;僅僅是發送文本內容&#xff0c;現在嘗試一下發送內嵌圖片郵件&#xff01; 準備工作&#xff1a; 請參考&#xff1a;http://www.cnblogs.com/hujunzhe…

調試跟蹤利器---strace

通過這篇文章你會學習到strace的用法&#xff0c;strace可以幫助你高效地定位進程中的一些錯誤&#xff0c;關于strace的用處有很多&#xff0c;可以自行發掘 前面我們講解了gdb調試程序,這篇文章介紹另一個調試跟蹤工具strace&#xff0c;同樣你可以在linux下執行man strace查…

MBR、DBR、FAT32基礎小知識

MBR-------主引導記錄 1.創建時間&#xff1a;由分區軟件&#xff08;Fdisk/PartitionMagic/Windows 2000/Windows XP安裝 工具等&#xff09;給 硬盤分區時建立的。 2.功能 &#xff1a;存放硬盤分區信息和引導系統時檢查分區。 3.作用范圍&#xff1a;MBR和虛擬MBR控制著整個…

java使用Executor(執行器)管理線程

一.一個實現了Runnable接口的類 class MyThread implements Runnable{private static int num 0;Overridepublic void run() {while(true){synchronized(MyThread.class){num;try{Thread.sleep(500);} catch(Exception e){System.out.println(e.toString());}System.out.print…

JMM和happens-before原則

JMM&#xff1a; Java Memory Model(Java內存模型)&#xff0c;圍繞著在并發過程中如何處理可見性、原子性、有序性這三個特性而建立的模型。 可見性&#xff1a; JMM提供了volatile變量定義、final、synchronized塊來保證可見性。  例如&#xff1a;線程a在將共享變量x1寫入…

SD卡移植FAT32文件系統無MBR

問題&#xff1a;在研究SD卡和FAT32文件系統的時候&#xff0c;發現SD卡有的有MBR&#xff0c;有的沒有MBR&#xff0c;這個為什么呢&#xff1f; 分析&#xff1a;MBR是主引導記錄&#xff0c;是在給磁盤分區的時候建立的&#xff0c;我們的SD卡沒有這個可能就是沒有進行過分區…

java獲取類的信息

關鍵技術剖析 1.java.lang.reflect包實現了java的反射機制&#xff0c;在使用反射機制時&#xff0c;需要導入該包。 2.Class類的forName方法能夠根據類名加載類&#xff0c;獲得類的Class對象。 Class類的getSuperclass方法獲得父類的Class對象&#xff1b;getDeclaredFields方…

FAT32文件系統介紹

FAT32文件系統&#xff08;一&#xff09;為什么要有文件系統&#xff08;二&#xff09;FAT32文件系統組成&#xff08;三&#xff09;分步介紹各部分(1) 首先介紹一下MBR(2)DBR介紹(3)FAT表介紹(4) 數據區&#xff08;一&#xff09;為什么要有文件系統 文件系統是操作系統用…

java中動態代理實現機制

前言&#xff1a; 代理模式是常用的java設計模式&#xff0c;它的特征是代理類與委托類有同樣的接口&#xff0c;代理類主要負責為委托類預處理消息、過濾消息、把消息轉發給委托類&#xff0c;以及事后處理消息等。代理類與委托類之間通常會存在關聯關系&#xff0c;一個代理類…

libiconv庫簡單裁剪支持CP437編碼

有許多人在做項目的時候都會遇到字符編碼的不一致導致的亂碼問題&#xff0c;那如何去解決呢&#xff1f;在Linux系統上可以通過iconv函數族來進行編碼轉換&#xff0c;但有時候我們并不需要全部的字符集&#xff0c;因為可能會占用比較大的空間&#xff0c;本文主要支持CP437編…

簡單java在線測評程序

簡單java程序在線測評程序 一&#xff0e;前言 大家過年好&#xff01;今年的第一篇博客啊&#xff01;家里沒有網&#xff0c;到處蹭無線&#xff01;日子過得真糾結&#xff01;因為畢設的需求&#xff0c;簡單寫了一個java程序在線測評程序&#xff0c;當然也可以在本地測試…