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

2023-11-25

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


JSF 2.3+

您可以使用@Push and <f:websocket>为了这。下面是一个带有应用程序范围套接字的启动示例,它在后端通过以下方式触发事件时更新数据表Event#fire()哪个托管 bean@Observes.

<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>
@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.getEvent().fire(newNotification);
    }

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

}

JSF 2.2-

如果您还没有使用 JSF 2.3,则需要使用第 3 方 JSF 库。

  • OmniFaces has <o:socket>(JSR356 WebSocket + CDI)
  • PrimeFaces had <p:socket>(气氛)
  • ICEfaces有“ICEpush”(长轮询)

应当指出的是,<o:socket>是 JSF 2.3 的基础<f:websocket>。因此,如果您发现了很多相似之处,那就是正确的。

PrimeFaces 用途气氛在幕后(如果没有 Maven,设置起来很麻烦)。 Atmosphere 支持 Websocket,并可回退到 SSE 和长轮询。 ICEfaces 基于古代长轮询技术。所有这些都没有实现本机 JSR356 WebSocket API,该 API 后来才在 Java EE 7 中引入。

OmniFaces 使用原生JSR356 WebSocket API(所有 Java EE 7 服务器和 Tomcat 7.0.27+ 均受支持)。因此,它的设置和使用也是最简单的(一个 JAR、一个上下文参数、一个标签和一个注释)。它只需要CDI(不难安装在 Tomcat 上),但它甚至使您能够从非 JSF 工件(例如@WebServlet)。出于安全性和 JSF 视图状态保持原因,它仅支持单向推送(服务器到客户端),而不支持相反的方式。为此,您可以继续以通常的方式使用 JSF ajax。 JSF 2.3<f:websocket>很大程度上基于 OmniFaces<o:socket>,因此您会发现它们的 API 有很多相似之处(JSF - OmniFaces).

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

