2012-01-27 123 views
2

我對JSP包含標籤的工作方式感到困惑。發生的事情是基頁的body標籤具有包含JSP的id屬性。包含HTML正文的JSP包含HTML BODY標籤嗎?

base.jsp

<%@page contentType="text/html" 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>JSP Page</title> 
    </head> 

    /* base jsp has no id for body */ 

    <body> 
     <h1>Hello World!</h1> 
     <jsp:include page="include.jsp" /> 
    </body> 
</html> 

include.jsp

<%@page contentType="text/html" 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>JSP Page</title> 
    </head> 

    /* here included jsp has body with ID specified */ 

    <body id="includeBody"> 
     <h1>Hello include!</h1> 
    </body> 
</html> 

當我去base.jsp頁面,螢火蟲只找到一個body標籤是確定,但表示HTML BODY標記的id屬性爲「includeBody」

結果:

<html> 
    <head> 
    <meta content="text/html; charset=UTF-8" http-equiv="Content-Type"> 
    <title>JSP Page</title> 
    </head> 

    /* why this body has id ??? */ 

    <body id="includeBody"> 
    <h1>Hello World!</h1> 
    <meta content="text/html; charset=UTF-8" http-equiv="Content-Type"> 
    <title>JSP Page</title> 
    <h1>Hello include!</h1> 
    </body> 
</html> 

的base.jsp有身體沒有指定的id和include.jsp具有體ID。看起來好像我沒有在base.jsp的主體中指定id,包含的jsp body id將會被應用。這是一個錯誤?或者我應該從included.jsp中刪除正文(不,那可能是真的)。或者我可以添加id到base.jsp主體,這樣它就不會被包含的主體取代。

+0

嘗試「查看源代碼」而不是Firebug的檢查。我想你會找到你的第二個BODY標籤。 – Matthew 2012-01-27 11:15:16

回答

2

這不是一個錯誤。這是HTML5解析器的必需行爲。會發生什麼情況是,如果解析器遇到第二個主體開始標記,那麼它將查看該第二個主體開始標記的每個屬性,以及如果body元素(由第一個主體開始標記創建)沒有具有相同名稱的屬性,那麼該屬性會被添加到body元素中。

如果解析器遇到任何進一步的主體開始標記,將每個屬性累積到主體元素上,第一個實例的任何特定屬性優先,則會發生同樣的事情。

因此,舉例來說,如果你有

<body id="realBody"> 
    <h1>Hello include!</h1> 
    <body id="invalidSecondBody" class="error"></body> 
    <body id="invalidThirdBody" class="errorAgain" style="color:red"></body> 
</body> 

然後,在DOM,body元素將有ID = 「realBody」 和class = 「錯誤」 和風格= 「顏色:紅色」。

此處指定HTML5中的規則:http://dev.w3.org/html5/spec/tree-construction.html#parsing-main-inbody,向下搜索A start tag whose tag name is "body",它是該塊中的最後一段。

...可能[I] ID添加到base.jsp身體所以它不會與 包括身體

代替根據上述規則,這是會發生什麼,是。但是,您不應該在第一個地方將一個完整的html文檔包含在另一個文件中。累積的標記是非常無效的,而且你可以像上面那樣解釋各種奇怪的解析器規則。

+0

感謝您的詳細信息。我現在讓我開始思考我應該只用DIV(不帶HTML標籤和BODY標籤)來做HTML文件的「jsp include」。 – 2012-01-30 00:37:00