【问题标题】:JSF View Scope: How to Check if an object is in the view treeJSF View Scope:如何检查对象是否在视图树中
【发布时间】:2014-05-28 11:26:25
【问题描述】:

我使用 Spring + JSF,View Scope 由 Spring 管理。我注意到,在每个请求中,视图都会被销毁并再次创建,因此每个请求都会调用任何 @PostConstruct 方法。

在大多数页面中这是可以的,因为在该方法中只是一些对象初始化(主要是 new 调用)。

但在其他页面中,这是一个问题,因为我必须进行繁重的查询来初始化一些列表,并且视图行为会在每个请求上调用初始化方法......所以页面中的任何请求都非常缓慢。

我知道视图范围在会话中存储 bean 及其对象,然后再恢复它们;所以我想知道是否有办法检查这些对象是否已经存储,所以我不需要在每次请求时都初始化这些重对象;只需从会话中获取它们即可。

更新

使用的视图范围是这里实现的:http://comdynamics.net/blog/109/spring3-jsf2-view-scope/

【问题讨论】:

  • 也许您需要将可在这些页面上重用的数据移动到会话范围的 bean 中,并在其上放置一个方法,以便您在必要时重新加载数据。然后从 Session bean 中获取 View 范围 bean 的数据。
  • Spring 本身不支持视图范围(仅请求、会话和应用程序)。因此,要么您创建了自己的视图范围实现,要么没有视图范围。
  • @M.Deinum 是对的。如果您还没有实现视图范围,那么这可能会导致您的问题。有关如何执行此操作的信息,请参阅此博客文章:cagataycivici.wordpress.com/2010/02/17/…
  • 您好,感谢您的回答。可悲的是,我已经实现了视图范围,请参阅更新以获取信息。我对使用 Session Scope 仅用于存储此数据持怀疑态度,该数据仅在此特定页面中使用,因为很难手动追踪并将其从会话中删除,至少我认为......如果你有好方法,不要羞于分享=D
  • @LucasP 我完成了你的建议......它运作良好,谢谢。可能的缺点,我稍后会处理。我看不到接受你建议的按钮,所以如果你可以直接回答,而不是评论,我会接受你的回答。 YannicuLar 已经回答了你所做的同样的事情,但既然你先做了,你应该接受。问候!

标签: java spring jsf jsf-2 view


【解决方案1】:

您需要将可在这些页面上重复使用的数据移动到 Session 范围的 bean 中,并在其上放置一个允许您在必要时重新加载数据的方法。然后从 Session bean 中获取 View 范围 bean 的数据。通过这种方式,您应该只在需要新数据时通过在会话 bean 上调用 reload 方法从数据库中检索数据。

我真的没有看到解决您问题的其他方法。如果要在视图范围之外持久化数据,则需要会话范围的 bean 或单例。由于您不应该将会话特定数据存储在单例 bean 中,因此您只能使用会话 bean。

【讨论】:

    【解决方案2】:

    您绝对应该将查询繁重的进程放入 SessionScoped Bean。

    然后您可以通过 @ManagedProperty 使用从 ViewScoped bean 到 SessionScopedBean 的引用

    此外,您可以更改 html 代码以直接引用 sessionScoped bean 属性。

    如果查询或树初始化必须在特定操作后重置(例如,当您删除或添加影响树的对象时),或访问页面后,您可以将初始化代码移动到“刷新' 功能。无论如何,在 ViewScoped 或 RequestScoped Beans 的 PostConstruct 中避免繁重的初始化、查询和大数据处理

    【讨论】:

    • 感谢您的回答,如果我有足够的声誉,我会投票赞成。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    相关资源
    最近更新 更多