我有一个下拉菜单,用户可以从中选择一个项目(在我的案例中,他正在处理的项目),网页显示的大部分数据都取决于该选择。所以我有几个视图范围的 bean,它们调用 EJB bean,它们执行依赖于所选项目的数据库查询。
我想缓存大部分数据以减少数据库查询,但是当用户更改项目时,它必须通知其他 bean 已经发生更改并且需要获取新数据。
于是我有了一个想法:
projectChangeManager(会话范围的托管 bean),保存选择的项目,在项目更改时通知其订阅者。在我清理观察者的地方实现了@PreDestory 方法。
项目观察者(查看范围内的托管 bean),根据项目选择从 EJB 获取数据,具有从 EJB 获取新数据的 onProjectChange() 方法。在调用 projectChangeManager.detach(this) 以取消订阅 projectChangeManager 的地方实现了 @PreDestory 方法。
这是 JSF 中的合理方法吗?还是最好不要实现观察者模式,而只是当用户更改项目时,我会获取所有缓存的数据并将其保存在会话 bean 中,然后在 ViewScoped bean 中我只是从 SessionScoped bean 访问该数据?或者,还有更好的方法?