JSP包含HTML正文重写包含的HTML正文标记?

JSP包含HTML正文重写包含的HTML正文标记?,html,jsp,include,Html,Jsp,Include,我对JSP include标记的工作原理感到困惑。发生的情况是,基本页面的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>

我对JSP include标记的工作原理感到困惑。发生的情况是,基本页面的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>
<%@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>

JSP页面
/*基本jsp没有主体的id*/
你好,世界!
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>

    /* base jsp has no id for body  */

    <body>
        <h1>Hello World!</h1>
        <jsp:include page="include.jsp" />
    </body>
</html>
<%@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>

JSP页面
/*此处包含的jsp具有指定ID的主体*/
你好,包括!
当我转到base.jsp页面时,firebug只找到一个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>

JSP页面
/*为什么这个身体有id*/
你好,世界!
JSP页面
你好,包括!

base.jsp的body没有指定id,include.jsp的body有id。看起来,如果我没有在base.jsp的body中指定id,那么将应用included jsp body id。这是虫子吗?或者我应该从included.jsp中删除body(不可能是真的)。或者我可以将id添加到base.jsp主体中,这样它就不会被包含的主体替换。

这不是一个bug。这是HTML5解析器的必需行为。发生的情况是,如果解析器遇到第二个body start标记,那么它将查看该第二个body start标记的每个属性,如果body元素(由第一个body start标记创建)没有同名的属性,那么该属性将添加到body元素中

如果解析器遇到更多的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中的规则:,向下搜索标记名为“body”的开始标记,它是该块中的最后一段

。。。[I]是否可以将id添加到base.jsp主体中,这样它就不会被替换为 包含体


根据上述规则,这是会发生的,是的。但是,您首先不应该将一个完整的html文档包含在另一个文档中。累积的标记非常无效,您将受制于各种奇怪的解析器规则,如上面的规则。

尝试使用“查看源代码”而不是Firebug的inspect。我想你会找到你的第二个身体标签。谢谢你提供的详细信息。现在我开始思考,我应该只使用DIV(而不使用HTML标记和BODY标记)来执行HTML文件的“jsp include”