paso parametros paginas entre ejemplo comunicacion beans jsf viewparams

parametros - jsf ejemplo



Bean view-scoped recreado en POST cuando los parĂ¡metros de URL no se utilizan (1)

Tengo un bean manejado por JSF con un alcance de vista que respalda una vista xhtml donde leo un parámetro de la URL usando f: viewParam .

La vista presenta un formulario para el usuario. Sin embargo, cuando el usuario envía el formulario presionando el p: commandButton , parece que se recrea el bean view- scoped (agregué una anotación @PostConstruct para verificar esto) y por lo tanto no recuerdo la variable de instancia leída de f: viewParam ( invId en el código a continuación).

Originalmente navego a la vista con un GET que incluye un parámetro de URL pero el mensaje POST que se envía cuando el usuario presiona el p: commandButton no incluye el parámetro de URL . Así que estoy pensando que cuando el tiempo de ejecución de JSF no vea el parámetro de URL en el POST , considera que se trata de una vista diferente y está recreando el bean gestionado por JSF. Cuando cambio el alcance de la vista a un ámbito de sesión, el código funciona.

Aquí está el código:

ver

<f:metadata> <f:viewParam name="invId" value="#{registerBean.invId}"/> </f:metadata> <h:form id="registrationForm"> .... <p:commandButton value="register" action="#{registerBean.register}" icon="ui-icon ui-icon-newwin" ajax="false"/> </h:form>

respaldo de frijol

@ManagedBean @ViewScoped public class RegisterBean implements Serializable { @ManagedProperty(value="#{invId}") private String invId; ...

actualizar

Resulta que esto no estaba relacionado con los parámetros de URL en absoluto. Siguiendo los consejos de BalusC a continuación, eliminé las etiquetas c: when que estaba usando mi vista (confiando en los atributos renderizados para el mismo efecto), y ahora el bean del ámbito de la vista ya no se recrea y el campo invId se conserva correctamente.


El problema no es visible en el código publicado hasta el momento, pero para JSF 2.0 / 2.1 es un problema conocido que un bean de ámbito de vista se volverá a crear cuando una de sus propiedades se vincule a un atributo de un manejador de etiquetas como JSTL <c:if> o Facelets <ui:include> o un atributo de tiempo de compilación de la vista del componente JSF, como id y binding , mientras que el ahorro de estado parcial está habilitado (como por defecto).

La explicación de fondo es que cualquier expresión EL en esos atributos se ejecuta durante la creación y restauración de la vista. Como los beans de ámbito de vista se almacenan en la vista y, por lo tanto, solo están disponibles después de restaurar la vista, una evaluación de expresión de EL de este tipo crearía un bean de ámbito de vista nuevo y separado. Esto es básicamente un problema de huevo de gallina. Está arreglado en el próximo JSF 2.2.

Básicamente hay 3 soluciones:

  1. Cambie la vista en consecuencia para que esas expresiones EL solo se evalúen durante la visualización del tiempo de renderizado. Por ejemplo, reemplace <c:if> / <c:choose> por rendered .
  2. O vincular esos atributos a un bean con ámbito de solicitud (aviso de diseño: puede simplemente inyectar un bean con ámbito view como una propiedad administrada de un bean con ámbito de solicitud).
  3. Desactive el ahorro de estado parcial, si es necesario solo para la vista particular.

Ver también: