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 unNamingContainer
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 agetContainerClientId()
y guarde el resultado como la variable localparentId
. Llame agetId()
en este componente y guarde el resultado como la variable localmyId
. SimyId
esnull
, llame acontext.getViewRoot().createUniqueId()
y asigne el resultado amyId
. SiparentId
no esnull
, permita quemyId
seaparentId +
UINamingContainer.getSeparatorChar(javax.faces.context.FacesContext)
+ myId
. Llame aRenderer.convertClientId(javax.faces.context.FacesContext, java.lang.String)
, pasemyId
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 esteUIViewRoot
.
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:
- ¿Cómo averiguar la identificación del cliente del componente para la actualización / renderización de Ajax? No se puede encontrar el componente con la expresión "foo" a la que se hace referencia desde "barra"
- De forma predeterminada, JSF genera identificadores inutilizables, que son incompatibles con css parte de los estándares web
- Evitar identificadores duplicados al reutilizar composiciones de facelets en el mismo contenedor de nombres
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 ...)?