3

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 ?

4

2 回答 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 回答