jsf - pass - Proceso f: viewParam solo en la carga de la página
jsf pass parameter between pages (1)
Puede lograrlo creando una etiqueta personalizada que <f:viewParam>
en la que almacene el valor enviado como una variable de instancia que no está almacenada en el estado de vista JSF en lugar de en el estado de vista JSF como <f:viewParam>
de forma predeterminada hace. Al final de la solicitud, todas las instancias de componentes de UI se destruyen. Se vuelven a crear al comienzo de la solicitud. Cuando el valor enviado es null
, no llamará al convertidor ni al establecedor del modelo. Todo esto está elaborado en el blog de Arjan Tijms .
OmniFaces ofrece ya desde la versión 1.0 una solución lista para usar en el sabor de <o:viewParam>
, vea también mi propio blog sobre eso. Según su historial de preguntas, ya está usando OmniFaces, por lo que todo lo que necesita hacer es reemplazar f:
por o:
<ui:define name="metaData">
<f:metadata>
<o:viewParam name="id" value="#{bean.entity}" converter="#{converter}"/>
</f:metadata>
</ui:define>
Esto no llamará al generador de modelos (ni al convertidor) durante la devolución de datos en la misma vista.
Esto de alguna manera funciona (lo que es bastante extraño, sin embargo), cuando el atributo representado se evalúa contra facesContext.postback como rendered = "# {not facesContext.postback}", pero el atributo representado no está documentado. Por lo tanto, no es confiable.
Eso es porque <f:viewParam>
es en esencia un componente UIInput
(de lo contrario no sería capaz de realizar conversiones, validaciones, actualizaciones de modelos y todo eso como los componentes de entrada usuales) que es solo un UIComponent
soporta un atributo rendered
. Sin embargo, esto no está documentado explícitamente, ya que en realidad no representa nada en el resultado HTML (también es por eso que es un f:xxx
, no un h:xxx
). Pero con este atributo, en realidad puede controlar el comportamiento durante la devolución de datos, ya que este atributo también se evalúa en el método processDecodes()
que se invoca durante la fase Aplicar valores de solicitud.
Estoy usando un <f:viewParam>
para pasar un parámetro de la siguiente manera.
<ui:define name="metaData">
<f:metadata>
<f:viewParam name="id" value="#{bean.entity}" converter="#{converter}"/>
</f:metadata>
</ui:define>
¿Es posible procesar este <f:viewParam>
, solo cuando la página se carga / actualiza?
Es solo porque el convertidor especificado con <f:viewParam>
es costoso y convierte el valor pasado a través de query-string en una entidad JPA. Por lo tanto, implica una costosa transacción de base de datos, incluso cuando se hace una devolución de datos jerárquica usando componentes como <p:commandButton>
, <p:commandLink>
que no es necesario.
Entonces, cuando, por ejemplo, se hace clic en un <p:commandLink>
( ajaxical ), no se debe ejecutar el costoso servicio comercial (en el convertidor). Se puede hacer esto?
Esto de alguna manera funciona (lo que es bastante extraño, sin embargo), cuando el atributo rendered
se evalúa contra facesContext.postback
como rendered="#{not facesContext.postback}"
pero el atributo rendered
no está documentado . Por lo tanto, no es confiable.