tutorial framework example etiquetas español ejemplo componentes jsf jsf-2 page-lifecycle clientid

framework - jsf primefaces



¿Cuándo y cómo se genera clientID en JSF? (1)

Para comprender mejor la generación de clientID en JSF (2.x), ¿podría alguien explicarme cuándo exactamente JSF genera la ID del cliente (qué fase del ciclo de vida, tiempo de construcción o tiempo de renderización ...)?

Tiene que terminar en una respuesta HTML. Se genera así durante la respuesta de renderizado. Si coloca un punto de interrupción de depuración en UIComponent#getClientId() método UIComponent#getClientId() , verá más abajo en la pila que (en el caso de Mojarra) RenderResponsePhase#execute() ha sido invocado. Esto es suficiente pista acerca de la fase actual en el ciclo de vida cuando se golpea el punto de interrupción.

¿Y cómo se generará la ID del cliente (si proporciona / no proporciona identificación del componente y no, al azar o usando una lógica específica ...)?

La implementación concreta del método abstracto UIComponent#getClientId() se puede encontrar en UIComponentBase#getClientId() . Su código fuente se puede encontrar en grepcode . Cómo se generará se acaba de describir en su javadoc :

public abstract String getClientId(FacesContext context)

Devuelve un identificador del lado del cliente para este componente, generando uno si es necesario. Se le pedirá al Renderer asociado, si lo hay, que convierta el ID de cliente a un formulario adecuado para la transmisión al cliente.

El retorno de este método debe ser el mismo valor durante toda la vida de la instancia, a menos que se cambie la propiedad id del componente o el componente se coloque en un NamingContainer cuyo ID de cliente cambie (por ejemplo, UIData ). Sin embargo, incluso en estos casos, las llamadas consecutivas a este método siempre deben devolver el mismo valor. La implementación debe seguir estos pasos para determinar el ID de cliente:

Encuentre el ancestro más cercano a este componente en la jerarquía de vistas que implementa NamingContainer . Llame a getContainerClientId() y guarde el resultado como la variable local parentId . Llame a getId() en este componente y guarde el resultado como la variable local myId . Si myId es null , llame a context.getViewRoot().createUniqueId() y asigne el resultado a myId . Si parentId no es null , permita que myId sea parentId + UINamingContainer.getSeparatorChar(javax.faces.context.FacesContext) + myId . Llame a Renderer.convertClientId(javax.faces.context.FacesContext, java.lang.String) , pase myId y devuelva el resultado.

Muy claro, ¿verdad? La parte más importante es tal vez la memorización de componentes que implementan NamingContainer y, por lo tanto, anteponen su ID de cliente. En JSF estándar 2.x, que son al menos <h:form> , <h:dataTable> , <ui:repeat> , <f:subview> y <cc:implementation> . Si le da suavemente a todos los componentes una ID fija , entonces también verá ese patrón en la salida HTML generada.

Si no le das a esos componentes una ID fija, entonces se usará la ID generada por JSF que se puede obtener a través de UIViewRoot#createUniqueId() (como ya se insinuó en el extracto de javadoc anterior). Su javadoc dice:

public String createUniqueId()

Genera un identificador para un componente. El identificador tendrá el prefijo UNIQUE_ID_PREFIX y será único dentro de los subárboles secundarios que no sean NamingContainer de este UIViewRoot .

Ese prefijo es j_id . No es explícito sobre cómo la implementación debería generarlo, por lo que todos los implementadores son libres de implementarlo. Suelen usar un índice incrementado del conteo de componentes en el árbol. Entonces, el primer componente, UIViewRoot , podría obtener un ID de j_id1 . Su primer hijo podría obtener una ID de j_id2 . Etcétera Puede rastrear la lógica colocando un punto de corte de depuración en el UIViewRoot#createUniqueId() o incluso en el método UIComponentBase#setId() .

Ver también:

Para comprender mejor la generación de clientID en JSF (2.x), ¿podría alguien explicarme cuándo exactamente JSF genera la ID del cliente (qué fase del ciclo de vida, tiempo de construcción o tiempo de renderización ...)?

¿Y cómo se generará la ID del cliente (si proporciona / no proporciona identificación del componente y no, al azar o usando una lógica específica ...)?