【问题标题】:Observer and JSF ManagedBean观察者和 JSF ManagedBean
【发布时间】:2013-05-11 15:15:16
【问题描述】:

我有一个下拉菜单,用户可以从中选择一个项目(在我的案例中,他正在处理的项目),网页显示的大部分数据都取决于该选择。所以我有几个视图范围的 bean,它们调用 EJB bean,它们执行依赖于所选项目的数据库查询。

我想缓存大部分数据以减少数据库查询,但是当用户更改项目时,它必须通知其他 bean 已发生更改并且需要获取新数据。

于是我有了一个想法:

  • projectChangeManager(会话范围的托管 bean),保存选择的项目,在项目更改时通知其订阅者。在我清理观察者的地方实现了@PreDestory 方法。

  • 项目观察者(查看范围内的托管 bean),根据项目选择从 EJB 获取数据,具有从 EJB 获取新数据的 onProjectChange() 方法。已实现 @PreDestory 方法,其中调用 projectChangeManager.detach(this) 以取消订阅 projectChangeManager。

这种方法在 JSF 中合理吗?还是最好不要实现观察者模式,而只是当用户更改项目时,我会获取所有缓存的数据并将其保存在会话 bean 中,然后在 ViewScoped bean 中我只是从 SessionScoped bean 访问该数据?还是有更好的办法?

【问题讨论】:

    标签: jsf jsf-2 observer-pattern


    【解决方案1】:

    对我来说,这看起来像是过度设计。最初,我可能只是让每个托管 bean 在需要数据时调用存储库/EJB。然后依靠持久层中的缓存(JPA/Hibernate/无论你使用什么)。

    如果这是一个性能问题,您可以考虑一些手动缓存解决方案。

    即使在这种情况下,我仍然看不到您的观察者方法的优势。您的第二种方法(在会话 bean 中缓存,从 ViewScoped bean 访问)看起来更简单,应该也能正常工作。

    最后,如果您决定使用缓存,请考虑如何避免过时的缓存。如果您缓存每个会话,则一个会话中的更改将在另一个会话中不可见。顺便说一句,我认为这是将缓存留给持久层的另一个原因。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-26
      • 1970-01-01
      • 1970-01-01
      • 2016-02-20
      • 2023-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多