Jsf / Spring请求作用域bean



由于我在javaee编程方面没有太多经验,也没有人可以问,所以我想问你。我的代码中有一件事我不喜欢,并认为它以错误的方式实现。我的托管bean是请求范围的。在jsf中,我使用rich:pickList从list中获取数据。

@Scope("request")
public class MyBean{
     private List<String> sourceList;
     ....     
     public List<String> getsourceList() {
            //if (sourceList == null)    <--- Has no sence in request scoped bean
             { sourceList = service.loadList();
             }
             return sourceList;
     }
....
}

我也有提交按钮存储一些数据。

问题是,每次当页面做一些动作时(例如点击提交按钮),这个get方法每次都被调用,然后到服务层,然后到dao和数据库。这显然不是正确的解决方案。如何避免呢?谢谢你的回答。

如果您使用的是JSF 2.0,您可以通过@ViewScoped使用新的视图作用域。

@ManagedBean
@ViewScoped
public class Bean {
    private List<Foo> foos;
    @EJB
    private FooService fooService;
    @PostConstruct
    public void init() {
        foos = fooService.list();
    }
    public List<Foo> getFoos() {
        return foos;
    }
}

当您还在使用JSF 1时。x,很高兴知道RichFaces的<a4j:keepAlive>和Tomahawk的<t:saveState>对具有上述代码设计的请求作用域bean具有完全相同的效果(即不要在getter中加载数据):

<a4j:keepAlive beanName="#{bean}" />

<t:saveState beanName="#{bean}" />

我没有使用新的RichFaces的@KeepAlive注释,但是关于文档,它的行为应该是一样的。

每个人都有这个问题,因为没有"对话"范围。你有"会话"(只要用户登录)和"请求"(一个请求/响应周期)。

你需要的是一种方法,说"用户已经开始了一个对话",然后做一些属于这个对话的请求,最后结束它。

由于JavaEE不支持此操作,因此您必须模拟它。当用户开始对话时,将bean放在会话作用域中并保持在那里。当用户完成对话后,手动删除bean或告诉它清理缓存。

在Spring WebFlow中实际上有一个"conversation scope":

http://static.springsource.org/spring-webflow/docs/2.0.x/reference/html/ch12s06.html

在web.xml中添加Spring RequestContextListener, Spring可以添加请求范围和会话范围

<listener>
     <listener-class>
          org.springframework.web.context.request.RequestContextListener
     </listener-class>  
</listener>

Cf: 3.4.4。其他作用域

相关内容

  • 没有找到相关文章

最新更新