【问题标题】:JavaServer Faces (JSF) - Custom validation error displayingJavaServer Faces (JSF) - 自定义验证错误显示
【发布时间】:2011-07-28 19:32:45
【问题描述】:

在 JSF 中,您可以使用 <h:messages /> 显示验证错误。但我想做的是使用 Jnofity (http://www.givainc.com/labs/jnotify_jquery_plugin.htm) 显示这些消息。

我试过使用<script>$.jnotify(<h:messages />, 'error');</script>,但结果是什么都没有显示……也许使用自定义bean是最好的解决方案?还是有其他的?

提前致谢!

【问题讨论】:

    标签: jquery validation jsf


    【解决方案1】:

    使用<h:outputText/> 组件。

    <h:outputText value="<script>$.jnotify('#{myBean.errorMessage}');</script>"
                  escape="false" 
                  rendered="#{myBean.renderErrorMessage}"/>
    

    在你的 BackingBean 中

    public class MyBean {
    
      private String errorMessage = "";
      private bolean renderErrorMessage = false;
    
      public String doSomethingWrong(){
    
      //Something wrong goes here
    
      this.errorMessage = "Something Wrong Happened";
      this.renderErrorMessage = true;
    
      return null;
    
      }
    
    }
    

    【讨论】:

      【解决方案2】:

      您可以使用额外的辅助 bean 来检查验证消息:

      public class MessagesBean {
      
          public List<FacesMessage> forComponent(String id) {
              FacesContext  context = FacesContext.getCurrentInstance();
              UIViewRoot viewRoot = getContext().getViewRoot();       
      
              UIComponent component = findComponent(viewRoot, id, UIComponent.class);
      
              if(component instanceof UIForm) {
                  return getMessagesRecursively(component);
              }
      
              return forComponent(context, component);
          }
      
          public List<FacesMessage> forComponent(FacesContext context, UIComponent component) {
              List<FacesMessage> messages = new ArrayList<FacesMessage>();
      
              if(component != null) {
                  Iterator<FacesMessage> msgItr = context.getMessages(component.getClientId(context));
      
                  while(msgItr.hasNext()) {
                      messages.add(msgItr.next());
                  }
              }
      
              return messages;
          }
      
          private List<FacesMessage> getMessagesRecursively(UIComponent parent) {
              List<FacesMessage> messages = new ArrayList<FacesMessage>();
      
              if(parent != null) {
                  FacesContext context = getContext();
                  Iterator<FacesMessage> msgItr = context.getMessages(parent.getClientId(context));
      
      
                  while(msgItr.hasNext()) {
                      messages.add(msgItr.next());
                  }
      
                  if(parent.getChildCount() > 0) {
                      for (UIComponent child : parent.getChildren()) {
                          List<FacesMessage> childMesssages = getMessagesRecursively(child);
      
                          if(childMesssages.size() > 0) {
                              messages.addAll(childMesssages);
                          }
                      }
                  }
              }
      
              return messages;
          }
      
          private <T> T findComponent(UIComponent base, String id, Class<T> returnType) {
              if (id.equals(base.getId())) {
                  return returnType.cast(base);
              }
      
              Iterator<UIComponent> children = base.getFacetsAndChildren();
      
              while (children.hasNext()) {
                  T component = findComponent(children.next(), id, returnType);
      
                  if (component != null) {
                      return returnType.cast(component);
                  }
              }
      
              return null;
          }   
      
      }
      

      然后,测试表单或特定组件是否有消息:

      <ui:composition xmlns="http://www.w3.org/1999/xhtml"
          xmlns:ui="http://java.sun.com/jsf/facelets"
          xmlns:f="http://java.sun.com/jsf/core"
          xmlns:h="http://java.sun.com/jsf/html"
          xmlns:c="http://java.sun.com/jstl/core"
          template="/WEB-INF/template/jnotify.xhtml">
      
          <ui:param name="title" value="jnotify with jsf"/>
      
          <ui:define name="content">
              <h:form id="frmTest">
                  <h:outputText value="Submitted Text: #{not empty testBean.text ? testBean.text : 'N/A'}"/><br/>
                  <h:inputText id="txtTest" required="true" 
                      value="#{testBean.text}"/>
                  <h:commandButton value="Submit"/>
                  <script type="text/javascript">
                      <c:forEach items="#{messagesBean.forComponent('frmTest')}" var="message">
                          $.jnotify("#{message.summary}", "#{message.severity}");
                      </c:forEach>
                  </script>
              </h:form>
          </ui:define>
      </ui:composition>
      

      如果您使用的是 JSF 1.2,您将需要 jboss-el 或类似的东西来启用参数化方法。

      【讨论】:

        猜你喜欢
        • 2011-08-02
        • 1970-01-01
        • 2010-11-23
        • 1970-01-01
        • 1970-01-01
        • 2013-04-08
        • 2016-07-23
        • 2021-08-12
        • 1970-01-01
        相关资源
        最近更新 更多