2010-05-07 18 views
5

Tengo una página jsf con un formulario tiene un texto de salida. El valor del componente de texto de salida se llama desde un bean de respaldo (o bean gestionado). Sé cuando lo código como # {MyBean.myString} Jsf lo renombra y llama al método getMyString(). Sin embargo, lo más extraño es que cuando pongo un punto de interrupción en el método captador de este componente, veo que se llama dos veces durante la página. El texto de salida está en una forma h: y es el único componente que está vinculado a un forro de respaldo. Quiero decir, es tan extraño que jsf obtenga el valor cuando llega al método getter, sin embargo, necesita ir al método getter dos veces. ¿Puede explicar cuál es el motivo de este comportamiento en jsf?Entre una página jsf y un bean administrado, por qué el método getter se llama dos veces

Cualquier ayuda se agradece, mejores deseos, Baris

Respuesta

16

El captador, como su nombre ya se auto-describe, es justo allí con el propósito puro para recuperar los datos. JSF no almacena estos datos en caché. Lo llamará cuando sea necesario. El costo de llamar a un getter es en la práctica nihil, a menos que haga algo más que devolver los datos, p. golpeando el DB cada vez, esta lógica debería moverse fuera del captador o ser convertida en carga diferida.

En el caso de un envío de formulario, la primera llamada de obtención se activa durante la fase de validación para verificar si hay algún valor inicial para que JSF pueda manejar el evento de cambio de valor. La segunda llamada generalmente se activa durante la fase de respuesta del procesamiento para mostrar el valor del modelo en la vista.

Puede encontrar this article útil también para obtener más información sobre el ciclo de vida JSF. Puede encontrar que this answer es útil para aprender más sobre las formas de hacer preprocesamiento/inicialización en un bean de respaldo.

+0

Muchas gracias. BTW Me parece valioso mencionar que no me refería al envío de formularios, pero me refiero a la primera fase de la solicitud, cuando la página se está presentando por primera vez. Durante ese proceso, el valor de los componentes (el método getter) se llamaba dos veces, sin embargo, creo que cuando la primera vez llega al método captador, debe obtener el valor de la variable, ¿no es así? Leeré los artículos que publicó, y si tiene alguna idea al respecto, me gustaría que compartiera conmigo. Gracias de nuevo, Baris – Javatar

+1

Luego ha vinculado esta propiedad dos veces en algún lugar de la vista. Agregue 'Thread.dumpStack()' al método getter para obtener más información acerca de la pila de llamadas para que pueda calcular dónde se originó. – BalusC

Cuestiones relacionadas