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

Dfr*_*Dfr 3 java jsf java-ee-6 jsf-2

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

Bal*_*usC 5

按钮的“名称=值”对本身通常可以用作HTTP请求参数。想象一下,命令按钮的生成的HTML表示如下所示

<input type="submit" name="formId:buttonId" value="Submit" ... />
Run Code Online (Sandbox Code Playgroud)

然后,它作为请求参数出现,其名称formId:buttonId带有非空值。JSF在“应用请求值”阶段完全使用此信息来确定是否按下了按钮。这发生在decode()与按钮组件关联的渲染器方法期间,大致如下:

if (externalContext.getRequestParameterMap().containsKey(component.getClientId(context))) {
    component.queueEvent(new ActionEvent(component));
}
Run Code Online (Sandbox Code Playgroud)

或者,当涉及到ajax请求时,该按钮的名称可以用作javax.faces.Sourcerequest参数的值。

if (component.getClientId(context).equals(externalContext.getRequestParameterMap().get("javax.faces.Source"))) {
    component.queueEvent(new ActionEvent(component));
}
Run Code Online (Sandbox Code Playgroud)

无论哪种方式,ActionEvent最终都会将其存储为私有字段,UIViewRoot而公共API 则无法使用该私有字段。因此,除非您掌握了反射和实现方面的特定技巧,否则到此为止。

要确定按下的按钮,最好的选择是像JSF本身一样手动检查请求参数映射。

根据具体的功能需求,这不正是从这个问题清楚了,另一种可能是使用actionListener<f:actionListener>对所有UICommand感兴趣的组件,或者使用<action-listener>faces-config.xml注册一个全球性的。将在调用实数之前立即action调用它。