JavaServer Faces (JSF) - отображение пользовательских ошибок проверки - PullRequest
0 голосов
/ 04 апреля 2011

В JSF вы можете отображать ошибки проверки, используя <h:messages />. Но я хочу отобразить эти сообщения, используя Jnofity (http://www.givainc.com/labs/jnotify_jquery_plugin.htm).

Я пытался использовать <script>$.jnotify(<h:messages />, 'error');</script>, но это приводит к тому, что ничего не отображается, чем ... Может быть, использование пользовательского компонента является лучшим решением для этого? Или есть другие?

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 04 апреля 2011

Вы можете использовать дополнительный вспомогательный компонент, который будет проверять наличие сообщений проверки:

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 или аналогичный, чтобы включить параметризованные методы.

0 голосов
/ 04 апреля 2011

Используйте компонент <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;

  }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...