我对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主体,这样它就不会被包含的主体替换。
答案 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文档包含在另一个中。累积的标记非常无效,你可以接受各种奇怪的解析器规则,如上面那样。