我注意到当我使用h:commandButton
从托管bean调用actionlistener
方法时,在当前视图页面上使用的托管bean会自行重新实例化。现在,由于我已经获取了来自这些bean的数据并将其添加到视图中,因此无需重新实例化这些bean,但JSF会这样做。
我使用以下代码调用方法
<h:commandButton value="Increment" actionListener="#{channelController.increment()}"/>
我发现另一个托管bean UserChannelsList
是自己实例化的。我没有向这个bean提交任何数据,或者使用它的任何方法,视图都不需要从这个bean中获取任何属性。为什么JSF自己实例化视图中使用的所有这些bean?
修改
这不是actionListener
属性所致,即使我删除了这个属性&amp;只需单击commandButton
,然后托管bean就会自行实例化!
答案 0 :(得分:0)
如果不在当前作用域中,则将创建在整个视图中引用的所有托管bean或由视图中引用的bean之一作为托管属性。所以你的观点必须直接或间接引用它。如果您无法立即在代码库中找到它,请在bean的构造函数上放置一个断点并检查调用堆栈以确定启动器。
这与使用动作侦听器无关(在没有真正的action
方法的情况下,你可以在上下文中使用它,请阅读Differences between action and actionListener)。