也可以看看:

  • 如何在 JSF 组件中监视异步/后台线程状态并获取通知
  • 使用 JSF/Java EE 从数据库实时更新
  • 当数据库中的某些内容发生修改时,仅通过 WebSocket 通知特定用户
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • JSF 将 ui:param 与复合组件结合起来

    你以前通过这个论坛救了我很多次 但现在我真的被困住了 现在不知道该去哪里搜索了 我总是收到以下错误消息 警告级别 但方法也未正确执行 javax el PropertyNotFoundException Target Unreachable
  • 在Android的IntentService中等待异步回调

    我有一个IntentService在另一个类中启动异步任务 然后等待结果 问题是IntentService将尽快完成onHandleIntent 方法已经运行完毕了 对吗 这意味着 通常情况下 IntentService异步任务启动后会立即
  • 用于更新视图的 Meteor 异步代码

    所以我想做的是发出一个 HTTP get 请求 然后用响应更新视图 由于某种原因它不起作用 这是我所拥有的 我一直遵循这个要点 https gist github com 3443021 https gist github com 3443
  • FastAPI 中间件中的后台任务

    我正在尝试将后台任务添加到我的中间件中 但尚未在他们的文档中找到任何官方方法 这是我迄今为止尝试过的 async def task1 logging info Waiting time sleep 5 logging info Waited
  • 在非异步函数中使用“await”

    我有一个异步函数 它在代码中的某个位置通过 setInterval 运行 该函数定期更新一些缓存 我还有一个不同的同步函数 它需要检索值 最好从缓存中检索 但如果是缓存未命中 则从数据源中检索 我意识到以同步方式进行 IO 操作是不明智的
  • 使用await Task.Run()的异步方法永远不会“完成”

    我有一个方法定义为 public async Task SomeAsyncMethod DoSomeStuff await Task Run gt DoSomeSyncStuff DoSomeOtherSyncStuff var someD
  • 将默认消息“验证错误:需要值”更改为“需要值”

    我可以修改这个默认值吗required true 验证消息仅显示 需要值 formId inputId 验证错误 值是必需的 Either使用输入组件的requiredMessage属性
  • JSF 1.2:如何在同一视图上的回发中保持请求范围的托管 bean 处于活动状态?

    是否可以在同一页面上的回发过程中保持请求作用域的 bean 处于活动状态 一般的问题是 bean 在请求结束时被丢弃 并在每次表单提交时重新创建 例如动态操作背后的布尔值disabled readonly and rendered重置为默认
  • h:message 为空时的默认输出

    我正在寻找一种在 JSF 中实现以下切换的方法 div if empty div
  • async.js 和系列问题

    连接后尝试运行 fetch 提取比连接更快 并且在控制台中我收到提取错误 因为它返回结果的速度比连接完成的速度快 但在异步系列的文档中 有一个工具可以在第一个返回结果后运行第二个函数 Settimeouts 可以保存情况 但它并不美观 当一
  • JSF中直接更改URL来限制用户访问页面

    我的应用程序中有两种用户 客户和卖家 我正在使用一个PhaseListener在JSF中防止用户在未登录的情况下访问页面 但在登录后我不知道如何防止用户更改地址栏中的URL并访问他也不允许的页面 例如 阻止客户访问卖家页面 有谁知道我如何防
  • 捆绑标识符和推送证书... aps-环境授权错误

    我读了xcode 从哪里获取应用程序的标识符 https stackoverflow com questions 3728800 where does xcode take applications identifier from 来自 P
  • jsf中的会话注销问题

    我正在开发一个 Web 应用程序 并使用框架 jsf hibernate 和 spring 应用程序中有不同类型的用户 根据此处登录的用户类型 我为不同的用户类型启用菜单中的链接 用户登录后 会向用户提供菜单栏中的注销链接 我已经编写了 l
  • 如何将值传递到 selectOneMenu 中的监听器

    我有 2 个下拉菜单 类型和代码 如果值 A 或 B 或 C 我希望代码下拉列表根据类型下拉列表更改值 如何将 A 或 B 或 C 的值传递给侦听器 以便它可以理解和处理我的 List
  • f:ajax 不工作

    我很难得到f ajax从事某项工作h panelGroup 这就是我正在做的 JSF 代码
  • 删除特定数据表上的所有边框

    我需要使用 PrimeFaces 隐藏一个数据表的所有边框 而不是全部 我尝试了很多事情 但没有人奏效 有谁知道该怎么做 我已将以下样式 单独 应用于ui datatable class border hidden important bo
  • Node.js 中的异步或步骤

    我无法让我的异步代码与 node js 一起使用 尝试异步和步骤库 代码仅返回第一个函数 似乎没有执行其余函数 我究竟做错了什么 thanks var step require step step function f1 console l
  • c# WebClient DownloadProgresschanged TotalBytesToReceive = -1

    我浏览了一下网络 没有看到其他人遇到这个问题 我正在使用使用 DownloadFileAsync 的 Web 客户端 当事件处理程序 DownloadProgressChanged 被调用时 TotalBytesToReceive 来自 D
  • Primefaces 中动态生成条形图

    我正在使用 Primefaces 4 0 我需要根据查询结果的数量生成条形图 条形图的标题和颜色也应该能够为所有使用查询结果的人动态设置 条形图示例如下
  • Java:高性能消息传递(单生产者/单消费者)

    我最初问这个问题here https stackoverflow com questions 3367192 java is while true loop in a thread bad whats the alternative 但我意

