[英]JSF View Scope: How to Check if an object is in the view tree
我使用Spring + JSF,而View Scope由Spring管理。 我注意到在每个请求上,视图都被销毁并再次创建,因此在每个请求上都会调用任何@PostConstruct方法。
在大多数页面中都可以,因为在该方法中只是一些对象初始化(主要是新的调用)。
但是在其他页面中,这是一个问题,因为我必须进行繁重的查询才能初始化某些列表,并且视图行为会在每个请求上调用初始化方法...因此页面中的任何请求都会很慢。
我知道视图范围将bean及其对象存储在会话中,并在以后恢复它们。 所以我想知道是否有一种方法可以检查这些对象是否已经存储,所以我不需要在每次请求时都初始化那些重对象。 只需从会议中获取它们即可。
更新
使用的视图范围是在此处实现的视图范围: http : //comdynamics.net/blog/109/spring3-jsf2-view-scope/
您绝对应该将重查询过程放入SessionScoped Bean中。
然后,可以通过使用@ManagedProperty使用从ViewScoped Bean到SessionScopedBean的引用
另外,您可以更改HTML代码以直接引用sessionScoped bean属性。
如果查询或树初始化必须在特定操作之后(例如,当您删除或添加影响树的对象时)或访问页面后被重置,则可以将初始化代码移到“刷新”函数中。 无论如何,在ViewScoped或RequestScoped Bean的PostConstruct中避免繁重的初始化,查询和大数据处理
您需要将可在这些页面上重用的数据移动到Session范围的Bean上,并在其上放置一个方法,该方法将允许您在必要时重新加载数据。 然后从Session bean获取View范围bean的数据。 通过这种方法,您仅应在需要新数据时通过在会话Bean上调用reload方法从数据库中检索数据。
我真的看不到您的问题的另一种解决方案。 如果要在视图范围之外持久保存数据,则需要会话范围的bean或单例。 由于不应将特定于会话的数据存储在单例Bean中,因此只能使用会话Bean。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.