JSF標準メッセージに対するカスタム・メッセージ・テキストについて

JSF標準要約メッセージおよび詳細メッセージをカスタマイズするために、次の処理を実行できます。

JSF標準メッセージ・テキストのオーバーライド

変換および検証エラーに対するJSF標準メッセージをオーバーライドするには、次の処理を実行します。

メッセージ・リソース・バンドルの作成

メッセージ・リソース・バンドルには、JSF標準メッセージ・キーとカスタム・メッセージ・テキストに対するキーと値のペアが含まれている必要があります。リソース・バンドル(アプリケーションのクラスパスに格納)は、PropertyResourceBundleに基づくテキスト・ファイル、またはListResourceBundleを拡張するクラス・ファイルです。このトピックの例では、プロパティ・リソース・バンドルが使用されています。

カスタム・メッセージ・テキストの値部分にパラメータ・プレースホルダを使用して、有効な値を参照できます(例: Please enter a value between {2} and {3}.)。

ローカライズ・メッセージ・バンドルは、適切なロケール文字列表現をベース名に付加することで作成されます。たとえば、ベース・ファイル名がMessages.propertiesの場合、ローカライズ・バンドルはMessages_es.propertiesです。リソース・バンドルおよびローカライズの詳細は、java.util.ResourceBundleに関するJavadoc、およびInternationalization(I18N)に関するSun Developer Networkサイトを参照してください。URLは次のとおりです。

http://java.sun.com/j2se/corejava/intl/index.jsp

例として、標準の必須入力エラー・メッセージを置換するには、次のコードをMessages.propertiesリソース・バンドルに指定します。

javax.faces.component.UIInput.REQUIRED=Please enter a value.
javax.faces.component.UIInput.REQUIRED_detail=A value is required. Please enter a value.    

さらに、次のコードをMessage_es.propertiesに指定します。

javax.faces.component.UIInput.REQUIRED=Some Spanish text.
javax.faces.component.UIInput.REQUIRED_detail=More Spanish text.    

注意: ローカライズ・リソース・バンドルの使用方法の詳細は、「JSFでのローカライズ・データおよびメッセージの使用について」を参照してください。

アプリケーションへのメッセージ・リソース・バンドルの登録

JSF標準メッセージをオーバーライドするには、アプリケーション構成ファイル(faces-config.xml)にメッセージ・バンドルを登録する必要があります。JSF構成エディタを使用してfaces-config.xmlファイルを開きます。<application>要素の下の<message-bundle>要素に、リソース・バンドルへの完全修飾パスを追加します。

次のコード・スニペットは、メッセージ・バンドルを登録する方法を示しています。

<faces-config>
  <application>
    <message-bundle>login.model.Messages</message-bundle>
    ...
  </application>
  ...
</faces-config>    

JSFでは、JSF標準バンドルが検索される前に、登録されているリソース・バンドル内のメッセージが検索されることに注意してください。この方法で、リソース・バンドルで適切なキーを使用して、標準メッセージをオーバーライドできます。

カスタム・メッセージの参照

JSFページで、h:messageまたはh:messagesタグを使用してカスタム・メッセージを表示します。タグの詳細は、「標準JSFメッセージ・タグについて」を参照してください。

メッセージへのフィールド参照情報の追加

JSF標準エラー・メッセージでは、問題に関する説明は提供されますが、メッセージの対象のフォーム・フィールドに関する情報は提供されません。次のコード・スニペットについて考えてみます。

<h:outputText value="Number of items:"/>
<h:inputText id="qtyno" value="#{shopcart.qty}">
  <f:validateLength minimum="1" maximum="5"/>
</h:inputText>    

ユーザーが範囲外の値を入力した場合、標準のJSF検証エラー・メッセージは次のように表示されます。

検証エラー: 指定した属性の値が1から5の間ではありません。

メッセージの対象の入力フィールドに関する情報を追加するには、次の処理を実行します。

汎用属性の設定

汎用コンポーネント属性を使用して、フィールド参照を入力コンポーネントに関連付けます。この汎用属性値に入力フィールドのラベルの値を設定します。

<h:outputText value="Number of items:"/>
<h:inputText id="qtyno" value="#{shopcart.qty}">
  <f:validateLength minimum="1" maximum="5"/>
  <f:attribute name="someRef" value="Number of items:"/>
</h:inputText>    

PhaseListener実装の作成および登録

汎用属性を取得してメッセージに追加するPhaseListener実装を作成します。次に、カスタムのPhaseListener実装をアプリケーション構成ファイル(faces-config.xml)に登録します。

<faces-config>
  <lifecycle>
    <phase-listener>
      com.mycompany.listeners.SomeListener
    </phase-listener>
  </lifecycle>
</faces-config>    

PhaseListener実装によって汎用属性が取得され、メッセージに挿入されます。次に例を示します。

public class SomeListener implements PhaseListener {

  public PhaseId getPhaseId() { 
     return PhaseId.RENDER_RESPONSE; 
  } 

  public void beforePhase(PhaseEvent e) {  
     FacesContext fc = e.getFacesContext(); 
     UIViewRoot root = fc.getViewRoot(); 
     Iterator i = fc.getClientIdsWithMessages();  
     while (i.hasNext()) { 
        String clientId = (String) i.next(); 
        UIComponent c = root.findComponent(clientId); 
        String someRef = 
           (String) c.getAttributes().get("someRef"); 
        if (someRef != null) { 
           Iterator j = fc.getMessages(clientId);  
           while (j.hasNext()) { 
              FacesMessage fm = (FacesMessage) j.next(); 
              fm.setDetail(someRef + ": " + fm.getDetail());  
           }
        }
     }
  }

  public void afterPhase(PhaseEvent e) { 
  }

}      

PhaseListenerインタフェースの詳細は、javax.faces.event.PhaseListenerに関するJavadocを参照してください。


JSF標準エラー・メッセージ・テキストの置換
JSF標準メッセージへのフィールド参照情報の追加