[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 メーリングリストの案内