JSF 2:我应该使用什么范围?

时间:2010-12-08 10:30:31

标签: jsf jsf-2

我很困惑我应该使用哪个范围。

这里我有一个模块,包括4级页面,如页面浏览 - 页面标题 - 该标题的页面详细信息 - 该详细信息的页面子详细信息。我认为每个页面都有自己的托管bean。

最深层次,第4级(子详细信息页面),将能够访问外层中每个其他被管理域的状态。级别3(详细信息页面)可以访问级别2 managedbean的状态(标题页面)和级别1 managedbean的状态(浏览)。

外部管理的bean无法访问更深层次的被管理状态

使用请求范围是行不通的,因为深层次页面需要访问外层的其他状态。

使用会话范围可以,但是当用户切换到其他不相关的程序模块时,内存会消耗,并且只要会话,那些未使用的bean将保留在内存中。而且,我无法在不同的标签中打开这些页面链。

使用会话范围对我来说也很困惑,因为我没有像向导样式页面或测验页面那样清晰的begin()和end()。用户可以使用这些页面向前切换,并在任何页面中执行操作。

使用视图范围似乎是可能的,但我必须使用从一个页面传递到另一个页面的参数。更深层次的bean无法访问外部bean,但是它们可以从上一页接收字符串参数。这有点难看,因为我可能需要再次查询数据库中的许多信息,这些信息本来可以在之前的托管bean中完成。

我认为错了吗?

请分享您的想法。

谢谢你,
Albert Kam

1 个答案:

答案 0 :(得分:3)

JSF 2中的新Flash范围可能对您有所帮助。可以把它看作会话范围,它在读取一次后被清除。它与其他示波器有点不同,因为它不是注释,而是地图。您可以将第2页中的第1页所需的所有信息放入Flash范围,在第2页中将其读取为PostConstruct注释方法,然后输入第3页所需的所有数据,依此类推。稍微凌乱,但至少你不需要使用视图参数。实际的托管bean可以是Requestscoped。它看起来像这样:

Level1Bean

@public String toLevel2Button(){
    ELFlash.getFlash().put("data1", object1);
    ELFlash.getFlash().put("data2", object2);
    return "level2";

Level2Bean

@PostConstruct
public void init(){
    object1 = (MyType1)ELFlash.getFlash().get("data1");
    object2 = (MyType2)ELFlash.getFlash().get("data2");
}

public String toLevel3(){
    ELFlash.getFlash().put("data1", object1);
    ELFlash.getFlash().put("data2", object2);
    ELFlash.getFlash().put("data3", object3);
    return "level3";
}

您可以找到简短示例here。可以直接从View中读取闪存范围。除此之外,我无法想到在不使用视图参数的情况下在视图之间传输数据的任何方法。