昨天我看到了一个关于Java Server Faces 2.0的演示文稿,虽然我现在是一个快乐的ASP.NET MVC/jQuery开发人员,但它看起来确实令人印象深刻.我最喜欢JSF的是大量支持AJAX的UI组件,这些组件似乎比ASP.NET MVC更快,特别是在AJAX重型站点上.集成测试看起来也很不错.
由于演示文稿只强调了JSF的优点,我也想听听另一方面的意见.
所以我的问题是:
所述的生命周期 @RequestScoped和@SessionScopedBean 管理豆由Servlet容器自身管理,因为它们是基本上作为一个属性存储HttpRequest和HttpSession分别.JSF如何管理生命周期@ViewScopedBean?我知道它是在创建视图时创建的,并且可以使用,直到有回发到另一个视图.但是我发现在我们离开那个视图后不会立即收集垃圾.
我一直注意到页面中使用的所有bean都在更新页面的任何一小部分时被不必要地实例化.好的,它们是请求作用域,因此将在每个请求上实例化,但只有当正在更新的页面部分需要那些bean时才应该这样做.不是吗?
为什么JSF中这个糟糕的设计?
我找到了造成这种行为的真正罪魁祸首,我f:event type="preRenderView"在网页的某些地方.这实际上导致重新实例化这些bean以调用监听器.修复是用来f:event type="preRenderComponent"代替.这减少了每个请求中大多数不必要的bean实例化,但我仍然看到一些不必要的bean实例化.