在JSF中从辅助bean设置ID

时间:2013-11-29 05:43:58

标签: jsf

这合法吗?

<h:form id="status${a.myID}" >
// ...
</h:form>

其中'a'是辅助bean中的对象。它似乎有点工作,但是当我查看呈现的HTML时,我会将ID视为::0:status,而不是我期望的:status0。我的主要问题是尝试引用<f:ajax render=...中的id。我得到了“包含一个未知的身份......”,几乎我能想到的每一个组合。是否可以可靠地使用来自辅助bean的值设置ID?

2 个答案:

答案 0 :(得分:5)

单字母变量名${a}以及在客户端ID中自动附加的迭代索引(如:0的症状)表明此<h:form>位于JSF迭代组件中以<h:dataTable><ui:repeat>var="a" 实际 <支持bean。它将确认并解释到目前为止所描述的所有症状。如果${a}是一个真正的支持bean(而不是迭代变量),那么它就会“工作”,你会看到:0:status0:1:status0:2:status0等 - 虽然它的用处有问题。

首先,在视图构建时,即基于XHTML源代码文件构建JSF组件树的时刻,评估和设置JSF组件的id属性。 JSF迭代组件的var属性是在视图呈现时间期间设置的,即基于JSF组件树生成HTML输出的时刻。因此,逻辑结果是,var属性设置的对象在需要设置id属性时可用,因此计算为null / empty-string。效果与你做的时候完全相同

<h:form id="status">

JSF迭代组件已经自动将迭代索引附加到生成的客户端ID。在组件ID中手动设置迭代项的ID没有任何意义。在JSF组件树中只有物理上只有一个 <h:form>组件,而在基于当前迭代轮次生成HTML输出期间,该组件又被重复使用多次。

这个Q&amp; A也应该提供更多的思考:JSTL in JSF2 Facelets... makes sense?


回到您在<f:ajax render>中引用组件的具体功能要求,您肯定需要以不同方式解决此问题。遗憾的是,您没有清楚地描述源组件和目标组件的上下文,因此无法提供/解释正确的客户端ID,因此我只是给您一个链接,以便您可以自己解决: How to find out client ID of component for ajax update/render? Cannot find component with expression "foo" referenced from "bar"


对于具体问题,

无关,旧的JSP EL样式${...}在Facelets 完全中具有与#{...}相同的效果。为了避免您和您未来的维护者混淆,建议完全禁止${...}使用并始终坚持#{...}。另请参阅Difference between JSP EL, JSF EL and Unified EL

答案 1 :(得分:0)

实际上${a.myID}这不会呈现任何输出。当您获得:0:status作为表单ID时,:0是HTML树结构中:status的父级。