由于我在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。其他作用域