2011-04-29 98 views
1

因为我没有太多的javaee编程经验,也没有人问,所以我想问你。 我的代码中有一件事我不喜欢,并且认为它是以错误的方式实现的。 我的托管bean是请求作用域。在jsf我使用rich:pickList从列表中获取数据。Jsf/Spring request scoped bean

@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; 
    } 

.... 

} 

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

的问题是,当页面做一些动作的每个时间(例如点击提交按钮)该获得方法被调用,每次和去服务层,然后DAO和数据库。这显然似乎是不正确的解决方案。 如何避免它? 谢谢你的答案。

回答

0

如果你在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's <t:saveState>具有完全相同的请求相同的作用范围的bean与上面的代码设计(即不加载数据吸气):

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

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

我没有使用过的新的RichFaces' @KeepAlive注释,但有关文档,它应该表现得一样。

0

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

什么你需要的是一个方式说“用户已经开始了谈话”,然后做一对夫妇属于会话请求,并最终把它包起来。

由于JavaEE不支持此功能,因此您必须对其进行仿真。当用户开始会话时,将该bean放入会话范围并保留在那里。当用户完成对话时,手动删除该bean或告诉它清理它的缓存。

+0

和怎么样的keepAlive功能?它会有帮助还是这不是一个好习惯? – ayscha 2011-04-29 08:24:25

+0

有很多keepAlive功能。你在说哪一个? – 2011-04-29 08:29:26

+0

例如,将托管bean指定为@KeepAlive – ayscha 2011-04-29 08:34:31

0

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

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

CF卡: 3.4.4. The other scopes

相关问题