向JSF Web应用程序添加PWA支持



我正在尝试评估是否有可能将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的支持。该用法在展示中得到了很好的记录和演示。

  1. 首先创建一个从WebAppManifest扩展的类

    public class YourWebAppManifest extends WebAppManifest {
    }
    
  2. 给它一个与其状态匹配的CDI作用域注释,例如@ApplicationScoped

    @ApplicationScoped
    public class YourWebAppManifest extends WebAppManifest {
    }
    
  3. 重写/实现属性符合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";
    }
    }
    
  4. 在您的HTML头中引用它,如下所示,使用确切的库名称omnifaces和资源名称manifest.json:

    <link rel="manifest" href="#{resource['omnifaces:manifest.json']}" />
    

基本上就是这样。PWAResourceHandler将自动生成所需的manifest.jsonsw.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是新的,但基本原理仍然是基本原理(

相关内容

  • 没有找到相关文章

最新更新