When user clicks any commandButton
, then corresponding action is called in managed bean.
Is it possible to get this action name from @PostConstruct
method or from event listener method ?
问问题
3814 次
2 回答
5
按钮的 name=value 对本身可以作为 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));
}
无论哪种方式,最终都将其存储为公共 API 无法使用的ActionEvent
私有字段。所以,除非你抓住反射和实现特定的技巧,否则故事就结束了。UIViewRoot
要确定按下的按钮,最好的办法是像 JSF 本身那样手动检查请求参数映射。
根据具体的功能要求(从问题中并不完全清楚),一种替代方法可能是使用actionListener
或<f:actionListener>
在所有UICommand
感兴趣的组件上,或者使用<action-listener>
infaces-config.xml
来注册一个全局组件。这将在调用实数之前action
立即调用。
于 2012-08-08T11:48:00.180 回答
0
UIComponent sourceComponent = UIComponent.getCurrentComponent(FacesContext.getCurrentInstance());
于 2018-02-02T09:45:30.703 回答