在JSF2.0中刷新托管会话bean

在JSF2.0中刷新托管会话bean,jsf,javabeans,managed-bean,session-bean,Jsf,Javabeans,Managed Bean,Session Bean,在我将一些数据提交到数据库之后,我希望会话bean自动刷新自己,以反映最近提交的数据。在JSF2.0中使用托管会话bean时如何实现这一点 目前,我必须重新启动web服务器,以便清除会话并重新加载。2种方法: 将它们放在视图范围中。在会话范围内存储特定于视图的数据是一种浪费。如果您有性能问题,那么应该集中精力在持久层中实现连接池、DB级分页和/或缓存(例如JPA2支持二级缓存) 添加一个publicload()方法,以便可以从action方法调用它(如果需要,可以从另一个bean调用) 或者来

在我将一些数据提交到数据库之后,我希望会话bean自动刷新自己,以反映最近提交的数据。在JSF2.0中使用托管会话bean时如何实现这一点

目前,我必须重新启动web服务器,以便清除会话并重新加载。

2种方法:

  • 将它们放在视图范围中。在会话范围内存储特定于视图的数据是一种浪费。如果您有性能问题,那么应该集中精力在持久层中实现连接池、DB级分页和/或缓存(例如JPA2支持二级缓存)


  • 添加一个public
    load()
    方法,以便可以从action方法调用它(如果需要,可以从另一个bean调用)

    或者来自另一个bean中的操作方法(对于托管bean设计有点偏离常规的情况):

    当然,这只会影响当前会话。如果你也想影响其他会话,你应该考虑把它们放在视图范围内,而不是按照第一种方式建议。

  • 另见:

    实际上,这个解决方案是可行的,但我发现,当您对3个不同的JSF页面使用同一个bean时,bean的值在页面之间丢失。我需要保留这些值。然后按照第1种方法的建议对bean视图进行范围限定。显然,它根本不应该是会话范围的bean。另请参见:我明白了…如果我希望我的所有托管bean在会话中保留值并在其他页面中使用它们,那么它们都应该是ViewScope。否。如果您希望每个视图使用一个相同的bean,那么它们应该是视图范围。这样,每个浏览器选项卡/窗口都将有自己的bean实例。在整个会话期间,它们不会相互共享。为此,您需要一个会话范围的bean。谢谢你,巴卢斯,我想现在我已经掌握了不同类型示波器的窍门。
    @ManagedBean
    @ViewScoped
    public class FooBean {
        // ...
    }
    
    @ManagedBean
    @SessionScoped
    public class FooBean {
    
        private List<Foo> foos;
    
        @EJB
        private FooService fooService;
    
        @PostConstruct
        public void load() {
            foos = fooService.list();
        }
    
        // ...
    }
    
        public void submit() {
            fooService.save(foos);
            load();
        }
    
        @ManagedProperty("#{fooBean}")
        private FooBean fooBean;
    
        public void submit() {
            fooService.save(foos);
            fooBean.load();
        }