JSF-提交时的触发方法

JSF-提交时的触发方法,jsf,omnifaces,Jsf,Omnifaces,我在新的JSF2.1应用程序中使用复合、标记或自定义组件 我仍然经常忽略使用这项技术的正确方法(或者至少是推荐的方法) 我希望我的组件在用户单击“保存”按钮时执行一些操作。实际上,“保存”按钮是一个Primefaces命令按钮 因此,我使用的按钮代码如下: <p:commandButton id="example" type="submit" value="Confirmer les modifications" process="targetComponent" update="<

我在新的JSF2.1应用程序中使用复合、标记或自定义组件

我仍然经常忽略使用这项技术的正确方法(或者至少是推荐的方法)

我希望我的组件在用户单击“保存”按钮时执行一些操作。实际上,“保存”按钮是一个Primefaces命令按钮

因此,我使用的按钮代码如下:

<p:commandButton id="example" type="submit" value="Confirmer les modifications" process="targetComponent" update="<compoents to update list>">
    <f:param name="save" value="true>
</p:commandButton>
有效

阅读stackoverflow并尝试跟随@BalusC adviced,我正在使用omnifaces(1.2)并尝试使用postInvokeAction事件,原因如中所述

因此,我将我的事件标记更改为:

<f:event type="postInvokeAction" listener="#{myBeautifulBean.handleSubmit}"/>

…myBeautifulBean.handleSubmit从未被调用过

当然,我有omnifaces作为依赖项,其他组件(验证器等)可以正常工作。InvokeActionListener已正确初始化(或者在我看来是这样)

是否应在特定时间注册postInvokeAction?我注意到在omnifaces示例中,{pre | post}InvokeAction事件总是在f:metadata标记中声明为子事件

我发现了很多在f:元数据之外声明preRenderView事件的示例,例如:

顺便说一句,如果我这样做是完全错误的,我会很高兴学习你的智慧。但我想避免:

  • 由p:commandButton操作处理程序触发支持bean方法的链调用
  • 将每个这样的操作处理程序声明为commandButton的f:actionListener子级

我正在寻找一种更面向事件的方式。

如中所述,此事件仅适用于
UIViewRoot
UIForm
UIInput
UICommand
。因此,如果您想要一个通用钩子(在视图上),那么您需要将它放在
UIViewRoot
上。这需要通过将其放置在
中来完成


preRenderComponent
preRenderView
不需要特定的父组件,您实际上可以将其放置在视图中的任何位置,它总是注册到最近的父UI组件。这对于
preInvokeAction
/
postInvokeAction
没有多大意义,因为并不是每种组件都参与invokeAction。例如,将其放在
中不会有太多的自我记录。

如中所述,此事件仅适用于
UIViewRoot
UIForm
UIInput
UICommand
。因此,如果您想要一个通用钩子(在视图上),那么您需要将它放在
UIViewRoot
上。这需要通过将其放置在
中来完成


preRenderComponent
preRenderView
不需要特定的父组件,您实际上可以将其放置在视图中的任何位置,它总是注册到最近的父UI组件。这对于
preInvokeAction
/
postInvokeAction
没有多大意义,因为并不是每种组件都参与invokeAction。例如,将其放置在
中不会是非常自我记录的。

不,它们必须位于顶层视图中。但据我所知,您希望在复合组件中使用
postInvokeAction
?复合、标记或自定义(我使用各种类型)。好的,我找到了一个非常简单的解决方法:将{pre | post}InvokeAction事件添加到h:inputHidden中。不,它们必须位于顶层视图中。但据我所知,您希望在复合组件中使用
postInvokeAction
?复合、标记或自定义(我使用各种类型)。好的,我发现了一个非常简单的解决方法:将{pre | post}InvokeAction事件添加到h:inputHidden。
public void handleSubmit() {
    FacesContext context = FacesContext.getCurrentInstance();
    String saveMandats = JSFUtils.getRequestParameter("save");
    if(context.isPostback() && !context.isValidationFailed() && (saveMandats != null) && !saveMandats.isEmpty())
        confirmeModifsSelection();
}
<f:event type="postInvokeAction" listener="#{myBeautifulBean.handleSubmit}"/>