JSF 获取托管 bean 中的当前操作
Posted
技术标签:
【中文标题】JSF 获取托管 bean 中的当前操作【英文标题】:JSF get current action in managed bean 【发布时间】:2012-08-05 07:53:33 【问题描述】:当用户单击任何commandButton
时,将在托管bean 中调用相应的操作。
是否可以从 @PostConstruct
方法或事件侦听器方法中获取此操作名称?
【问题讨论】:
必须在request
,检查一下
【参考方案1】:
按钮的 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
之前在被调用。
【讨论】:
【参考方案2】:UIComponent sourceComponent = UIComponent.getCurrentComponent(FacesContext.getCurrentInstance());
【讨论】:
欢迎来到 Stack Overflow!虽然这段代码 sn-p 可以解决问题,但including an explanation 确实有助于提高帖子的质量。请记住,您正在为将来的读者回答问题,而这些人可能不知道您的代码建议的原因。也请尽量不要用解释性的 cmets 挤满你的代码,这会降低代码和解释的可读性! 还应添加适用于该功能的版本信息。可能不适用于旧版本以上是关于JSF 获取托管 bean 中的当前操作的主要内容,如果未能解决你的问题,请参考以下文章
从托管 bean 中的 ADF SelectOneChoice 获取选定项目
CAS 身份验证后在 JSF 托管 Bean 中获取 LDAP 属性
如何从jsf / primefaces中的托管bean向页面添加组件[重复]