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());