2012-01-27 121 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