我正在尝试评估是否有可能将Progressive Web App支持添加到JavaServerFaces Web应用程序中。我们的JSF应用程序经过多年的发展,未来可能的需求是使应用程序的某些部分可以离线使用。除了PWA功能提供的其他不错的功能(通知、全屏web应用程序、添加到主屏幕等(外,我们主要感兴趣的是PWA与服务人员和缓存一起提供的离线功能。
我们的客户不得不在有时没有互联网连接的地区工作。在这种情况下,理想情况下,他们应该能够访问应用程序,对自己进行身份验证,并导航到他们需要在看到时使用的应用程序部分。在应用程序的这一部分,他们将操作或创建新的数据集。如果我得到了正确的通知,理论上可以使用PWA服务工作者来缓存数据,甚至存储新创建或更新的数据,以便稍后与服务器同步。是这样吗?
虽然PWA支持的想法似乎很好,但我非常怀疑是否有可能在JSF应用程序中实现离线模式功能,因为所有的应用程序逻辑基本上都在服务器端,并且客户端不会直接对GET/POST/PUT/etc进行API调用(从而缓存和同步(数据。
到目前为止,我的研究还没有产生任何实质性的结果(JSF和PWA(,这就是我发布这个问题的原因。如果有人能给我指明正确的方向,或者如果JSF应用程序能够利用PWA技术,特别是离线/缓存/同步功能,给我一个答案,那就太好了。
谢谢。
自3.7版本以来,OmniFaces通过内置的PWAResourceHandler
在一定程度上增加了对PWA的支持。该用法在展示中得到了很好的记录和演示。
-
首先创建一个从
WebAppManifest
扩展的类public class YourWebAppManifest extends WebAppManifest { }
-
给它一个与其状态匹配的CDI作用域注释,例如
@ApplicationScoped
。@ApplicationScoped public class YourWebAppManifest extends WebAppManifest { }
-
重写/实现属性符合W3规范中的Javadoc和规则。
@ApplicationScoped public class YourWebAppManifest extends WebAppManifest { @Override public String getName() { return "Your Application"; } @Override public Collection<ImageResource> getIcons() { return Arrays.asList( ImageResource.of("logo.svg"), ImageResource.of("logo-120x120.png", Size.SIZE_120), ImageResource.of("logo-180x180.png", Size.SIZE_180), ImageResource.of("logo-192x192.png", Size.SIZE_192), ImageResource.of("logo-512x512.png", Size.SIZE_512) ); } @Override public String getOfflineViewId() { return "/offline.xhtml"; } }
-
在您的HTML头中引用它,如下所示,使用确切的库名称
omnifaces
和资源名称manifest.json
:<link rel="manifest" href="#{resource['omnifaces:manifest.json']}" />
基本上就是这样。PWAResourceHandler
将自动生成所需的manifest.json
和sw.js
文件,并将/offline.xhtml
模板用作脱机视图。
默认情况下,web.xml
中的所有<welcome-file>
条目都注册为"0";可缓存资源";,即它们也可以离线使用。您可以在自定义WebAppManifest
中覆盖此项,如下所示:
@Override
public Collection<String> getCacheableViewIds() {
return Arrays.asList("/index.xhtml", "/contact.xhtml", "/support.xhtml");
}
您可能还想通过使用<f:view transient="true">
使这些页面中的所有JSF表单成为无状态,这样它们就不会抛出ViewExpiredException
。
这个PWAResourceHandler
的主要优点主要是您不需要手动制作sw.js
,而是可以通过一个简单的CDIBean来控制其内容/配置。
我正在评估相同的技术,目前看来jsf确实不适合离线功能。额外的障碍是(尤其是在ios上(有时会决定清除cookies/localstorage,因为如果处于非活动状态,当用户试图恢复时,会破坏视图。我们正在尝试将代码移动到jax-rs端点。
我一直在寻找类似的东西。(尽管我现在对PWA还很陌生(应该相对简单,JSF最终是一个通过servlet进行过滤的标签库。您可以轻松定义标记来渲染所需的任何内容。
但我的感觉是,各种插件主题和组件库的制作方式可能与PWA的想法不兼容。我的怀疑是,我需要从JSF计划开始,并制作一个原型。
所以我实际上已经回到了JSTL。一旦我对模式有了足够的了解,可以制作一些标签库,我就应该能够理解它在JSF中是如何工作的。(现在要全面披露的是,我上一次从事网络开发时,JSTL是新的,但基本原理仍然是基本原理(