2 Replies Latest reply on May 15, 2007 7:04 PM by jbossvarun

    How to Stop Ajax4JSF framework to Stop processing through th

    jbossvarun

      Is there a way to stop Ajax4JSF framework going through the following updates.
      It seems like this happens for all Ajax requests or even page refreshes. So any function which evaluates a "value"/"rendered" property of a component will be executed trice (3 times) by the Lifecycle.
      Example:
      I have a page which with the panalGrid:

      <h:panelGrid
      rendered="#{backing_includes_Messages.displayUserMessages}">
      </h:panelGrid>

      The function does a database check to see if it is up. This works fine on page load.
      But, when i try to reload the page (refresh) the same function gets called 3 times for the following actions.
      1.
      AjaxViewRoot.processDecodes(FacesContext) line: 267
      LifecycleImpl.applyRequestValues(FacesContext, PhaseListenerManager) line: 219

      2.
      AjaxViewRoot.processValidators(FacesContext) line: 315
      LifecycleImpl.processValidations(FacesContext, PhaseListenerManager) line: 262

      3.
      AjaxViewRoot.processUpdates(FacesContext) line: 291
      LifecycleImpl.updateModelValues(FacesContext, PhaseListenerManager) line: 302

      As the function does a database hit, i do not want this to happen. Does anyone know if this is a part of how JSF works or it's something Ajax4JSF framework does.

        • 1. Re: How to Stop Ajax4JSF framework to Stop processing throug
          alexsmirnov

          This-is JSF behavior. To avoid unnessesary calls to a database, You can cache value during request, for example - in a request-scope bean :
          faces-config.xml :

           <managed-bean>
           <managed-bean-name>cacheBean</managed-bean-name>
           <managed-bean-class>foo.bar.CacheBean</managed-bean-class>
           <managed-bean-scope>request</managed-bean-scope>
           <managed-property>
           <property-name>rendered</property-name>
           <property-class>boolean</property-class>
           <value>#{backing_includes_Messages.displayUserMessages}</value>
           </managed-property>
           </managed-bean>
          

          <h:panelGrid
          rendered="#{cacheBean.rendered}">
          </h:panelGrid>

          This is a common problem for a most JSF-application developers. For a JSF 2.0 we have a proposal to store rendered, disabled and so on properties in a component, to use same value as for a rendering time.

          • 2. Re: How to Stop Ajax4JSF framework to Stop processing throug
            jbossvarun

            Thanks for the quick response. What you suggested seems to work well. I had other places where i have attached the DB lookups to other properties like:
            <h:graphicImage id="graphicImageHealthCheckDatabase"
            url="#{backing_pages_.healthCheckURL}" />
            Can we not force the Faces Servlet to assume the the response is rendered and skip the next phase of the life cycle?

            Eg:
            use something like this:
            FacesContext.getCurrentInstance().renderResponse()