免责声明:我知道 JSF 2.0 存在并且很熟悉。这个问题与 IBM WebSphere 下的 JSF 1.1 有关。
我听说过/看到过不同程度的支持,即页面上的所有 JSF 组件都需要在开发时指定一个 ID 属性。当我说“所有”组件时,我的意思是一切......包括传统上“仅输出”的组件,例如 <h:ouputText>
, <h:panelGroup>
, <h:panelGrid>
等等……
这个问题在内部不断出现,以响应日志中出现的“重复组件 ID”异常。声称具有重复 ID 的组件有时是 JSF 生成的 ID,或者是无法显式设置的元素的 ID(例如,具有 n 行的网格的一行中的元素)。
我正在寻找关于应该、可以或需要(或不需要)针对 JSF 组件范围设置哪些 ID 的客观指导。
我主要担心两方面的问题:
- 疯狂地向所有事物(甚至可能不需要它们的事物)追加主动添加 ID,以消除任何可能性 重复组件 ID 异常的发生可能不是最好的 时间的使用。
- 在 HTML 流中产生的膨胀
运行/渲染时间非常丑陋,例如
<span>
带有 ID 的元素 绝对不会给页面增加任何建设性的值(value)
附录:
基于对 SO 的更多研究和其他帖子,我可能仍然有点困惑。 以下哪项是“正确的”?:
方法 A:<f:subview>
在包含的页面中指定
<%-- parent_page.jsp --%>
<html>
<f:view>
<jsp:include page="included_child_page.jsp" />
</f:view>
</html>
<%-- included_child_page.jsp --%>
<f:subview id="myID">
<h:outputText value="Some content here..." />
</f:subview>
方法 B:<f:subview>
在包含/父页面中指定
<%-- parent_page.jsp --%>
<html>
<f:view>
<f:subview id="myID">
<jsp:include page="included_child_page.jsp" />
</f:subview>
</f:view>
</html>
<%-- included_child_page.jsp --%>
<h:outputText value="Some content here..." />
我们绝大多数的 JSP 使用上面的方法 A。我们经常从许多此类页面中收到重复的组件 ID 错误。一些页面被更改为使用方法 B。我们很少/从不从这些页面中得到错误——当我们这样做时,它通常来自呈现集合(表/列表)的组件,其中 Faces 实现必须生成任意 ID给定行或元素的运行时。
从那次经历中,我很难理解哪种方式应该始终有效。哪种方式正确?
最佳答案
我认为规范从未要求为组件提供明确的 ID。如果用户未设置 ID,则 JSF 应始终生成一个。
也就是说,我猜想史前 WebSphere 可能正在使用的 JSF 引用实现 (RI) 在 1.1 中非常错误,因此您可能会遇到错误而不是使用 JSF错误。
关于java - 在 JSF 1.1 中设置组件 ID 属性的必要性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8511129/