JSF在托管bean中获取当前操作

当用户单击任何commandButton ,将在托管bean中调用相应的操作。 是否可以从@PostConstruct方法或事件侦听器方法获取此操作名称?

按钮的名称=值对本身可用作常规方式的HTTP请求参数。 想象一下,生成的命令按钮的HTML表示如下所示

  

然后它作为请求参数出现,名称为formId:buttonId ,其值为非null。 JSF在“应用请求值”阶段中使用此信息来确定是否按下了按钮。 这发生在与按钮组件关联的渲染器的decode()方法期间,大致如下所示:

 if (externalContext.getRequestParameterMap().containsKey(component.getClientId(context))) { component.queueEvent(new ActionEvent(component)); } 

或者当它涉及ajax请求时,则该按钮的名称可用作javax.faces.Source请求参数的值。

 if (component.getClientId(context).equals(externalContext.getRequestParameterMap().get("javax.faces.Source"))) { component.queueEvent(new ActionEvent(component)); } 

无论哪种方式, ActionEvent最终都存储为UIViewRoot的私有字段,公共API 无法使用它。 所以,除非你抓住反思和实现特定的黑客,这是故事的结尾。

要确定按下按钮,最好的办法是手动检查请求参数映射,就像JSF本身一样。

根据具体的function要求,从问题中不是很清楚,另一种方法是在所有感兴趣的UICommand组件上使用actionListener ,或者在faces-config.xml使用 。注册全球的。 这将在调用实际action 之前调用。

 UIComponent sourceComponent = UIComponent.getCurrentComponent(FacesContext.getCurrentInstance());