当前位置: 首页 > 知识库问答 >
问题:

在SPA JSF 2.2应用程序中删除@ViewScoped bean

隗瑞
2023-03-14

但是,正如我们所知,在使用@ViewScoped bean时,使用这种SPA方法有一个缺点。

因为我们实际上总是停留在同一个JSF视图中,所以当我们用新的SPA内容替换面板组的内容时,@ViewScoped bean不会从内存中删除。

我已经找到了一个解决方案,但我想知道这是不是一个正确的方法,和/或是否有什么遗漏。

private void clearViewScopedBeans() {
    Map<String, Object> viewMap = FacesContext.getCurrentInstance().getViewRoot().getViewMap();
    for(Iterator<Map.Entry<String, Object>> it = viewMap.entrySet().iterator(); it.hasNext(); ) {
      Map.Entry<String, Object> entry = it.next();
      it.remove();    
    }
}

但我也不知道它是否正确。

此外,如果我们希望支持多个窗口选项卡,则包含当前SPA代码段页面名称的NavigationService bean也必须是@ViewScoped,这会带来一个小问题:

当运行上面的代码删除所有现有的@ViewScoped bean时...我们必须排除NavigationService bean本身!!否则,我们最终加载的总是相同的页面,因为NavigationService的一个新实例被实例化,使用默认的SPA页面名称,而不是新的页面名称。

因此,总而言之,我们的代码最终看起来是这样的,在这里,我们保留了一个“排除的”bean名称的映射,我们不想在SPA页面刷新时删除它(即保存SPA页面名称的NavigationService bean)

    private void clearViewScopedBeans() {
    Map<String, Object> viewMap = FacesContext.getCurrentInstance().getViewRoot().getViewMap();
    for(Iterator<Map.Entry<String, Object>> it = viewMap.entrySet().iterator(); it.hasNext(); ) {
      Map.Entry<String, Object> entry = it.next();
      if(!exclusionViewScopedBeans.contains(entry.getKey())) {
          logger.info("Removing an instance of a @ViewScoped bean -> " + entry.getKey());
        it.remove();
      }
    }
}

现在的问题是...这是正确的方法来处理这种水疗情况吗?我们漏了什么吗?

如有任何反馈将不胜感激...提前多谢了!

共有1个答案

漆雕洋
2023-03-14

我想,在SPA(单页app)中移除/清除ViewScopedBeans没有比你的Maikel更好的解决方案了:

private void clearViewScopedBeans() {
Map<String, Object> viewMap = FacesContext.getCurrentInstance().getViewRoot().getViewMap();
for(Iterator<Map.Entry<String, Object>> it = viewMap.entrySet().iterator(); it.hasNext(); ) {
  Map.Entry<String, Object> entry = it.next();
  it.remove();    
}
}

我试过找了很多,但是SPA并不是“官方推荐的”使用JSF的方式,也就是多页面应用程序,所以SPA需要更多的摆弄。

或者,Maikel,你有没有找到或者你有没有用别的方法?

 类似资料:
  • 我使用Apache POI libary导入、导出Excel表格到应用程序(tableView)。我有一些问题从应用程序中删除行在Excel。行的移除工作正常,但是如果我移除一行并重新启动应用程序,它会将最后一个条目导入两次。如果我删除了4或5个条目,在重新启动时,最后一个条目将显示4或5次。我认为最后一行的数字将不会保存或更新。删除excel文件中的行工作良好,只有在我的tableview中,在

  • 我没有找到有用的信息,如何编程或使用设备的设置删除特定的应用程序从白名单。 在Android6.0中引入了打瞌睡模式,在列出的同时,最后一个术语允许忽略部分打瞌睡模式。 要将应用程序放入白名单中,应用程序需要执行代码: 我尝试了下一个动作来将该应用程序从白名单中删除,它刚刚被放置,但没有什么帮助我: 在设置中清除数据应用程序 删除应用程序并重新安装 真正的帮助是改变应用程序的包名。我有一个意见,如

  • 问题内容: 在android中,顶部的通知栏大多数时候都有阴影。但是,有时,例如当应用程序显示其标题栏时,或者在某些其他情况下(例如在Twitter应用程序或市场中),阴影效果消失了。我的猜测是,当下面的内容可以滚动时,阴影应该存在。 但是,在我的应用中,下面的内容无法滚动,我认为徽标顶部的阴影看起来很糟。 有谁知道如何禁用它? 问题答案: 该是你的影子,并将其设置为你的主题将消除它。您可以在Go

  • 我正在使用notificationcompat.builder构建通知,我基本上遵循以下指南:http://developer.android.com/guide/topics/ui/notifiers/notifications.html 通知小图标是设计在Android状态栏中显示的小白唯一版本。 问题是,无论我做什么,相同的图标是用来指示原始应用程序的,我只是想隐藏它,因为我的应用程序图标也

  • 我有一个实体: 1.我需要使用EntityManager从数据库中删除它: 问题:我有一个包含所有这些元素。我从map IllegalArgumentException->“删除一个分离的实例com.entities.cat#cats”中获得它的名称。 问题:如果不按键从数据库中获取,我如何做到这一点? 2.我需要用限制和偏移量getList。 要获得所有元素,我只需使用: 在没有entityMa