JSF 2.0 で Facelets タグをコメントする方法
今日は、JSF 2.0 の Facelets でコンポーネントタグをコメントする方法をご紹介します。テスト用のコードを記載する際、デバッグ用のコード、もしくはダミーのコードを埋め込んだりする事があるかと思いますが、本番環境での表示には必要ないコンポーネントをコメントする方法を下記に紹介します。
まず、始めに、下記のようなサンプルページを作成してください。

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html">
<h:head>
<title>Facelet Title</title>
</h:head>
<h:body>
<h:commandButton action="#{user.login_dummy}" value="Submit-Dummy"/><br/>
<h:commandButton action="#{user.login}" value="Submit"/>
</h:body>
</html>
CDI の UserBean.java
package jp.co.oracle.cdi;
import java.io.Serializable;
import javax.enterprise.context.SessionScoped;
import javax.faces.application.FacesMessage;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.validator.ValidatorException;
import javax.inject.Named;
@Named("user")
@SessionScoped
public class UserBean implements Serializable{
public void login(){
;
}
public void login_dummy(){
;
}
}
今回は上記コード中の「Submit-Dummy」ボタンをコメントします。何も考えず、通常通り HTML/XML のコメント(<!– –>)を使って下記のようにコメントをして実行してください。
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html">
<h:head>
<title>Facelet Title</title>
</h:head>
<h:body>
<!-- <h:commandButton action="#{user.login_dummy}" value="Submit-Dummy"/><br/> -->
<h:commandButton action="#{user.login}" value="Submit"/>
</h:body>
</html>
すると、下記のようなエラーが表示されます。

致命的: Error Rendering View[/comentSample.xhtml]
javax.el.PropertyNotFoundException: The class ‘jp.co.oracle.cdi.org$jboss$weld$bean-$Users$yt133043$NetBeansProjects$JSFSampleApplication$build$web$-ManagedBean-class_jp$co$oracle$cdi$UserBean_$$_WeldClientProxy’ does not have the property ‘login_dummy’.
警告: StandardWrapperValve[Faces Servlet]: PWC1406: Servlet.service() for servlet Faces Servlet threw exception
これは、通常の XML/HTML のコメントのように、<!– –> でコメントしても JSF 2.0 の実行環境では完全にコメントできていない事を表しています。内部的には、 #{user.login_dummy}の EL式が評価・処理されています。
そこで、JSF のコンポーネントタグをコメントする方法(EL式も含め)を2通り紹介します。
1. <ui:remove> </ui:remove> タグを使用する方法
2. facelets.SKIP_COMMENTS を web.xml に記載する方法
まず、始めの方法は
<ui:remove> タグを使用する方法です。下記の 10 行目〜12 行目のように、コメントしたいコンポーネントを <ui:remove> </ui:remove> でくくってください。
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets">
<h:head>
<title>Facelet Title</title>
</h:head>
<h:body>
<ui:remove>
<h:commandButton action="#{user.login_dummy}" value="Submit-Dummy"/><br/>
</ui:remove>
<h:commandButton action="#{user.login}" value="Submit"/>
</h:body>
</html>
コメントした後、画面を再描画すると「Submit-Dummy」のコマンドが非表示になっている事を確認できます。

この時の描画されたページの HTML ソースコードは下記のようになります。
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<link rel="stylesheet" type="text/css" href="/JSFSampleApplication/primefaces_resource/2.1/skins/sam/skin.css" />
<title>Facelet Title</title>
</head>
<body>
<input type="submit" name="j_idt7" value="Submit" />
</body>
</html>
次にもう一つの方法は、
web.xml 設定ファイルに facelets.SKIP_COMMENTS を記述する方法です。下記の7 行目〜10 行目のように web.xml に facelets.SKIP_COMMENTS を追加してください。すると<!– –> でくくられた箇所が EL 式も評価されずコメントされる事が確認できます。
web.xml 設定ファイルの編集:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<context-param>
<param-name>javax.faces.PROJECT_STAGE</param-name>
<param-value>Production</param-value>
</context-param>
<context-param>
<param-name>facelets.SKIP_COMMENTS</param-name>
<param-value>true</param-value>
</context-param>
...

この時の HTML の出力結果は下記のようになります。
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<link rel="stylesheet" type="text/css" href="/JSFSampleApplication/primefaces_resource/2.1/skins/sam/skin.css" />
<title>Facelet Title</title>
</head>
<body>
<input type="submit" name="j_idt7" value="Submit" />
</body>
</html>
どちらの方法を使用してもコメントができるようになりますので、開発者の皆様の使い勝手の良い方法を選択してください。
Entry filed under: Application Server/GlassFish, GlassFish, Java.
