Jsf 如何通过不同的请求保存所有FacesMessage

Jsf 如何通过不同的请求保存所有FacesMessage,jsf,richfaces,jsf-1.2,faces-config,Jsf,Richfaces,Jsf 1.2,Faces Config,我只是想实现一种日志显示给用户,应用程序中的所有消息都会一直显示给用户 由于我使用了JSF1.2和RF 3.3.3,我想知道是否有可能保存由不同请求添加的所有消息,并将它们显示给用户,以便用户知道他所做操作的历史记录。支持团队分析问题的原因也很有用,如果需要模拟或调试,他可以将消息发送给开发人员 我还知道facesmessages会在不同的请求中被清除,这就是我的问题所在,可以在不同的请求中保存消息:) 可以通过不同的方式进行处理,保存它们是一个会话变量等等…我希望所有可能的答案您可以在渲染响应

我只是想实现一种日志显示给用户,应用程序中的所有消息都会一直显示给用户

由于我使用了JSF1.2和RF 3.3.3,我想知道是否有可能保存由不同请求添加的所有消息,并将它们显示给用户,以便用户知道他所做操作的历史记录。支持团队分析问题的原因也很有用,如果需要模拟或调试,他可以将消息发送给开发人员

我还知道facesmessages会在不同的请求中被清除,这就是我的问题所在,可以在不同的请求中保存消息:)


可以通过不同的方式进行处理,保存它们是一个会话变量等等…我希望所有可能的答案

您可以在渲染响应期间收集所有消息。例如


非常感谢您的建议,它很有效,很抱歉花了很长时间来实施和测试此建议;)
public class MessagesListener implements PhaseListener {

    @Override
    public PhaseId getPhaseId() {
        return PhaseId.RENDER_RESPONSE;
    }

    @Override
    public void beforePhase(PhaseEvent event) {
        FacesContext context = event.getFacesContext();
        Iterator<String> clientIds = context.getClientIdsWithMessages();

        while (clientIds.hasNext()) {
            String clientId = clientIds.next();
            Iterator<FacesMessage> messages = context.getMessages(clientId);

            while (messages.hasNext()) {
                FacesMessage message = messages.next();
                save(clientId, message); // Do your job here.
            }
        }
    }

    @Override
    public void afterPhase(PhaseEvent event) {
        // NOOP.
    }

}
<lifecycle>
    <phase-listener>com.example.MessagesListener</phase-listener>
</lifecycle>