随机推荐

  • 什么时候应该封装泛型类型?

    我见过很多人建议您应该使用更接近您的领域的类来封装泛型类型 例如 Steve 和 Nat 建议在以测试为指导不断发展面向对象的软件 that 我们的经验法则是 我们尝试限制使用泛型传递类型 特别是当应用于集合时 我们将其视为一种重复形式 这
  • Swift - 将重载函数分配给变量

    我收到编译时错误 指出 myFunc 引用不明确 func f s String gt String return version 1 s func f sourceString s String gt String return vers
  • Mod 安全响应/请求正文大小?

    如何在 Mod Security 中获取响应 请求正文的大小 我不断收到此错误 例如 Mon Sep 17 23 34 38 2012 error client 192 168 1 1 ModSecurity Output filter R
  • WPF 中的两种方式百分比格式绑定

    我有这个文本框
  • 为什么有些网页的源代码都是一行?

    当查看很多网页的源代码 如JS CSS HTML 时 我发现它们都在一行中 他们是怎么做到的 他们使用一些工具来制作吗 我们可以重组它吗 Thanks 它是缩小的 HTML 即删除了空格 有很多工具可以做到这一点 你可以通过谷歌搜索找到它们
  • 使用 zcat 和 sed 或 awk 编辑压缩的 .gz 文本文件

    我正在尝试编辑压缩的 fastq gz 文本文件 通过删除第 2 6 10 14 行的前六个字符 我现在有两种不同的方法来执行此操作 使用 awk 或 sed 但这些仅如果文件被解压 似乎可以工作 我想编辑这些文件而不解压缩它们 并尝试了以
  • ASP.NET、VB:如何从后台代码访问 FormView 内的控件?

    我的 FormView 控件内有一个复选框和一个面板 我需要从后面的代码访问它们 以便使用复选框确定面板是否可见 这是我最初使用的代码 但由于我将控件放在 FormView 中 所以它不再起作用 Protected Sub checkGen
  • 简单的 C++ hash_set 示例

    我是 C 和 STL 的新手 我被以下存储自定义数据结构的哈希集的简单示例所困扰 include
  • 使用“grep”搜索选项卡,不带 -P

    我以前用过grep P早些时候成功了 直到我得到了一台 grep 未编译为支持 Perl 正则表达式的机器 现在我在匹配选项卡时遇到问题 t特点 grep G t matches a literal t grep E t matches a
  • MySQL foreach 循环

    我必须迭代 MySQL 中的 User 表中的每一行 我需要为用户中的每次迭代创建一个新行地址 并具有下面描述的一些条件 我有3张桌子 User id stuff id person email Person id stuff id add
  • 以编程方式检测 SQL Server 版本

    我将 C 与 SMO 结合使用 并尝试检测我正在连接的 SQL Server 版本 例如企业版 标准版 我知道如何获取版本信息 但这只能告诉我 SQL Server 的版本 例如 SQL Server 2008 与 SQL Server 2
  • 如何从 SFSafariViewController 获取 URL?

    我正在将 iOS 中的 fitbit login api 与 Objective C 集成 我需要获取回调 URL 我目前正在使用SFSafariViewController但登录后无法读取 URL 是否可以从以下位置获取 URLSFSaf
  • Jquery防止多次提交

    如果有人多次单击其中一个提交按钮 我想防止多次提交 How can unbind or undelgate在本例中调用我的自定义函数do some stuff这种情况只发生一次 因为我尝试了一些 jquery 方法 但我认为我做错了什么 谢
  • Django 上的脆皮表单变量不存在

    对于 Django 上的脆皮形式 我不断得到VariableDoesNotExist at Failed lookup for key form in u False False None None extends base html lo
  • DOMException:无法在“History”上执行“replaceState”:带有 URL 的历史状态对象

    在反应应用程序中 在谷歌上打开网页的缓存版本时出现以下错误 DOMException 无法在 历史记录 上执行 replaceState 历史记录 无法在 URL 为 https projecturl 的状态对象中创建 来源为 https
  • 选择不在另一个表中的所有列 laravel 5.5

    我有两个表 第一个表称为 用户 第二个表称为 buy courses 我正在尝试选择 user name 不在 buy courses 中的所有用户 我尝试过类似的东西 users DB table users gt rightjoin b
  • 仅允许来自特定引荐来源网址的用户(重定向其余部分)- HTACCESS

    我一直在尝试阻止所有试图查看 php 页面而不来自我的特定跟踪链接的人的访问 我希望如果他们不是来自我的链接 他们会被重定向到另一个网站 我尝试使用 htaccess 方法如下 RewriteEngine On RewriteBase al
  • Emacs 中的 Python 解释器重复行

    怎么了 gt gt gt 2 10 2 10 20 gt gt gt 我想要发生的事情 gt gt gt 2 10 20 gt gt gt 有谁知道为什么命令在执行之前被打印出来以及如何阻止它这样做 我找不到任何关于此的文档 我在 Mac
  • 使用 LINQ to SQL 关系表上的动态Where子句

    我需要动态 where 子句的帮助在关系表上 一对多 在 LinqToSql 中 用户从页面中选择条件 有4个输入供用户选择子句 例如 来自客户表的 CompanyName 和 CompanyTitle 以及来自订单表的 OrderDate
  • 服务器如何将异步更改推送到 JSF 创建的 HTML 页面?

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