【问题标题】:Set ID from backing bean in JSF从 JSF 中的支持 bean 设置 ID
【发布时间】:2013-11-29 05:43:57
【问题描述】:

这合法吗?

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

其中 'a' 是支持 bean 中的一个对象。这似乎有点工作,但是当我查看呈现的 HTML 时,我看到的 id 为:例如:0:status,而不是我所期望的:status0。我的主要问题是尝试从 &lt;f:ajax render=... 引用 id。我得到“包含一个未知的 id ......”几乎所有我能想到的组合。是否可以使用来自支持 bean 的值可靠地设置 id?

【问题讨论】:

  • 你试过用status#{a.myID}代替status${a.myID}
  • 为什么不将表单命名为statusForm 并使用&lt;f:ajax render=":statusForm"&gt; 引用它? AFAIK 并不真正支持这样设置 id。
  • 你最好使用相对 id 来引用组件。您可以使用绝对的,但您应该为从父级到最后一个子级的每个组件分配一个 id。

标签: jsf


【解决方案1】:

单字母变量名称${a} 和像:0 这样的迭代索引的症状自动附加在客户端ID 中,表明这个&lt;h:form&gt; 在一个JSF 迭代组件内,比如&lt;h:dataTable&gt; 或@ 987654328@ 和 var="a" 实际上 不是支持 bean。它将确认并解释迄今为止描述的所有症状。如果 ${a} 是一个真正的支持 bean(而不是一个迭代变量),那么它就会“工作”,你会看到 :0:status0:1:status0:2:status0 等——尽管它们的有用性值得怀疑。

首先,JSF 组件的id 属性在视图构建时进行评估和设置,即基于XHTML 源代码文件构建JSF 组件树的时刻。 JSF 迭代组件的var 属性是在视图渲染时设置的,即基于JSF 组件树生成HTML 输出的时刻。因此,合乎逻辑的结果是,var 属性设置的对象在需要设置id 属性时可用,因此评估为空/空字符串。效果和你做的时候一模一样

<h:form id="status">

JSF 迭代组件即已经自动将迭代索引附加到生成的客户端 ID。在组件 ID 中手动设置迭代项的 ID 没有任何意义。在 JSF 组件树中,物理上只有一个 &lt;h:form&gt; 组件,在根据当前迭代轮生成 HTML 输出的过程中,该组件又被多次重用。

这个问答也应该给大家更多思考:JSTL in JSF2 Facelets... makes sense?


回到您在&lt;f:ajax render&gt; 中引用组件的具体功能要求,您肯定需要以不同的方式解决这个问题。不幸的是,您没有清楚地描述源组件和目标组件的上下文,因此无法提供/解释正确的客户端 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

【讨论】:

    【解决方案2】:

    其实${a.myID} 这并没有渲染任何输出。当您将:0:status 作为表单ID 时,这意味着:0 是HTML 树结构中:status 的父级。

    【讨论】:

      猜你喜欢
      • 2011-04-11
      • 2013-11-20
      • 1970-01-01
      • 2011-06-29
      • 2012-09-06
      • 2013-07-15
      • 1970-01-01
      • 2011-01-10
      • 2012-11-15
      相关资源
      最近更新 更多