如何在 <p:ajax listener> 方法中获取 <f:attribute> 值?

How to get <f:attribute> value inside <p:ajax listener> method?

我有一个带有 <f:attribute><p:ajax listener> 的复选框组件。

<h:selectManyCheckbox ...>
  <p:ajax listener="#{locationHandler.setChangedSOI}" />
  <f:attribute name="Dummy" value="test" />
  ...
</h:selectManyCheckbox>

我尝试在侦听器方法中获取 test<f:attribute> 值,如下所示:

public void setChangedSOI() throws Exception {
    FacesContext context = FacesContext.getCurrentInstance();
    Map<String, String> map = context.getExternalContext().getRequestParameterMap();
    String r1 = map.get("Dummy");
    System.out.println(r1);
}

但是,它打印了 null。我怎样才能得到它?

组件属性未作为 HTTP 请求参数传递。组件属性设置为.. 呃,组件属性。 IE。它们存储在 UIComponent#getAttributes() 中。你可以通过那张地图抓住他们。

现在正确的问题显然是如何在 ajax 侦听器方法中获得所需的 UIComponent。有两种方法:

  1. 为此指定 AjaxBehaviorEvent argument. It offers a getComponent() 方法。

    public void setChangedSOI(AjaxBehaviorEvent event) {
        UIComponent component = event.getComponent();
        String dummy = component.getAttributes().get("Dummy");
        // ...
    }
    
  2. 使用 UIComponent#getCurrentComponent() 辅助方法。

    public void setChangedSOI() {
        UIComponent component = UIComponent.getCurrentComponent(FacesContext.getCurrentInstance());
        String dummy = component.getAttributes().get("Dummy");
        // ...
    }