Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
服务器如何将异步更改推送到JSF创建的HTML页面?_Jsf_Asynchronous_Push - Fatal编程技术网

服务器如何将异步更改推送到JSF创建的HTML页面?

服务器如何将异步更改推送到JSF创建的HTML页面?,jsf,asynchronous,push,Jsf,Asynchronous,Push,当我们创建JSF页面时,客户端请求允许使用Java代码和HTML的组合动态生成HTML。 我们可以使用JSF框架在HTML页面中引入钩子吗?它允许服务器根据稍后在服务器上发生的异步事件(通常是通过不同的线程)更新HTML页面?您可以看一下(有关使用Seam与JSF和AJAX的讨论,请参阅) 我上次使用Seam时,速度非常慢。您可能希望创建自己的JSF组件来生成JavaScript(例如使用jQuery,如中所述)。JSF 2.3+ 你可以用这个。下面是一个启动示例,它根据后端触发的应用程序范围的

当我们创建JSF页面时,客户端请求允许使用Java代码和HTML的组合动态生成HTML。 我们可以使用JSF框架在HTML页面中引入钩子吗?它允许服务器根据稍后在服务器上发生的异步事件(通常是通过不同的线程)更新HTML页面?

您可以看一下(有关使用Seam与JSF和AJAX的讨论,请参阅)

我上次使用Seam时,速度非常慢。您可能希望创建自己的JSF组件来生成JavaScript(例如使用jQuery,如中所述)。

JSF 2.3+ 你可以用这个。下面是一个启动示例,它根据后端触发的应用程序范围的事件更新数据表

<h:dataTable id="notifications" value="#{bean.notifications}" var="notification">
    <h:column>#{notification.message}</h:column>
</h:dataTable>

<h:form>
    <f:websocket channel="push">
        <f:ajax event="updateNotifications" render=":notifications" />
    </f:websocket>
</h:form>

#{notification.message}

@Named@ApplicationScoped
公共类Bean{
私人名单通知;
@注入
私人通知服务;
@注入@Push
私有推送上下文推送;
@施工后
公共空荷载(){
通知=service.list();
}
public void onNewNotification(@Notification newNotification){
通知。添加(0,newNotification);
推送发送(“更新通知”);
}
公共列表getNotifications(){
退货通知;
}
}

@无状态
公共类通知服务{
@注入
私人实体管理者实体管理者;
@注入
专用BeanManager BeanManager;
公共void创建(字符串消息){
通知newNotification=新通知();
newNotification.setMessage(message);
entityManager.persist(newNotification);
fireEvent(newNotification);
}
公开名单(){
返回实体管理器
.createNamedQuery(“Notification.list”,Notification.class)
.getResultList();
}
}
JSF2.2- 如果您还没有使用JSF2.3,那么需要使用第三方JSF库

  • has(JSR356 WebSocket+CDI)
  • has(大气)
  • has(长轮询)
应该注意的是,
是JSF2.3
的基础。所以如果你发现了很多相似之处,那就对了

PrimeFaces在引擎盖下使用(在没有Maven的情况下设置很麻烦)。Atmosphere支持具有回退到SSE和长轮询的WebSocket。冰面是基于古老的技术。所有这些都没有实现本地JSR356 WebSocket API,该API后来才在JavaEE7中引入

OmniFaces使用本机(所有JavaEE7服务器和Tomcat7.0.27+都支持)。因此,它的设置和使用也是最简单的(一个JAR、一个上下文参数、一个标记和一个注释)。它只需要CDI(不难实现),但它使您甚至可以从非JSF工件上推送(例如
@WebServlet
)。出于安全和JSF视图状态保持的原因,它只支持单向推送(服务器到客户端),而不支持反向推送。为此,您可以继续以通常的方式使用JSF ajax。JSF2.3主要基于OmniFaces
,因此您会在它们的API(-)中发现许多相似之处

或者,您也可以使用轮询而不是推送。几乎每个支持ajax的JSF组件库都有一个
组件,比如PrimeFaces with。这允许您每X秒向服务器发送一个ajax请求,并在必要时更新内容。它只比推的效率低

另见:

最简单的方法是介绍ajax4jsf库的“轮询”组件:

它不需要重新配置应用程序,也不需要在JSF页面中进行重大更改(只需添加a4j:poll组件)


它在我的两个项目中运行得非常好。

如果您需要功能齐全的Comet更新(反向Ajax)等,那么值得一看库。

在stackoverflow中,当我们编辑一个问题,同时如果有人编辑该问题,我们会在编辑页面上看到一条消息。这是使用轮询还是服务器端推送实现的?使用轮询。检查源代码并安装以跟踪XHR(Ajax)请求。当许多更新以很快的速度发送到页面时,并不是所有更新都被接收并显示在h:dataTable上。我怎样才能确保没有消息丢失?我道歉!
@Named @ApplicationScoped
public class Bean {

    private List<Notification> notifications;

    @Inject
    private NotificationService service;

    @Inject @Push
    private PushContext push;

    @PostConstruct
    public void load() {
        notifications = service.list();
    }

    public void onNewNotification(@Observes Notification newNotification) {
        notifications.add(0, newNotification);
        push.send("updateNotifications");
    }

    public List<Notification> getNotifications() {
        return notifications;
    }

}
@Stateless
public class NotificationService {

    @Inject
    private EntityManager entityManager;

    @Inject
    private BeanManager beanManager;

    public void create(String message) {
        Notification newNotification = new Notification();
        newNotification.setMessage(message);
        entityManager.persist(newNotification);
        beanManager.fireEvent(newNotification);
    }

    public List<Notification> list() {
        return entityManager
            .createNamedQuery("Notification.list", Notification.class)
            .getResultList();
    }

}