Faceletsにコメント文を書く

FaceletsのXHTMLにコメントを書く時に少しはまったのでメモ。(以下のコードはJBossAS7.1で確認)

うまくいかない例 (HTMLコメントをそのまま使う)

コマンドボタンを以下のようにコメントアウトすると、Submitしたときではなく、ボタンを含むページを開いたときの『RENDER_RESPONSE』フェーズでaction属性に設定したアクションが実行されてしまう。

<!-- うまくいかないコメント例 -->
<!--
  <h:commandButton styleClass="btn" 
      action="#{userManageController.changePassword()}" value="コメント"/>
-->

上記の例では、action属性に設定されたuserManageController.changePassword()が呼ばれてしまう。
生成されたHTMLを見ると、エンコードされた状態でコメントアウトはされているように見える。

<!-- うまくいかないコメント例から生成されたHTML -->
<!--
  &lt;h:commandButton styleClass=&quot;btn&quot; action=&quot;&quot&value=&quot;&#12467;&#12513;&#12531;&#12488;&quot;/&gt;
-->

見ためはコメントアウトされているが、JSF上ではページにコンポーネントが存在すると管理されてしまうようだ。

うまくいく例(<ui:remove>の使用)

JBossSeamのFAQ*1に解決策が載ってたので、試してみた。

Faceletsでコメントアウトする場合は<ui:remove>タグで囲うとうまくいく。<ui:remove>で囲うと、生成されたHTMLページには全く表示されなくなる。(コメントとしても出力されない)

<ui:remove>
  <h:commandButton styleClass="btn" 
      action="#{userManageController.changePassword()}" value="コメント"/>
</ui:remove>

また、web.xmlに以下の設定を加えることで通常のHTMLコメントを使ってコメントアウトすることもできる。こちらも<ui:remove>と同様に、コメントアウトした部分はページに出てこなくなるのが特徴だ。

<context-param>
   <param-name>facelets.SKIP_COMMENTS</param-name>
   <param-value>true</param-value>
</context-param>

web.xmlにfacelets.SKIP_COMMENTSを定義するやり方の方が直感的で嬉しい。

*1:http://www.seamframework.org/Documentation/HowDoICommentOutBlocksOfMarkupInFacelets