2012-01-08 16 views
5

Una página/frijol mío tiene su caso preRenderView disparó dos veces en la primera carga de la página a continuación 2 + n veces para cada devolución de datos, donde n es el número de devoluciones (incluyendo la actual) que se han producido.JSF preRenderView llamado demasiadas veces

Después de leer algunas otras publicaciones aquí, moví <f:event type="preRenderView" listener="myBean.preRenderView"/> fuera de <f:metadata/> y eso redujo el número de llamadas a en una. Es decir, se llama una vez en la carga de página completa y 1 + n veces para cada devolución. Incluso traté de mover la etiqueta <f:event/> fuera de <f:view/>, pero no tuvo ningún efecto.

No estoy seguro si esto es relevante: la página utiliza una plantilla:

<!DOCTYPE html> 
<html xmlns="http://www.w3.org/1999/xhtml" 
     xmlns:h="http://java.sun.com/jsf/html" 
     xmlns:ui="http://java.sun.com/jsf/facelets" 
     xmlns:f="http://java.sun.com/jsf/core" 
     xmlns:fb="http://www.facebook.com/2008/fbml"> 
    <f:view contentType="text/html"> 
     <ui:insert name="metadata"/> 
     <h:head> 
      <!-- Some stuff here --> 
      <ui:insert name="content"/> 
      <!-- More stuff here --> 
     </h:head> 
     <h:body> 
     </h:body> 
    </f:view> 
</html> 

y los bits correspondientes de la página:

<html xmlns="http://www.w3.org/1999/xhtml" 
     xmlns:h="http://java.sun.com/jsf/html" 
     xmlns:f="http://java.sun.com/jsf/core" 
     xmlns:ui="http://java.sun.com/jsf/facelets"> 
    <h:head> 
     <title></title> 
    </h:head> 
    <h:body> 
     <ui:composition template="/WEB-INF/templates/myLayout.xhtml"> 
      <ui:define name="windowTitle">My Page</ui:define> 
      <ui:define name="metadata"> 
       <f:event type="preRenderView" listener="#{myBean.preRenderView}"/> 
      </ui:define> 
      <ui:define name="content"> 
       <!-- Some content here --> 
       <h:panelGroup id="reRenderable" layout="block"> 
        <!-- More content here --> 
        <h:form prependId="false"> 
         <h:outputLabel for="mySelector" value="Item:"/> 
         <h:selectOneMenu id="mySelector" 
             value="#{myBean.item}" 
             converter="#{myConverter}" 
             validator="#{itemActiveValidator.validate}"> 
          <f:selectItems value="#{myBean.myItems}"/> 
          <f:ajax render=":reRenderable"/> 
         </h:selectOneMenu> 
        </h:form> 
        <!-- More content here --> 
       </h:panelGroup> 
       <!-- More content here --> 
      </ui:define> 
     </ui:composition> 
    </h:body> 
</html> 

Respuesta

5

Parece que otro error Mojarra: JAVASERVERFACES-2162

me aplicó la solución de la siguiente manera y funciona:

<ui:define name="metadata"> 
    <f:metadata> 
     <f:viewParam name="dummy"/> 
     <f:event type="preRenderView" listener="#{myRecordsBean.preRenderView}"/> 
    </f:metadata> 
</ui:define> 

Todo lo que queda por hacer es presionar dummy hasta la plantilla para mantener las páginas que lo usan libres de esta suciedad.

+3

