在@ApplicationScope的ManagedBean中使用ajax进行轮询

Dou*_*ior 3 ajax jsf primefaces

我无法理解@ApplicationScopeAjax发出请求的时间.

我创建了一个小例子来促进理解.我有的地方:

  • slider改变称为变量sliderValue中的ManagedBean @ApplicationScope,该值是由设定的Ajax.
  • A poll正在更新panelGrid以始终获取更新的值sliderValue,更新由Ajax完成.

从理论上讲,访问此页面的所有用户都应具有相同的值sliderValue,如果用户更改了滑块的值,则其他所有用户都应收到更改,对吧?

但这不会发生.显然,当通过Ajax进行更新时,他的行为类似于ManagedBean @SessionScope.

当我更改其值时sliderValue,它正在ManagedBean中正确更改,但其他用户不会通过执行的更新收到更新poll.

如果我在浏览器中提供REFRESH并在页面上执行完整的REFRESH,我只能更新sliderValue 值.

有没有人遇到类似的问题?

的index.xhtml

<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://xmlns.jcp.org/jsf/html"
      xmlns:p="http://primefaces.org/ui">
    <h:head>
        <title>Menu</title>
    </h:head>
    <h:body>
        <h:form prependId="false" id="form1" >

            <h:panelGrid id="panelGrid1"  columns="1" style="margin-bottom: 10px">
                <p:inputText id="txt1" value="#{menuManagedBean.sliderValue}" />
                <p:slider id="slider1" for="txt1" >
                    <p:ajax event="slideEnd" process="txt1" />
                </p:slider>
            </h:panelGrid>

            <p:poll id="poll1" widgetVar="varPool1" async="true" autoStart="true" interval="2" update="panelGrid1" />

        </h:form>
    </h:body>
</html>
Run Code Online (Sandbox Code Playgroud)

MenuManagedBean.java

import java.io.Serializable;
import java.util.Date;
import javax.enterprise.context.ApplicationScoped;
import javax.inject.Named;

@ApplicationScoped
@Named(value = "menuManagedBean")
public class MenuManagedBean implements Serializable {

    private int sliderValue;

    public MenuManagedBean() {
    }

    public int getSliderValue() {
        System.out.println(new Date() + " - get: " + sliderValue);
        return sliderValue;
    }

    public void setSliderValue(int sliderValue) {
        this.sliderValue = sliderValue;
        System.out.println(new Date() + " - set: " + sliderValue);
    }
}
Run Code Online (Sandbox Code Playgroud)

Bal*_*usC 5

所述<p:poll>的提交/默认过程的整个形式,如<p:poll process="@form">.包括当前滑块值.您应该通过不必要的set方法调用注意到它.每个打开的视图在轮询期间提交其自己的当前滑块值.这就是为什么每个开放视图只能看到自己的滑块值(当有"很多"打开视图时,不考虑竞争条件).

告诉<p:poll>我们只处理自己,而不是整个表格.

<p:poll process="@this" ... />
Run Code Online (Sandbox Code Playgroud)

具体问题无关:不要永远使用prependId="false".摆脱它.