Tar*_*rik 5 jsf page-lifecycle clientid jsf-2
为了更好地理解JSF(2.x)中的clientID生成,有人可以在JSF生成客户端ID(生命周期阶段,构建时间或渲染时间......)时直接向我解释吗?
以及如何生成客户端ID(如果提供/不提供组件ID,而不是,随机或使用特定逻辑......)?
为了更好地理解JSF(2.x)中的clientID生成,有人可以在JSF生成客户端ID(生命周期阶段,构建时间或渲染时间......)时直接向我解释吗?
它必须以HTML响应结束.它因此在渲染响应期间生成.如果你在UIComponent#getClientId()方法上放置一个调试断点,那么你将在堆栈中进一步看到(在Mojarra的情况下)RenderResponsePhase#execute()已被调用.这足以暗示断点被击中时生命周期中的当前阶段.
以及如何生成客户端ID(如果提供/不提供组件ID,而不是,随机或使用特定逻辑......)?
抽象UIComponent#getClientId()方法的具体实现可以在中找到UIComponentBase#getClientId().它的源代码可以在grepcode找到.如何生成它只是在它的javadoc中描述:
public abstract String getClientId(FacesContext context)返回此组件的客户端标识符,必要时生成一个标识符.将要求相关联的
Renderer(如果有的话)将clientId转换为适合传输到客户端的表单.除非
id更改组件的属性,或者将组件放置在NamingContainer其客户端ID更改的位置(例如,UIData),否则此方法的返回在实例的整个生命周期中必须是相同的值.但是,即使在这些情况下,对此方法的连续调用也必须始终返回相同的值.在确定clientId时,实现必须遵循以下步骤:在实现的视图层次结构中查找此组件的最近祖先
NamingContainer.调用getContainerClientId()它并将结果保存为parentId局部变量.调用getId()此组件并将结果保存为myId局部变量.如果myId是null,请调用context.getViewRoot().createUniqueId()并将结果分配给myId.如果parentId不是null,请myId平等.调用,传递和返回结果.parentId +UINamingContainer.getSeparatorChar(javax.faces.context.FacesContext)+ myIdRenderer.convertClientId(javax.faces.context.FacesContext, java.lang.String)myId
很清楚,是吗?最重要的部分可能是记住实现NamingContainer并因此预先添加其客户端ID的组件.在标准JSF 2.x中,是至少<h:form>,<h:dataTable>,<ui:repeat>,<f:subview>和<cc:implementation>.如果您轻轻地为所有组件提供固定ID,那么您还将在生成的HTML输出中看到该模式.
如果你没有给那些组件一个固定的ID,那么将使用JSF生成的ID,它可以通过UIViewRoot#createUniqueId()(如上面的javadoc提取中已暗示)获得.它的javadoc说:
public String createUniqueId()生成组件的标识符.标识符将以此为前缀
UNIQUE_ID_PREFIX,并且在此非NamingContainer子子树中是唯一的UIViewRoot.
那个前缀是j_id.它没有明确说明实现应该如何生成它,因此所有实现者都可以自由地实现它.它们通常使用树中组件计数的递增索引.所以,第一个组件,UIViewRoot可以得到一个ID j_id1.它的第一个孩子可以得到一个ID j_id2.等等.您可以通过在UIViewRoot#createUniqueId()方法甚至UIComponentBase#setId()方法上放置调试断点来跟踪逻辑.
| 归档时间: |
|
| 查看次数: |
4904 次 |
| 最近记录: |