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

时间:2014-12-30 19:10:07

标签: ajax jsf primefaces

当Ajax发出请求时,我无法理解@ApplicationScope的操作。

我创建了一个小例子来促进理解。我在哪里:

  • slider更改了sliderValue的ManagedBean中名为@ApplicationScope的变量,该值由Ajax设置。
  • poll更新panelGrid以始终获取sliderValue的更新值,更新由Ajax完成。

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

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

当我更改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>

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);
    }
}

1 个答案:

答案 0 :(得分:5)

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

告诉<p:poll>仅处理自己,而不是整个表单。

<p:poll process="@this" ... />

无关具体问题:请勿使用prependId="false"。摆脱它。