【发布时间】:2011-12-14 20:23:02
【问题描述】:
免责声明:我知道 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 的元素 绝对不会为页面增加任何建设性价值
附录:
根据这里关于 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。我们经常从这些页面中的许多页面中获取 Duplicate Component ID 错误。少数页面被更改为使用方法 B。我们很少/永远不会从这些页面中得到错误——当我们这样做时,通常来自呈现集合(表/列表)的组件,其中 Faces 实现必须生成任意 ID给定行或元素的运行时。
根据那次经验,我很难理解哪种方式应该一直有效。哪种方式正确?
【问题讨论】:
-
在 JSP 上的 JSF 1.x 应用程序中出现重复组件 ID 错误通常是由于错误地使用了
<f:subview>标记和/或binding属性造成的。在整个视图中应该有 one<f:subview>具有该 ID(注意重新包含的子视图!)并且应该有 one 组件绑定到 @ 后面的属性987654332@(注意在多个视图之间共享的会话范围 bean!)。 -
那么,关于正确使用
<f:subview>的方法有哪些经验指导?在包含的文件本身中始终/从不包含<f:subview>标签对是否安全?或者这是偏好、性能问题,还是以上都不是?