【发布时间】:2012-08-05 07:53:33
【问题描述】:
当用户单击任何commandButton 时,将在托管bean 中调用相应的操作。
是否可以从 @PostConstruct 方法或事件侦听器方法中获取此操作名称?
【问题讨论】:
-
必须在
request,检查一下
当用户单击任何commandButton 时,将在托管bean 中调用相应的操作。
是否可以从 @PostConstruct 方法或事件侦听器方法中获取此操作名称?
【问题讨论】:
request,检查一下
按钮的 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));
}
无论哪种方式,ActionEvent 最终都存储为 UIViewRoot 的私有字段,公共 API无法使用该字段。因此,除非您掌握反射和实现特定的技巧,否则故事就到此结束了。
要确定按下的按钮,最好的办法是像 JSF 本身一样手动检查请求参数映射。
根据具体的功能要求(从问题中并不清楚),替代方法可能是在所有感兴趣的UICommand 组件上使用actionListener 或<f:actionListener>,或者在@987654333 中使用<action-listener> @ 注册一个全局的。这将在调用真正的action 之前在被调用。
【讨论】:
UIComponent sourceComponent = UIComponent.getCurrentComponent(FacesContext.getCurrentInstance());
【讨论】: