2010-11-30 61 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:messages`上,而不是在特定的`h:message`上。你确定你需要它吗?那么你想展示什么?什么是功能要求?也许有更好的方法。 – BalusC 2010-11-30 16:09:13

+0

我想(根据输入字段的内容显示验证消息)。如果(在模糊事件之后)文本字段的内容被认为是有效的,则应该显示诸如“OK”的消息,如果内容无效,则应该显示验证错误。 – perdian 2010-11-30 19:49:10

回答

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如下(不,不幸的是,没有JSF 2.0注解的PhaseListeners)。

<lifecycle> 
    <phase-listener>com.example.MessagePhaseListener</phase-listener> 
</lifecycle> 

您可能想参数化“OK!”消息在phaselistener。