包含HTML正文的JSP包含HTML BODY标签吗?
我对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主体,这样它就不会被包含的主体取代。
这不是一个错误。这是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文档包含在另一个文件中。累积的标记是非常无效的,而且你可以像上面那样解释各种奇怪的解析器规则。
感谢您的详细信息。我现在让我开始思考我应该只用DIV(不带HTML标签和BODY标签)来做HTML文件的“jsp include”。 – 2012-01-30 00:37:00
尝试“查看源代码”而不是Firebug的检查。我想你会找到你的第二个BODY标签。 – Matthew 2012-01-27 11:15:16