Jsf 使用Primefaces推送更新数据表

Jsf 使用Primefaces推送更新数据表,jsf,jsf-2,primefaces,datatable,primepush,Jsf,Jsf 2,Primefaces,Datatable,Primepush,我试图在使用primepush添加行后更新datatable。这意味着,我希望user1更新datatable,user2应该在不刷新页面的情况下看到添加的行 我的Primefaces版本是5.2,Atmosphere运行时版本是2.3.3 以下是我根据Primefaces Showcase和《用户指南》尝试实现的相关代码: web.xml: <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.

我试图在使用primepush添加行后更新datatable。这意味着,我希望user1更新datatable,user2应该在不刷新页面的情况下看到添加的行

我的Primefaces版本是5.2,Atmosphere运行时版本是2.3.3

以下是我根据Primefaces Showcase和《用户指南》尝试实现的相关代码:

web.xml:

<web-app xmlns="http://java.sun.com/xml/ns/javaee"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
 http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
 version="3.0">

    <display-name>PrimeFaces Web Application</display-name>

    <context-param>
        <param-name>javax.faces.PROJECT_STAGE</param-name>
        <param-value>Development</param-value>
    </context-param>
    <context-param>
        <param-name>javax.faces.DEFAULT_SUFFIX</param-name>
        <param-value>.xhtml</param-value>
    </context-param>        

    <welcome-file-list>
        <welcome-file>faces/index.xhtml</welcome-file>
    </welcome-file-list>

    <filter>
        <filter-name>AccessFilter</filter-name>
        <filter-class>view.AccessFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>AccessFilter</filter-name>
        <url-pattern>/secured/*</url-pattern>
    </filter-mapping>

    <servlet>
        <servlet-name>Faces Servlet</servlet-name>
        <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet>
        <servlet-name>Push Servlet</servlet-name>
        <servlet-class>org.primefaces.push.PushServlet</servlet-class>
        <async-supported>true</async-supported>
    </servlet>

    <servlet-mapping>
        <servlet-name>Faces Servlet</servlet-name>
        <url-pattern>/faces/*</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>Faces Servlet</servlet-name>
        <url-pattern>*.jsf</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>Faces Servlet</servlet-name>
        <url-pattern>*.faces</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>Faces Servlet</servlet-name>
        <url-pattern>*.xhtml</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>Push Servlet</servlet-name>
        <url-pattern>/primepush/*</url-pattern>
    </servlet-mapping>
</web-app>

PrimeFaces Web应用程序
javax.faces.PROJECT_阶段
发展
javax.faces.DEFAULT_后缀
.xhtml
faces/index.xhtml
访问过滤器
view.AccessFilter
访问过滤器
/安全的/*
Facesservlet
javax.faces.webapp.FacesServlet
1.
推送Servlet
org.primefaces.push.PushServlet
没有成功。我对primepush很陌生,我在网上找到的例子(用户指南除外)都是针对Primefaces的老版本,push功能在Primefaces 5之后似乎改变了很多。感谢您的帮助

编辑:我还尝试了以下链接:


编辑2:我已经记录了推送是否有效,而且似乎确实有效。当我导航到启用了push的页面时,我可以在控制台上观察到它被激活。但是,当我尝试更新表时,填充表的列表的get方法会在按下…,之后连续调用三次。

您可以尝试在ajax标记中添加一个actionListener来调用服务器上的某个虚拟方法吗?如果没有呼叫,那么就没有往返。@Kukeltje
没有actionListener属性?对不起,listener。。。重要的是想法。原因是same@Kukeltje试过了,没有机会。但在添加期间似乎没有丢失任何行。其他用户仍然需要刷新以查看更改。数据表从未被“推送”。。。它在ajax响应中更新,可以通过消息事件或remoteCommand中的一个进行更新。这就是我要求调试响应的原因。如果datatable在那里,那么技术更新就会起作用。如果您的模型过时,您将看不到任何差异。这就是为什么您应该总是,总是,总是,从开发人员的角度来看问题,而不是从最终用户的角度来看问题……您可以尝试在ajax标记中添加一个actionListener来调用服务器上的一些虚拟方法吗?如果没有呼叫,那么就没有往返。@Kukeltje
没有actionListener属性?对不起,listener。。。重要的是想法。原因是same@Kukeltje试过了,没有机会。但在添加期间似乎没有丢失任何行。其他用户仍然需要刷新以查看更改。数据表从未被“推送”。。。它在ajax响应中更新,可以通过消息事件或remoteCommand中的一个进行更新。这就是我要求调试响应的原因。如果datatable在那里,那么技术更新就会起作用。如果您的模型过时,您将看不到任何差异。这就是为什么你应该总是,总是,总是,从开发人员的角度看问题,而不是从最终用户的角度看问题。。。
@ManagedBean
@ViewScoped
@PushEndpoint("/main")
public class MainBean implements Serializable{

...

    public void addContact(ActionEvent event){

        ... // database operations

        Contact con = new Contact(); 

        contacts.add(con); // this is an ArrayList

        EventBus eventBus = EventBusFactory.getDefault().eventBus();
        eventBus.publish("/main", contacts);
    }

    @OnMessage(encoders = {JSONEncoder.class})
    public ArrayList<Contact> getContacts(){
        return contacts;
    }
}    
...

<p:commandButton value="Add Contact" update=":form:datatable" 
    actionListener="#{mainBean.addContact}" ajax="true"/>

<h:form id="form">
    <p:dataTable id="datatable" var="contact" value="#{mainBean.contacts}" 
     selectionMode="single" rowKey="#{contact.firstName}" 
     selection="#{mainBean.selectedContact}">

        <p:column headerText="First Name">
            <h:outputText value="#{contact.firstName}"/>
        </p:column>
        <p:column headerText="Last Name">
            <h:outputText value="#{contact.lastName}"/>
        </p:column>
    </p:dataTable>
</h:form>
<p:socket channel="/main">
    <p:ajax event="message" update=":form:datatable"/>
</p:socket>