Eso es un error desagradable :(Si usted, o cualquier otra persona, molesta por esto, vote por el insecto. –

+1

ya lo hicieron. Voy a través de insectos Mojarra salta a la vista con mayor frecuencia últimamente. No es como si estuviera tratando de calzar diseños exóticos y casos de uso extraños en el marco. –

+3

Tienes razón, aunque para ser honesto me encuentro con errores evidentemente obvios en casi todos los programas que uso (Hibernate, Firefox, tu nombre it) :( –

-1

tratar

@ManagedBean 
@XScoped --sessionScope,viewScope 
Public class MyRecordsBean{ 
public void preRenderView(){ 
if (!FacesContext.getCurrentInstance().isPostback(){ 
//put initView codes here 
} 

}

+0

Creo que no entendiste el problema concreto. – BalusC

+0

@BalusC tiene razón. Este problema ocurre con las devoluciones, por lo tanto, su verificación de devolución pasará por cada evento duplicado. Tu respuesta resuelve el problema * a *, simplemente no esta. -1 –

+0

Ok. Tienes razón. Extraño leer 2 + n veces por cada parte de la devolución. –

-1

probar esto. No sé las diferencias técnicas entre tu código y el mío a continuación. Cambié la ubicación <ui:insert name="content"/> entre las etiquetas del cuerpo de las etiquetas de la cabeza. Y agregue f:metadata. Pero cuando uso así, esto no me llama dos veces. Funciona bien. puede tratarse de la estructura de la página. Tal vez sobre el uso de la etiqueta html dos veces. Usted necesita uno. Pero las páginas completas faltan partes, solo faltan partes con bloques de composición.

<!DOCTYPE html> 
    <html xmlns="http://www.w3.org/1999/xhtml" 
     xmlns:h="http://java.sun.com/jsf/html" 
     xmlns:ui="http://java.sun.com/jsf/facelets" 
     xmlns:f="http://java.sun.com/jsf/core" 
     xmlns:fb="http://www.facebook.com/2008/fbml"> 

    <f:view contentType="text/html"> 
     <f:metadata> 
      <ui:insert name="metadata"/> 
      </f:metadata> 


     <h:body> 
       <!-- Some stuff here --> 
       <ui:insert name="content"/> 
       <!-- More stuff here --> 
     </h:body> 
    </f:view> 
    </html> 




<?xml version="1.0" encoding="UTF-8"?> 
<ui:composition xmlns="http://www.w3.org/1999/xhtml" 
      xmlns="http://www.w3.org/1999/xhtml" 
       xmlns:h="http://java.sun.com/jsf/html" 
       xmlns:f="http://java.sun.com/jsf/core" 
       xmlns:ui="http://java.sun.com/jsf/facelets" 
       template="/WEB-INF/templates/myLayout.xhtml"> 




     <ui:define name="windowTitle">My Page</ui:define> 
     <ui:define name="metadata"> 
      <f:event type="preRenderView" listener="#{myBean.preRenderView}"/> 
     </ui:define> 
     <ui:define name="content"> 
      <!-- Some content here --> 
      <h:panelGroup id="reRenderable" layout="block"> 
       <!-- More content here --> 
       <h:form prependId="false"> 
        <h:outputLabel for="mySelector" value="Item:"/> 
        <h:selectOneMenu id="mySelector" 
            value="#{myBean.item}" 
            converter="#{myConverter}" 
            validator="#{itemActiveValidator.validate}"> 
         <f:selectItems value="#{myBean.myItems}"/> 
         <f:ajax render=":reRenderable"/> 
        </h:selectOneMenu> 
       </h:form> 
       <!-- More content here --> 
      </h:panelGroup> 
      <!-- More content here --> 
     </ui:define> 
    </ui:composition> 
+0

No tiene nada que ver con incluir la etiqueta html tanto en la plantilla como en la página que la usa. Todo lo que está fuera de '' se ignora. –

+0

Cosas que dije sobre ui: el comp puede ser un problema. Pero cambio real que hice en el código si miras con cuidado. Puse su '' en f: etiqueta de metadatos y moví su contenido de cabeza a cuerpo.Funciona perfecto en may caso. Creo que se trata de f: metadatos. ¿Puedes intentar? Si esto no funciona, no escribo nada prometedor :-) –

+0

Desafortunadamente, no puede poner '' en la plantilla. La especificación dice mucho y puedo decirte por experiencia de primera mano (como parte de la investigación de la respuesta a esta pregunta) simplemente no funciona en Mojarra. De lo contrario, definitivamente haría eso y pondría la solución alternativa (parámetro de vista 'dummy') en la plantilla. –

Cuestiones relacionadas