当用户单击任何commandButton
时,将在托管bean中调用相应的操作。
是否可以从@PostConstruct
方法或事件侦听器方法获取此操作名称?
答案 0 :(得分:4)
按钮的名称=值对本身可用作常规方式的HTTP请求参数。想象一下,生成的命令按钮的HTML表示看起来像这样
<input type="submit" name="formId:buttonId" value="Submit" ... />
然后它作为请求参数出现,名称formId:buttonId
具有非空值。 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本身一样。
根据具体功能要求(问题中不完全清楚),替代方案可能是对所有感兴趣的actionListener
组件使用<f:actionListener>
或UICommand
,或使用<action-listener>
faces-config.xml
注册全球版action
。 在调用真实{{1}}之前调用它。
答案 1 :(得分:-1)
UIComponent sourceComponent = UIComponent.getCurrentComponent(FacesContext.getCurrentInstance());