2012-01-27 17 views
2

私は、JSPインクルードタグの動作と混同しています。起こっているのは、ベースページのbodyタグに含まれているJSPのid属性があるということです。JSPにはHTMLボディオーバーライドが含まれている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に行く、放火犯はOKですが、ことを示しているだけで1個のbodyタグを検索しますHTML BODYタグのid属性は「includeBody」

結果:ID指定とinclude.jspは、IDと本体を有することなく

<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は本体を有します。私がbase.jspの本体にidを指定しない場合は、jsp body idが適用されます。これはバグですか?または、included.jspから本文を削除する必要があります(これは真実ではありません)。または、idをbase.jsp本体に追加して、含まれている本体に置き換えられないようにすることもできます。

+0

Firebugの検査ではなく、 "ソースの表示"を試みてください。私はあなたがそのように2番目のBODYタグを見つけるだろうと思う。 – Matthew

答えて

2

これはバグではありません。 HTML5パーサーの動作が必要です。パーザが2番目のボディ開始タグに遭遇すると、その2番目のボディ開始タグの各属性を調べ、(最初のボディ開始タグによって作成された)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" とクラス= "エラー" とスタイルは= "色:赤" を持つことになります。

HTML5のルールがここに指定されています:http://dev.w3.org/html5/spec/tree-construction.html#parsing-main-inbodyA start tag whose tag name is "body"を検索し、そのブロックの最後の段落です。

...それは上記のルールによると 含ま体

に置き換え得ることはありませんので、[I]はbase.jsp本体にIDを追加することができ、それは何が起こるかです、はい。しかし、あなたは最初の場所のような別のHTML文書全体を含むべきではありません。蓄積されたマークアップはひどく無効で、上記のような奇妙なパーサーのルールのすべての種類の慈悲に満ちています。

+0

詳細情報をありがとうございます。私は今、私はちょうどDIV(HTMLタグとBODYタグではない)だけでHTMLファイルの "jspインクルード" –

関連する問題