【问题标题】:JSF get current action in managed beanJSF 获取托管 bean 中的当前操作
【发布时间】:2012-08-05 07:53:33
【问题描述】:

当用户单击任何commandButton 时,将在托管bean 中调用相应的操作。 是否可以从 @PostConstruct 方法或事件侦听器方法中获取此操作名称?

【问题讨论】:

  • 必须在request,检查一下

标签: java jsf jsf-2 java-ee-6


【解决方案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 挤满你的代码,这会降低代码和解释的可读性!
    • 还应添加适用于该功能的版本信息。可能不适用于旧版本
    猜你喜欢
    • 2015-07-04
    • 2011-02-03
    • 2012-02-29
    • 2014-09-29
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多