2014-06-25 45 views
0

Accodign到JSP規範:JSP之間的差的一個包括指令和JSP包含標籤

JSP容器可以包括用於如果 包含的文件的改變被通知的機構,所以該容器可重新編譯JSP頁面。 但是,JSP 1.2規範沒有指示 包含文件的JSP容器已更改的方法。

而且我發現這在一個在線教程:

如果所包含的文件被更改,但沒有被包括它 則更改只會當我們使用include動作標記反映JSP 。 更改不會反映如果您使用include指令,因爲JSP 未更改,因此請求處理 將不會被轉換(因此在此階段只有 文件包含在使用指令中時),因此更改不會反映。

然後,我寫一個例子來嘗試:A.jsp,B.jsp,和C.jsp,

A.jsp包括C.jsp用JSP包括指令:

<%@ include file="/jsp/C.jsp" %> 

B.jsp包括C.jsp使用JSP包括標籤:

<jsp:include page="/jsp/C.jsp" /> 

,當我訪問A.jsp和B.jsp在borwser,大公兩個顯示正常, 然後我改變了C.jsp,並且我重新渲染了A.jsp和B.jsp,它們都可以顯示C.jsp的變化。但如果JSP規範爲真,則A.jsp不應顯示C.jsp的更改。 有什麼不對嗎?

+0

最初的引用不是來自JSP規範。它似乎來自一個在線教程。 –

回答

2

首先刷新,我們應採取這種,

<%@ include file="/jsp/C.jsp" %>

  1. 包括指令將粘貼頁面,因爲它在 這個陳述被使用的地方。
  2. 如果您對靜態內容進行了更改(A.jspC.jsp),它將會與您所做的更改一起呈現。

<jsp:include page="/jsp/C.jsp" />

  1. 這包括作用的標籤是用來插入一個靜態或動態 內容。
  2. 因此,這些更改會反映出來,即C.jsp將 通過將請求和響應對象傳遞給它並且 包含A.jsp中的執行頁面來執行。

編輯:

例如,

B.jsp

<c:out value="${value}"/> 

A.jsp

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> 
<c:set var="value" value="10"/> 

<span>From @include <%@include file="B.jsp" %></span> 
<span>From jsp:include <jsp:include page="B.jsp" /></span> 

當頁面被加載這將是,

From @include 10 
From jsp:include 

,如果你檢查,看,它看起來像,

<span>From @include 10</span> 
<span>From jsp:include <c:out value/></span> 

這是因爲,@include將取代B.jsp內容爲A.jsp渲染開始之前,這裏爲jsp:includeA.jspB.jsp將分開執行。

由於taglib沒有導入B.jsp,所以c:out標籤未被執行。

一旦改變B.jsp

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> 
<c:out value="${value}"/> 
如果你檢查,看看所呈現的頁面

,它看起來像,

<span>From @include 10</span> 
<span>From jsp:include </span> 

變量value有其僅在A.jsp範圍。

jsp:include

範圍

頁在@include

的範圍是請求

+0

你能給我一個代碼示例:「如果你在A.jsp和C.jsp中都有腳本,並且如果你在C.jsp中更改,它不會被反映爲源jsp(A.jsp)不會被改變。「?謝謝! – zenis

+0

我編輯了我的答案。 – Bharath

+0

非常感謝! – zenis

0
<%@ include file="/jsp/C.jsp" %> 

做動態插入內容, 假設您在您A.jspC.jsp,因此,如果您在C.jsp聲明的變量,你可以參考它在你A.jsp在編譯和運行時間。

但如果<jsp:include page="/jsp/C.jsp" />你已經這樣做了,

那麼你的C.jsp內容會在A.jsp(如複製和粘貼)(僅在運行時)。

如果你改變 C.jsp內容

在此之後,那麼你需要重新召回的A.jsp.

1

從JSP規範關於這個主題的實際文本是:

JSP容器可以包含一個機制,用於在包含的文件發生變化時收到通知,以便容器可以重新編譯JSP頁面。但是,JSP 1。2規範沒有辦法指示包含文件的JSP容器發生了變化。

相同的文本在規範的所有後續版本中均與當前版本(寫作時的2.3版本)保持不變(除規範版本外)。

大多數JSP容器都會檢測包含文件中的更改,並在下一次請求包含文件時觸發重新編譯。