【问题标题】:Is it possible to update non-JSF components (plain HTML) with JSF ajax?是否可以使用 JSF ajax 更新非 JSF 组件(纯 HTML)?
【发布时间】:2025-12-28 20:35:07
【问题描述】:

是否可以更新我的页面中不是 JSF 组件的部分?

例如,我可以更新纯 HTML <div> 还是需要将其包装在 JSF 组件中?

【问题讨论】:

标签: html ajax jsf jsf-2


【解决方案1】:

是否可以更新我的页面中不是 JSF 组件的部分?

没有。要更新的组件必须由 UIViewRoot#findComponent() 提供,以便 JSF 可以找到它们,在其上调用 encodeAll(),捕获生成的 HTML 输出并将其传递回 ajax 响应中,以便 JavaScript 可以更新 HTML DOM 树与它。纯 HTML 元素在 JSF 组件树中不表示为真正的 UIComponent 实例,因此 JSF 已经无法首先找到它们。


例如,我可以更新纯 HTML <div> 还是需要将其包装在 JSF 组件中?

您需要将它包装在一个 JSF 组件中,例如 <h:panelGroup>。但是,您可以只使用 <h:panelGroup layout="block"> 在 JSF 中表示一个真实的 <div>。这样您就不需要将 <div> 包装在另一个 JSF 组件中。

<h:panelGroup layout="block" id="foo">
    ...
</h:panelGroup>

从 JSF 2.2 开始,您可以使用带有 jsf:id 属性的新 passthrough elements 功能将 HTML(5) 元素声明为 JSF 组件。

<... xmlns:jsf="http://xmlns.jcp.org/jsf">

<div jsf:id="foo">
    ...
</div>
<main jsf:id="bar">
    ...
</main>
<section jsf:id="baz">
    ...
</section>

他们将按原样呈现他们的输出,但在幕后是一个具体的UIPanel 实例。

不过,composite components 有一个极端情况。您可以使用以下方法来创建一个 可由 ajax 更新的 HTML 元素。

<cc:implementation>
    <span id="#{cc.clientId}">
        ...
    </span>
</cc:implementation>

这种方法有效的解释是,即使复合组件将自身呈现到 HTML 输出,它本身可被UIViewRoot#findComponent() 使用。

另见:

【讨论】:

  • 我不明白的是 cc.clientId 不是 whole 组件的 id 吗?我还不太了解 jsf,但我不会更新整个“包装”组件而不是 div 本身吗?
  • 我的特殊情况是我想更新 primefaces 树的子节点,但我无法包装子节点。无论如何,我使用 primefaces expand 方法找到了一个解决方案:) (*.com/questions/13000870/…)
  • 这与当前问题无关。
  • 是的,我只是想告诉你,我还有幸福的结局
  • 关于 jsf 2.2 passthrough 的好补充...从来没想过。
【解决方案2】:

好像不行。

要更新某些内容,请将其包装在“可更新”组件中(在 primeaces p:outputpanel 中)并更新该组件。

另外:在您的特殊情况下,您可以通过这种方式刷新 p:tree 的子级:JSF update primefaces tree children

(哈哈一直想用第三人称跟我说话)

【讨论】:

    【解决方案3】:

    AFAIK 你通过它们的 ID 更新组件,因为常规元素可以有一个 ID,只要你得到正确的 ID 就应该是可能的 ;-)

    【讨论】:

    • hm 并且当我有例如一个 div 时:
      right id 不是 "something" 吗?因为当我添加&lt;p:remoteCommand name="updatte" update=":something"&gt;&lt;/p:remoteCommand&gt; 时,我得到一个Cannot find component with identifier "something" referenced from "j_idt62:j_idt68:j_idt69".
    • @NickRussler 我想那是不可能的 :-) 你想做什么?也许还有其他选择。
    • 我想更新一个 primefaces 树的树节点,而不更新整个树
    • @NickRussler 您无法更新树的单个节点。节点的 ID 对客户端不可见。检查生成的 JSF 页面的 HTML。
    • 我可以在客户端获取节点 id,但是如果我将该 id 传递给 PrimeFaces.ajax.AjaxRequest 它不会更新(而当我传递树 id 时它会更新).. . 所以获取id不是问题