JSP包含HTML正文覆盖包含的HTML BODY标记?

时间:2012-01-27 07:25:12

标签: html jsp include

我对JSP包含标签的工作方式感到困惑。发生的事情是基页的body标签具有包含JSP的id属性。

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页面时,firebug只找到一个正文标记,但是表明 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的body,include.jsp具有id的body。看起来如果我没有在base.jsp的主体中指定id,则会应用jsp body id。这是一个错误吗?或者我应该从included.jsp中删除body(不可能是真的)。或者我可以将id添加到base.jsp主体,这样它就不会被包含的主体替换。

1 个答案:

答案 0 :(得分:2)

这不是一个错误。这是HTML5解析器的必需行为。如果解析器遇到第二个body start标记,那么它会查看第二个body start标记的每个属性,以及body元素(由第一个body start标记创建)是否没有同名的属性,然后将属性添加到body元素。

如果解析器遇到任何进一步的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 =“error”以及style =“color:red”。

HTML5中的规则在此处指定:http://dev.w3.org/html5/spec/tree-construction.html#parsing-main-inbody,向下搜索A start tag whose tag name is "body",它是该块中的最后一段。

  

...可以[我]将id添加到base.jsp体中,这样它就不会被替换掉   包括身体

根据上述规则,即将发生的事情,是的。但是,您不应该首先将一个完整的html文档包含在另一个中。累积的标记非常无效,你可以接受各种奇怪的解析器规则,如上面那样。