【问题标题】:Preserve JSF messages between AJAX calls在 AJAX 调用之间保留 JSF 消息
【发布时间】:2011-06-21 18:12:02
【问题描述】:

有一个 JSF 1.2 页面,上面有 <rich:messages><a4j:poll> 组件。当一条消息放在FacesContext 中时,它只会短暂显示,直到轮询发送下一个请求。是否可以跨 AJAX 请求保留消息?

【问题讨论】:

    标签: java ajax jsf richfaces


    【解决方案1】:

    可能,但您需要自己保存消息。 JSF 中的消息是请求范围的,因此在请求之间被清除。

    【讨论】:

      【解决方案2】:

      将以下内容添加到您的 facelets:

      <ui:define name="metadata">
        <f:event type="preRenderView" listener="#{ajaxBacking.displayMessages}" />
      </ui:define>
      

      创建一个支持 bean 以通过 ajax 调用持久化消息:

      @ManagedBean
      @ViewScoped
      public class AjaxBacking {
      
      Map<String, List<FacesMessage>> messages;
      
      public AjaxBacking(){
          messages = new HashMap<String, List<FacesMessage>>();
      }
      
      public static AjaxBacking getCurrentInstance() {
          AjaxBacking ajaxBacking = null;
          FacesContext context = FacesContext.getCurrentInstance();
          if ((ajaxBacking = (AjaxBacking) context.getViewRoot().getViewMap().get("ajaxBacking")) == null){
              ajaxBacking = (AjaxBacking)context.getApplication().evaluateExpressionGet(context,"#{ajaxBacking}",AjaxBacking.class);
          }
          return ajaxBacking;
      }
      
      public void displayMessages(){
          FacesContext facesContext = FacesContext.getCurrentInstance();
          for (String component : messages.keySet()){
              for (FacesMessage message : messages.get(component)) {
                  if (!facesContext.getMessageList(component).contains(message)){
                      facesContext.addMessage(component, message);
                  }
              }
          }
      }
      
      public void putMessages(String component, List<FacesMessage> facesMessage){
          List<FacesMessage> messages = new ArrayList<FacesMessage>();
          for (FacesMessage message : facesMessage) messages.add(message);
          this.messages.put(component, messages);
      }
      
      public Map<String, List<FacesMessage>> getMessages() {
          return messages;
      }
      }
      

      最后将这一行添加到任何添加 FacesMessage 的 bean 方法的底部。

      AjaxBacking.getCurrentInstance().putMessages(messages,facesContext.getMessageList(messages);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-12-05
        • 1970-01-01
        • 2011-12-14
        • 1970-01-01
        • 2012-09-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多