[Seasar-user:1556] id 属性
Tsuyoshi FUKUI
fukui556
2005年 3月 5日 (土) 13:51:13 JST
フクイと申します。
S2JSF RC4 でいろいろ試しているところです。
div 要素の id 属性に関して怪しい挙動を発見しました。
以下のソースが
----------------------------------------------------
<html xmlns:m="http://www.seasar.org/maya">
<body>
<div id="frame">
<div id="header">
header
</div>
<div id="main">
<span m:inject="s:insert" m:name="main"/>
</div>
<div id="footer">
footer
</div>
</div>
</body></html>
----------------------------------------------------
S2JSF の出力ではこうなります。
----------------------------------------------------
<html>
<body>
<div>
<div>
header
</div>
<div>
</div>
<div>
footer
</div>
</div>
</body></html>
----------------------------------------------------
id 属性が全部無くなってしまっています。
この状態でブラウザのリロードボタンを押すと以下のエラーが発生します。
(環境は JBoss 3.2.6(Tomcat5.0.28) です)
----------------------------------------------------
exception
javax.servlet.ServletException: cannot add component 'header'
javax.faces.webapp.FacesServlet.service(FacesServlet.java:125)
org.apache.myfaces.component.html.util.ExtensionsFilter.doFilter(ExtensionsFilter.java:119)
org.seasar.extension.filter.EncodingFilter.doFilter(EncodingFilter.java:47)
org.seasar.framework.container.filter.S2ContainerFilter.doFilter(S2ContainerFilter.java:45)
org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:75)
root cause
javax.faces.FacesException: cannot add component 'header'
javax.faces.webapp.UIComponentTag.findComponent(UIComponentTag.java:428)
javax.faces.webapp.UIComponentTag.doStartTag(UIComponentTag.java:246)
org.seasar.jsf.processor.TagProcessorImpl.processTag(TagProcessorImpl.java:209)
org.seasar.jsf.processor.TagProcessorImpl.process(TagProcessorImpl.java:202)
org.seasar.jsf.processor.ElementProcessor.process(ElementProcessor.java:62)
org.seasar.jsf.processor.TagProcessorImpl.processChildren(TagProcessorImpl.java:254)
org.seasar.jsf.processor.TagProcessorImpl.processTag(TagProcessorImpl.java:210)
org.seasar.jsf.processor.TagProcessorImpl.process(TagProcessorImpl.java:202)
org.seasar.jsf.processor.ElementProcessor.process(ElementProcessor.java:62)
org.seasar.jsf.processor.TagProcessorImpl.processChildren(TagProcessorImpl.java:254)
org.seasar.jsf.processor.TagProcessorImpl.processTag(TagProcessorImpl.java:210)
org.seasar.jsf.processor.TagProcessorImpl.process(TagProcessorImpl.java:202)
org.seasar.jsf.processor.ElementProcessor.process(ElementProcessor.java:62)
org.seasar.jsf.processor.TagProcessorImpl.processChildren(TagProcessorImpl.java:254)
org.seasar.jsf.processor.TagProcessorImpl.processTag(TagProcessorImpl.java:210)
org.seasar.jsf.processor.TagProcessorImpl.process(TagProcessorImpl.java:202)
org.seasar.jsf.processor.ElementProcessor.process(ElementProcessor.java:62)
org.seasar.jsf.processor.TagProcessorImpl.processChildren(TagProcessorImpl.java:254)
org.seasar.jsf.processor.TagProcessorImpl.processBodyTag(TagProcessorImpl.java:228)
org.seasar.jsf.processor.TagProcessorImpl.process(TagProcessorImpl.java:198)
org.seasar.jsf.processor.TagProcessorImpl.process(TagProcessorImpl.java:181)
org.seasar.jsf.processor.ViewProcessor.process(ViewProcessor.java:145)
org.seasar.jsf.runtime.ViewRendererImpl.renderView(ViewRendererImpl.java:79)
org.seasar.jsf.application.S2ViewHandler.renderView(S2ViewHandler.java:98)
org.seasar.jsf.lifecycle.LifecycleImpl.render(LifecycleImpl.java:158)
javax.faces.webapp.FacesServlet.service(FacesServlet.java:110)
org.apache.myfaces.component.html.util.ExtensionsFilter.doFilter(ExtensionsFilter.java:119)
org.seasar.extension.filter.EncodingFilter.doFilter(EncodingFilter.java:47)
org.seasar.framework.container.filter.S2ContainerFilter.doFilter(S2ContainerFilter.java:45)
org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:75)
----------------------------------------------------
ちなみに、入れ子になっている div の外側の id を class に変えると
エラーは出なくなりますが、代わりに div が増殖します。
ソース
----------------------------------------------------
<html xmlns:m="http://www.seasar.org/maya">
<body>
<div class="frame">
<div id="header">
header
</div>
<div id="main">
<span m:inject="s:insert" m:name="main"/>
</div>
<div id="footer">
footer
</div>
</div>
</body></html>
----------------------------------------------------
最初に表示したとき
----------------------------------------------------
<html>
<body>
<div class="frame">
<div>
header
</div>
<div>
</div>
<div>
footer
</div>
</div>
</body></html>
----------------------------------------------------
リロード1回目
----------------------------------------------------
<html>
<body>
<div class="frame">
<div></div><div>
header
</div><div></div>
<div></div><div>
</div>
<div>
footer
</div>
</div>
</body></html>
----------------------------------------------------
リロード2回目
----------------------------------------------------
<html>
<body>
<div class="frame">
<div></div><div></div><div></div><div>
header
</div><div></div><div></div>
<div></div><div>
</div>
<div>
footer
</div>
</div>
</body></html>
----------------------------------------------------
CSS との関係で id 属性を使いたいのですが、
S2JSF の内部処理に余計な干渉をしてしまっているように見えます。
id 属性はこういう風に使うのが正しいんだよ、というのがあれば教えてください。
--
Tsuyoshi FUKUI
Seasar-user メーリングリストの案内