2011-10-24 141 views

回答

34

jGuru

<%@include file="abc.jsp"%>指令的作用類似於C "#include", 中包含文件的文本拉動和編譯它,彷彿它是 包含文件的一部分。包含的文件可以是任何類型的 (包括HTML或文本)。

< jsp:include page =「abc.jsp」>標記將該文件編譯爲單獨的 JSP文件,並在編譯的JSP中嵌入對它的調用。

一些JSP引擎支持非標準的標籤<!--#include file="data.inc"-->(NCSA-,或的.shtml式)和<%@ vinclude="data.inc" %>(的JRun式),但這些在 JSP規範沒有定義,因此不能依靠。

請參閱JSP FAQ中的這個問題。

1

一個是靜態導入(<%= @ include ...>「),另一個是動態導入(jsp:include),它會影響例如您需要爲您指定的路徑包括文件在谷歌上的一點研究會告訴你更多

51

有很大的區別如前所述,<%@ include是一個靜態包含,<jsp:include是一個動態包含,認爲它是一個宏和一個區別函數調用(如果你熟悉這些術語的話)另一種把它放在靜態包含的方法與在<%@ include聲明處複製包含文件的確切內容(「代碼」)完全一樣(哪一個正是JSP編譯器所要做的。

動態包括:將一個請求(使用請求調度程序),將執行指定的頁面,然後包括從頁面中調用頁面的輸出的輸出,以代替<jsp:include聲明。

這裏最大的區別在於,對於動態包含,包含的頁面將在它自己的pageContext中執行。而且由於這是一個請求,所以您可以像發送參數一樣發送參數到其他請求。另一方面,靜態包含只是一段代碼,它將在調用頁面的上下文中執行。如果靜態地使用相同的文件不止一次,在該文件中的代碼將在調用頁面上的多個位置存在,因此像

<% 
int i = 0; 
%> 

會產生一個編譯器錯誤(因爲相同的變量不能聲明不止一次)。

93

在一個可重複使用的代碼片段中,我使用指令<%@include file="reuse.html"%>,在第二個中我使用標籤<jsp:include page="reuse.html" />

讓在可重複使用的文件中的代碼是:

<html> 
<head> 
    <title>reusable</title> 
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
</head> 
<body> 
    <img src="candle.gif" height="100" width="50"/> <br /> 
    <p><b>As the candle burns,so do I</b></p> 
</body> 

同時運行JSP文件後,你看到相同的輸出,並認爲如果是指令有什麼區別標籤。但是,如果你看一下兩個JSP文件的生成servlet,你會看到difference.Here是你會看到什麼,當你使用directive

out.write("<html>\r\n"); 
out.write(" <head>\r\n"); 
out.write("  <title>reusable</title>\r\n"); 
out.write("  <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\r\n"); 
out.write(" </head>\r\n"); 
out.write(" <body>\r\n"); 
out.write("  <img src=\"candle.gif\" height=\"100\" width=\"50\"/> <br />\r\n"); 
out.write("  <p><b>As the candle burns,so do I</b></p>\r\n"); 
out.write(" </body>\r\n"); 
out.write("</html>\r\n"); 

,這是什麼,你會爲所使用的標記看在第二個JSP文件:

org.apache.jasper.runtime.JspRuntimeLibrary.include(request, response, "reusable.html", out, false); 

所以,現在你知道include指令插入的reuse.html源在翻譯時,但動作標籤插入reuse.html在運行時的反應。

如果您考慮一下,每個動作標籤(jsp:include file)都會帶來額外的性能提升。這意味着您可以保證您始終擁有最新的內容,但會增加性能成本。

+5

你可以更具體的哪些包括結果在哪個輸出? 你提到你的第二個include是使用指令(@include)。然後在第一個輸出結果中,你提到你使用了指令(@include),但是在第二個輸出結果中,你還說它來自第二個包含(從你之前的解釋中,它是@include)。 – stack247

+0

非常好的解釋... + 1和豎起大拇指 –

+30

如果有人被這個答案困惑:' eis

27

1)何時使用包括指令

爲了防止相同的輸出邏輯的複製在網絡上應用程序的多個JSP的,包括機構即使用。,促進表示邏輯的重用性包括指令用於

<%@ include file="abc.jsp" %> 

當上述指令由jsp引擎接收,它檢索abc.jsp的源代碼,並在當前jsp中內聯複製。複製翻譯當前頁面執行後

簡單地說,它是靜態的指令JSP引擎即,「abc.jsp」的整個源代碼被複制到當前頁面

2)當使用包括行動

包括標籤不包括包含頁面的源代碼到當前的頁面,而不是由所包含的頁在運行時所產生的輸出包括到當前頁面響應

包括標籤的功能是類似的包括servlet編程的請求調度機制

包括標籤是運行時指示JSP引擎即,而複製整個代碼到當前頁面的方法調用,以從當前頁面

+1

很好的解釋! 在運行時(動作) Joe

1
「abc.jsp」

Java Revisited

  1. include指令中包含的資源在jsp編譯期間加載,而include操作包含的資源在請求時加載。
  2. 直到jsp文件再次編譯時,在包含指令的情況下,對包含資源的任何更改都將不可見。在包含操作的情況下,包含資源的任何更改都會在下一個請求中顯示。
  3. 包含指令是靜態導入,而包含動作是動態導入
  4. 包含指令使用文件屬性指定要包含的資源,而包含動作使用頁面屬性用於相同目的。
相關問題