如何获得wickets反馈消息计数

时间:2014-02-27 06:37:36

标签: java session wicket

我正在实现AjaxRequestTarget.IListener。因此,如果有任何消息,我的应用程序会自动更新FeedbackPanel。我想检查一下我的代码是否有任何消息:

        getAjaxRequestTargetListeners().add(new AjaxRequestTarget.IListener() {

        @Override
        public void onBeforeRespond(Map<String, Component> map,
                final AjaxRequestTarget target) {

            WebSession.get().getFeedbackMessages(); // Doesnt work
            target.getPage().getSession().getFeedbackMessages(); // Doesnt work
            target.getPage().visitChildren(IFeedback.class, new IVisitor<Component, Void>() {

                @Override
                public void component(Component component, IVisit<Void> visit) {
                    if (component.isVisibleInHierarchy()) {
                        target.add(component);
                    }
                }
            });
        }

        @Override
        public void onAfterRespond(Map<String, Component> map, AjaxRequestTarget.IJavaScriptResponse response) {
        }
    });

3 个答案:

答案 0 :(得分:1)

试试这个:

target.getPage().visitChildren(FeedbackPanel.class, new IVisitor<FeedbackPanel, Void>() {
    @Override
    public void component(FeedbackPanel component, IVisit<Void> visit) {
        if (component.isVisibleInHierarchy() && component.anyMessage()) {
            target.add(component);
        }
    }
});

component.getFeedbackMessages()仅返回添加到该组件的消息。它没有考虑添加到其他组件或会话消息的消息(即Session.get().error(...)

这是我个人使用而不是请求监听器:

public class CustomFeedbackPanel extends FencedFeedbackPanel {

    [...]

    @Override
    public void onEvent(IEvent<?> event) {
        // Always re-render the feedback panel input during ajax requests if it contains messages
        if (event.getPayload() instanceof AjaxRequestTarget && anyMessage()) {
            ((AjaxRequestTarget) event.getPayload()).add(this);
        }
    }
}

请注意,将反馈面板添加到ajax请求会删除客户端上先前显示的反馈消息。

修改

我意识到我没有回答问题标题中提出的问题,但找到了所述问题的另一种解决方案。

因此,要获取消息计数,可以使用以下受保护方法: List<FeedbackMessage> FeedbackPanel#getCurrentMessages()

答案 1 :(得分:0)

如果您使用Wicket 6,反馈消息的存储已从会话更改为组件:https://cwiki.apache.org/confluence/display/WICKET/Migration+to+Wicket+6.0#MigrationtoWicket6.0-FeedbackStorageRefactoring

因此,如果您使用Wicket 6,则可以检查组件应实现的IVisitor中的反馈消息数IFeedback,其中方法getCurrentMessages()返回List特定IFeedback组件的反馈消息

答案 2 :(得分:0)

在您的基本Web应用程序init()方法中,添加一个ajax监听器将有所帮助:

protected void init() {  
super.init();  
//...  
this.getAjaxRequestTargetListeners().add(new AjaxRequestTarget.IListener() {   
public void onBeforeRespond(Map map, final AjaxRequestTarget target) {   
// DO THIS
 target.getPage().visitChildren(FeedbackPanel.class,
  new IVisitor<FeedbackPanel, Void>() {
    public void component(FeedbackPanel component, IVisit<Void> visit) {
        if (component.isVisibleInHierarchy() && component.anyMessage()) {
            target.add(component);

        }
                    visit.dontGoDeeper();
        }
    });
}