JSF在托管bean中获取当前操作

时间:2012-08-08 08:26:21

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

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

2 个答案:

答案 0 :(得分:4)

按钮的名称=值对本身可用作常规方式的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本身一样。

根据具体功能要求(问题中不完全清楚),替代方案可能是对所有感兴趣的actionListener组件使用<f:actionListener>UICommand,或使用<action-listener> faces-config.xml注册全球版action调用真实{{1}}之前调用它。

答案 1 :(得分:-1)

UIComponent sourceComponent = UIComponent.getCurrentComponent(FacesContext.getCurrentInstance());