【问题标题】:Is it possible to automatically re-render h:messages on all AJAX calls with JSF2?是否可以使用 JSF2 在所有 AJAX 调用上自动重新渲染 h:messages?
【发布时间】:2014-03-21 16:58:15
【问题描述】:

我在我的 JSF2 项目的每个页面上都使用了一个 h:messages 标记来显示全局消息。我也主要使用 AJAX 来更新页面内容。就像现在一样,我必须在每个 AJAX 标记的“render”属性中包含 h:messages 标记的 ID,以便它显示由于该 AJAX 调用而出现的任何消息。我想知道,有没有什么方法可以让自己免于对每个 AJAX 标记执行此操作,而只是告诉它始终在任何 AJAX 调用时自动刷新消息?

【问题讨论】:

    标签: ajax jsf-2 messages jsf-2.2


    【解决方案1】:

    最简单的方法是使用 Primefaces 及其<p:messages /> 组件。使用autoUpdate="true" 让您有机会每次都更新消息组件。

    或者,如果不打算使用 Primefaces 并且希望避免每次都必须声明 h:messages id,则可以使用后端更新。只需实现一个 JSF PhaseListener,它会监听 INVOKE_APPLICATION 阶段并在它发生后呈现您的组件:

    public class JsfPhaseListener implements PhaseListener {
    
        @Override
        public void afterPhase(PhaseEvent event) {
            FacesContext.getCurrentInstance().getPartialViewContext()
                    .getRenderIds().add("header:messages");
        }
    
        @Override
        public void beforePhase(PhaseEvent event) {
    
        }
    
        @Override
        public PhaseId getPhaseId() {
            return PhaseId.INVOKE_APPLICATION;
        }
    
    }
    

    这将导致您的 header:messages 组件在您发出的每个请求上都呈现。

    另请参阅:

    【讨论】:

    • Richfaces <rich:messages ajaxRendered="true" /> - 标签:showcase.richfaces.org/richfaces/… 也是如此
    • 我没有使用primefaces,所以我使用了相位监听器方法,效果很好!谢谢!
    • 很高兴看到它适合您的情况!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-01
    • 2020-02-19
    • 1970-01-01
    • 2017-09-23
    • 1970-01-01
    • 1970-01-01
    • 2017-03-06
    相关资源
    最近更新 更多