我正在使用JSF的Apache MyFaces风格,我在使用动作侦听器遇到了一些奇怪的行为。
当我像这样使用全局action-listener
:
<application>
<view-handler>com.sun.facelets.FaceletViewHandler</view-handler>
<el-resolver id="msgSrcResolver">com.personal.framework.utils.FacesELResolver</el-resolver>
<message-bundle>resources.errors</message-bundle>
<action-listener>com.personal.framework.listeners.MyActionListener</action-listener>
</application>
JSF运作良好。 'MyActionListener.processAction(..)'方法通过调用action
上列出的CommandButton
方法来工作。不幸的是,由于在同一个项目中基于Spring WebFlow的应用程序中出现了一些冲突,我们无法使用它。
要解决此问题,我尝试将动作侦听器直接添加到CommandButton
,如下所示:
<h:commandButton id="continue" forceId="true"
image="continue.gif"
action="#{depositBean.postProcess}"
value="Continue">
<f:actionListener type="com.personal.framework.listeners.MyActionListener" > </f:actionListener>
</h:commandButton>
这种使用ActionListener
的方法无法正常工作 - 它会根据需要调用depositBean.postProcess
到MyActionListener
,但之后会再次调用depositBean.postProcess
MyActionListeren。
如何在ActionListener
中使用CommandButton
,而不是第二次调用Action
本身(与使用全局ActionListener
的方式相同)?
注意 - 我们使用ActionListener
进行验证错误处理,因此必须通过Action
调用所有ActionListener
方法。