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&lt;f:actionListener&gt;,或者在@987654333 中使用&lt;action-listener&gt; @ 注册一个全局的。这将在调用真正的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 属性

如何从托管 bean 中获取消息包字符串?

如何从jsf / primefaces中的托管bean向页面添加组件[重复]

在任何 Servlet 相关类中按名称获取 JSF 托管 bean

如何获取当前视图HTML源并将其作为String传递给JSF ManagedBean