2012-08-08 51 views
2

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

+0

必须在'请求',检查它 – 2012-08-08 08:28:55

回答

4

按钮的名称=值对本身可用作HTTP请求参数的常用方式。可想而知,命令按钮的生成的HTML表示看起来像这样

<input type="submit" name="formId:buttonId" value="Submit" ... /> 

然后,它的存在作为一个请求参数与名称formId:buttonId具有非空值。 JSF在Apply Request Values阶段使用这些信息来确定按钮是否被按下。这种情况与按钮组件相关联的渲染器的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>,或使用<action-listener>faces-config.xml注册一个全球性的。这将被调用之前真实action被调用。

-1
UIComponent sourceComponent = UIComponent.getCurrentComponent(FacesContext.getCurrentInstance()); 
+0

欢迎来到堆栈溢出!尽管这段代码可以解决这个问题,但[包括一个解释](// meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers)确实有助于提高您的帖子的质量。请记住,您将来会为读者回答问题,而这些人可能不知道您的代码建议的原因。也请尽量不要用解释性注释来挤占代码,这会降低代码和解释的可读性! – 2018-02-02 09:52:53

+0

此版本的信息也应该添加。可能不适用于旧版本 – Kukeltje 2018-02-02 16:04:57