f:viewParam 在 ajax 调用后丢失

Posted

技术标签:

【中文标题】f:viewParam 在 ajax 调用后丢失【英文标题】:f:viewParam lost after ajax call 【发布时间】:2013-05-20 01:06:35 【问题描述】:

我有这个 f:viewParam 来设置值并在后面的 bean 中搜索:

<f:metadata>
<f:viewParam name="id"
    value="#editorBean.id"
    required="true" />
<f:event type="preRenderComponent"
    listener="#editorBean.search" />
...

回豆:

private String id; // getters setters

public void search(ComponentSystemEvent event) 


    if (id != null) 
            //search data in DB to construct TreeNode finBy(id)...
...

在浏览器中我无法展开第二级树,因为在支持 Bean 中,id 为 null..

调试:

如何在所有调用中设置 f:viewParam?

【问题讨论】:

【参考方案1】:

这是因为&lt;h:form&gt;默认提交到一个没有查询字符串的URL。

要么将 bean 放在视图范围内,

@ManagedBean
@ViewScoped
public class EditorBean 

并在回发期间跳过预渲染视图

public void search(ComponentSystemEvent event)    
    if (FacesContext.getCurrentInstance().isPostback()) 
        return;
    

    // ...
 

只要您与同一个视图交互,视图范围的 bean 就会存在,因此不需要一次又一次地初始化属性。

或者使用OmniFaces &lt;o:form&gt; 提供includeViewParams 属性以在表单操作URL 中包含视图参数:

<o:form includeViewParams="true">

另见:

Retain original GET request parameters across postbacks How can I maintain param on ajax call? What can <f:metadata>, <f:viewParam> and <f:viewAction> be used for?

【讨论】:

我正在使用 Spring Beans。查看范围不存在 那就另当别论了。 @BalusC:像标题描述的那样,它发生在第二次通话之后是否有意义?逻辑和您的回答让我认为它发生在第一次或更确切地说是在第一次 ajax 调用期间。我要创建一个测试用例,但***.com/questions/61762633/… 已经有这种行为。标题是偶然错误还是早期可能是这样,而我们现在看到的行为更合乎逻辑? @Kukeltje:你说得对,标题含糊不清。 OP 可能的意思是“在第二次请求之后”。当您正常打开页面然后对其进行回发时,就会发生这种情况。 @BalusC: 似乎原标题是正确的 我在 Mojarra 2.3.9SP02 (Wildfly 16) 和第一个上尝试了 ***.com/questions/61762633/… ajax 调用它确实没有被转移但是.... setter IS 调用了。我目前正在检查它是否与***.com/questions/10692404 和引用的***.com/questions/3933786 相关,其中引用了github.com/javaserverfaces/mojarra/issues/2266。我正在检查它是否相关,但也许你知道。

以上是关于f:viewParam 在 ajax 调用后丢失的主要内容,如果未能解决你的问题,请参考以下文章

如何在不调用 <f:viewparam> 转换器的情况下调用 setter?

何时调用 <f:metadata><f:viewParam> 的设置器

如果位于 template.xhtml 中,JSF f:viewParam 不调用 setter

f:viewParam 具有多个值

HTTP 丢包

将 f:viewParam 与必需的属性和命令一起使用