Dis*_*tum 9 java cdi jsf-2 conversation-scope
在JSF 2.0中,视图范围最明显的用例是具有可能多个AJAX回发的单个页面.使用CDI而不是JSF托管bean留给我们不认为范围,使我们要么留下来实现我们自己的,使用(可能充满错误的)第三方实施或使用会话范围.
我的问题:在典型的AJAX情况下,会话范围是否值得替代视图范围?与视图范围一样,它是否允许每个会话多个实例?有什么陷阱?
我知道的陷阱之一,即当用户导航离开页面的谈话范围不会自动删除,而是超时之后被删除.但我不确定当用户在对话超时之前导航回该页面时会发生什么.
UPDATE
会话范围确实支持每个会话多个实例.这本书说明了这一点,我能够使用ch中的代码来证实这一点.2.
在任何@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 ManagedBean与CDI bean一起使用了一段时间。您仍然可以@Inject将CDI bean注入MangedBean中。但我认为你不能采取相反的做法。无论如何,我不知道这是否会导致以后发生任何不好的事情。然而,到目前为止,我还没有遇到任何问题。如果你真的想用 @ViewScoped,我想你可以尝试一下:P。
更新:
在典型的 AJAX 情况下,对话范围是否值得替代视图范围?
我认为@ConversationScoped永远无法完全取代@ViewScoped。
与视图范围一样,它是否允许每个会话有多个实例?
不可以,每个会话不能有多个实例。正如我提到的,如果您在旧对话仍处于状态时开始新对话long-running,您将得到IllegalStateException.
有哪些陷阱?
@ViewScoped嗯, over的主要优点之一@RequestScoped是,每次用户将表单提交到同一个视图时,您不需要重新启动数据。然而,对于@ConversationScoped,这个优势被过度利用了。虽然这个问题并不像使用时那么严重@SessionScoped,但只要@ConversationScopedbean 存在,您仍然需要保存启动的数据。对话时间越长,您可能需要保存的数据就越多。
| 归档时间: |
|
| 查看次数: |
6393 次 |
| 最近记录: |