会话范围是否适合替代视图范围?

Dis*_*tum 9 java cdi jsf-2 conversation-scope

在JSF 2.0中,视图范围最明显的用例是具有可能多个AJAX回发的单个页面.使用CDI而不是JSF托管bean留给我们不认为范围,使我们要么留下来实现我们自己的,使用(可能充满错误的)第三方实施或使用会话范围.

我的问题:在典型的AJAX情况下,会话范围是否值得替代视图范围?与视图范围一样,它是否允许每个会话多个实例?有什么陷阱?

我知道的陷阱之一,即当用户导航离开页面的谈话范围不会自动删除,而是超时之后被删除.但我不确定当用户在对话超时之前导航该页面时会发生什么.

UPDATE

会话范围确实支持每个会话多个实例.这本书说明了这一点,我能够使用ch中的代码来证实这一点.2.

Mr.*_*mes 4

在任何@ConversationScopedCDI bean 中,您必须具有以下字段:

@Inject
private Conversation conversation; 
Run Code Online (Sandbox Code Playgroud)

每当您想要开始对话时,您都需要检查 bean 是否处于transient状态。否则IllegalStateException会被扔掉。它会是这样的:

public void beginConversation() {
  if (conversation.isTransient()) conversation.begin();
}
Run Code Online (Sandbox Code Playgroud)

通过这样做,您的 Bean 将处于该long-running状态。因此,如果用户离开该页面并稍后返回,您可以随时检查他的对话是否超时,并将他带到他离开的页面。

此外,我已经将@ViewScoped ManagedBeanCDI bean一起使用了一段时间。您仍然可以@InjectCDI bean注入MangedBean中。但我认为你不能采取相反的做法。无论如何,我不知道这是否会导致以后发生任何不好的事情。然而,到目前为止,我还没有遇到任何问题。如果你真的想用 @ViewScoped,我想你可以尝试一下:P。

更新:

在典型的 AJAX 情况下,对话范围是否值得替代视图范围?

我认为@ConversationScoped永远无法完全取代@ViewScoped

与视图范围一样,它是否允许每个会话有多个实例?

不可以,每个会话不能有多个实例。正如我提到的,如果您在旧对话仍处于状态时开始新对话long-running,您将得到IllegalStateException.

有哪些陷阱?

@ViewScoped嗯, over的主要优点之一@RequestScoped是,每次用户将表单提交到同一个视图时,您不需要重新启动数据。然而,对于@ConversationScoped,这个优势被过度利用了。虽然这个问题并不像使用时那么严重@SessionScoped,但只要@ConversationScopedbean 存在,您仍然需要保存启动的数据。对话时间越长,您可能需要保存的数据就越多。

  • 测试并确认同一会话范围声明的多个实例可以存在于同一会话中。因此,在现阶段,对话范围至少是视图范围的可行替代方案。但仍然存在如何避免在这种情况下使用它的陷阱的问题。我将进一步调查,同时查看其他人对此的帖子。 (2认同)