Jsf 如何推动<;p:插座>;工作

Jsf 如何推动<;p:插座>;工作,jsf,primefaces,push,Jsf,Primefaces,Push,我正在尝试使用PF Push反例,但没有成功。 我有两个Portlet。 一个是计数器portlet。另一个是counterview portlet。 我如何订阅(注册)到“频道” 我的代码几乎是直接从PF Showcase示例中获得的 1) 柜台(出版商) Counter.xhtml <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional/

我正在尝试使用PF Push反例,但没有成功。 我有两个Portlet。 一个是计数器portlet。另一个是counterview portlet。 我如何订阅(注册)到“频道”

我的代码几乎是直接从PF Showcase示例中获得的

1) 柜台(出版商) Counter.xhtml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:p="http://primefaces.org/ui">
<h:body>


    <h:form id="form">
        <h:outputText id="out" value="#{counterBean.count}"
            styleClass="ui-widget display" />

        <p:commandButton value="Click"
            actionListener="#{counterBean.increment}" />
    </h:form>



</h:body>

</html>
2) 反视图(消费者) CounterView.xhtml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:p="http://primefaces.org/ui">
<h:body>
    <h:form id="form1">
        <h:outputText id="out" value="What's my count?" styleClass="display" />

        <p:remoteCommand name="updateWidgets"
            actionListener="#{consumerBean.printMessage()}" update=":form1:out" />
    </h:form>
    <p:socket onMessage="handleMessage" channel="/counter" />

    <script type="text/javascript">
    function handleMessage(data) {
        updateWidgets();
    }
</script>
</h:body>

</html>

Q:count.xhtml上的计数器递增,但counterView.html上没有任何变化。 我放了几个断点,但在消费者bean中没有停止

我怎样才能得到这份工作? 这似乎是一个简单的例子,但无法使其起作用。
你能帮忙吗?

第一:你的消费者银行是干什么的?您有一个应用程序范围的计数器bean,其中包含要用“push”显示的计数器。那么,为什么你在消费区有另一个柜台呢

第二:在CounterView.xhtml中,您根本不显示计数器,甚至不显示ConsumerBean的计数器

在CounterView.xhtml页面中使用CounterBean(及其计数器)。 在h:outputText中,而不是在“我的计数是多少?”固定值中使用#{counterBean.count}(与counter.xhtml中的方法相同)

顺便说一句,请查看官方演示,它运行良好:

PrimeFaces从PrimeFaces 6.3开始删除。不要使用它。使用JSF2.3本机推送方式。或者,如果您仍然使用JSF2.2,请使用OmniFaces。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:p="http://primefaces.org/ui">
<h:body>
    <h:form id="form1">
        <h:outputText id="out" value="What's my count?" styleClass="display" />

        <p:remoteCommand name="updateWidgets"
            actionListener="#{consumerBean.printMessage()}" update=":form1:out" />
    </h:form>
    <p:socket onMessage="handleMessage" channel="/counter" />

    <script type="text/javascript">
    function handleMessage(data) {
        updateWidgets();
    }
</script>
</h:body>

</html>
@PushEndpoint("/counter")
public class CounterResource {

    @OnMessage(encoders = { JSONEncoder.class })
    public String onMessage(String count) {
        System.out.println("OnMessage " + count );
        return count;
    }
}
@SessionScoped
@ManagedBean
public class ConsumerBean {
private int count;
private String message;


public int getCount() {
    return count;
}
public void setCount(int count) {
    this.count = count;
}
public String getMessage() {
    return message;
}
public void setMessage(String message) {
    this.message = message;
}

public void printMessage(){
    System.out.println("Consumer Bean Listener!");

}



}