2010-11-30 8 views
2

私はJSFで次のスイッチを達成する方法を探しています:h:メッセージが空の場合のデフォルト出力

 ... 
<div> 
    if empty(<h:message for="x">) 
    <h:outputText value="default value" /> 
    else 
    <h:message for="x" /> 
    endif 
</div> 
.... 

任意のアイデア?

+1

これは、特定の 'h:message'ではなく' h:messages'でのみ可能です。あなたはそれを必要としていると確信していますか?何を見せたいですか?機能要件は何ですか?多分もっと良い方法があるかもしれません。 – BalusC

+0

私は入力フィールドの内容に基づいて検証メッセージを(再)提示したいと思います。テキストフィールドの内容が有効であると見なされた場合(ぼかしイベントの後)、 "OK"のようなメッセージが表示されます。コンテンツが無効である場合、検証エラーが表示されます。 – perdian

+0

私はあなたが意味するものを得ます。しかし、JSFはそのための標準的な機能をサポートしていません。それはかなり複雑になるかもしれません。ところで、自分以外の投稿のコメント返信について他人に知らせるためには、@ニックネームを使用してください。 [this post](http://meta.stackexchange.com/questions/43019/how-do-comment-replies-work)も参照してください。 – BalusC

答えて

2

これはPhaseListenerの助けを借りて行うことができます。

ビューは、衝撃的ではないように見えますが、blurイベントをフックするすべての入力コンポーネントには<f:ajax>があり、入力フィールドがフォーカスを失ったときにすぐにメッセージコンポーネントを再描画します。

<!DOCTYPE html> 
<html lang="en" 
    xmlns:f="http://java.sun.com/jsf/core" 
    xmlns:h="http://java.sun.com/jsf/html" 
    xmlns:ui="http://java.sun.com/jsf/facelets"> 
    <h:head> 
     <title>Stackoverflow question 4313917</title> 
     <style>.info { color: green; } .error { color: red; }</style> 
    </h:head> 
    <h:body> 
     <h:form> 
      <h:panelGrid columns="3"> 
       <h:outputLabel for="input1">Input 1</h:outputLabel> 
       <h:inputText id="input1" value="#{bean.input1}" required="true"> 
        <f:ajax event="blur" render="input1message" /> 
       </h:inputText> 
       <h:message id="input1message" for="input1" infoClass="info" errorClass="error" /> 

       <h:outputLabel for="input2">Input 2</h:outputLabel> 
       <h:inputText id="input2" value="#{bean.input2}" required="true"> 
        <f:ajax event="blur" render="input2message" /> 
       </h:inputText> 
       <h:message id="input2message" for="input2" infoClass="info" errorClass="error" /> 

       <h:outputLabel for="input3">Input 3</h:outputLabel> 
       <h:inputText id="input3" value="#{bean.input3}" required="true"> 
        <f:ajax event="blur" render="input3message" /> 
       </h:inputText> 
       <h:message id="input3message" for="input3" infoClass="info" errorClass="error" /> 

       <h:panelGroup /> 
       <h:commandButton value="Submit" action="#{bean.submit}" /> 
       <h:panelGroup /> 
      </h:panelGrid> 
     </h:form> 
    </h:body> 
</html> 

豆は、それ自体のために話す:3つのプロパティinput1input2input3void submit()方法。あなたのIDEがボイラープレートを自動生成するようにしてください。ここで

PhaseListenerです:

package com.example; 

import javax.faces.application.FacesMessage; 
import javax.faces.component.UIComponent; 
import javax.faces.component.UIInput; 
import javax.faces.component.UIViewRoot; 
import javax.faces.context.FacesContext; 
import javax.faces.event.PhaseEvent; 
import javax.faces.event.PhaseId; 
import javax.faces.event.PhaseListener; 

public class MessagePhaseListener implements PhaseListener { 

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

    @Override 
    public void beforePhase(PhaseEvent event) { 
     FacesContext facesContext = event.getFacesContext(); 
     if (facesContext.isPostback()) { 
      UIViewRoot viewRoot = facesContext.getViewRoot(); 
      for (String clientId : facesContext.getExternalContext().getRequestParameterMap().keySet()) { 
       UIComponent component = viewRoot.findComponent(clientId); 
       if (component instanceof UIInput && !facesContext.getMessages(clientId).hasNext()) { 
        facesContext.addMessage(clientId, new FacesMessage(FacesMessage.SEVERITY_INFO, "OK!", null)); 
       } 
      } 
     } 
    } 

    @Override 
    public void afterPhase(PhaseEvent event) { 
     // NOOP. It's too late anyway. 
    } 

} 

faces-config.xmlに次のように(いや、残念ながら、phaselistenersにはJSF 2.0注釈が存在しない)、それを登録します。

"OK!" phaselistenerのメッセージ。

+0

このphaseListenerを特定のページに適用する方法を指定しますか? –

+0

HttpServletRequestリクエスト=(HttpServletRequest)phaseEvent.getFacesContext()。getExternalContext()。getRequest(); request.getRequestURI()。startWithまたは.endsWidthまたは.equals –

関連する問題