当用户点击任意一个commandButton
,然后在托管bean中调用相应的操作。
是否可以从以下位置获取此操作名称@PostConstruct
方法还是来自事件监听器方法?
按钮的名称=值对本身可作为 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
这是在no way通过公共 API 可用。因此,除非您掌握了反射和实现特定的技巧,否则故事到这里就结束了。
要确定按下的按钮,最好的办法是像 JSF 本身一样手动检查请求参数映射。
根据具体的功能要求(问题并不完全清楚),另一种选择可能是使用actionListener
or <f:actionListener>
on all UICommand
感兴趣的组件,或使用<action-listener>
in faces-config.xml
注册一个全局的。这将被调用就在之前真实的action
被调用。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)