Java JSF自定义组件:如何获取<;的属性;f:ajax/>;

Java JSF自定义组件:如何获取<;的属性;f:ajax/>;,java,jsf,jsf-2,components,custom-component,Java,Jsf,Jsf 2,Components,Custom Component,我已经为jsf编写了一个自定义组件。渲染器扩展了com.sun.faces.renderkit.html_basic.ListboxRenderer。我的组件在“javax.faces.SelectMany”系列中 jsf页面中的代码如下所示: <tb:myMenu id="testId" value="#{valueForm.someValue}"> <f:selectItem /> <f:selectItems value="#{dao.g

我已经为jsf编写了一个自定义组件。渲染器扩展了com.sun.faces.renderkit.html_basic.ListboxRenderer。我的组件在“javax.faces.SelectMany”系列中

jsf页面中的代码如下所示:

<tb:myMenu id="testId" value="#{valueForm.someValue}">  
    <f:selectItem /> 
    <f:selectItems value="#{dao.getSomething()}"  />
    <f:ajax render=":myTestForm:myId"/>
</tb:myMenu>

如何在渲染器中获取渲染属性的值?我只需要这个值,不应该向我的组件写入任何内容(就像RenderKittils类那样)

我当前的解决方案如下所示。这是可行的,但我对此并不满意

if (component instanceof ClientBehaviorHolder) {
        Map<String, List<ClientBehavior>> behaviors = ((ClientBehaviorHolder)component).getClientBehaviors();
        if (behaviors != null && behaviors.keySet().contains("valueChange")) {
            for (ClientBehavior cb: behaviors.get("valueChange")) {
                if (cb instanceof AjaxBehavior) {
                    System.out.println("AJAX: " + ((AjaxBehavior) cb).getRender());
                }
            }
        }
    }
if(ClientBehaviorHolder的组件实例){
映射行为=((ClientBehaviorHolder)组件);
如果(behaviors!=null&&behaviors.keySet()包含(“valueChange”)){
for(ClientBehavior cb:behaviors.get(“valueChange”)){
if(AjaxBehavior的cb实例){
System.out.println(“AJAX:”+((AjaxBehavior)cb.getRender());
}
}
}
}

你到底有多不高兴?太冗长了?实际上,JSFAPI和MojarraImpl都没有提供任何实用方法来隐藏这一点。就停在这里。你得自己写

至少,在您的代码段中,第二个
if
检查
null
是多余的,因为它返回
null
。此外,同一行上的
behaviors.keySet().contains(key)
也可以简化为
behaviors.containsKey(key)
。考虑到它从不返回
null
,您也可以立即获取行为列表,并对其进行null检查

最后,用一些实用的方法把它隐藏起来

public static Set<String> getClientBehaviorRenderIds(UIComponent component, String behaviorName) {
    Set<String> clientBehaviorRenderIds = new HashSet<String>();

    if (component instanceof ClientBehaviorHolder) {
        List<ClientBehavior> clientBehaviors = ((ClientBehaviorHolder) component).getClientBehaviors().get(behaviorName);

        if (clientBehaviors != null) {
            for (ClientBehavior clientBehavior : clientBehaviors) {
                if (clientBehavior instanceof AjaxBehavior) {
                    clientBehaviorRenderIds.addAll(((AjaxBehavior) clientBehavior).getRender());
                }
            }
        }
    }

    return clientBehaviorRenderIds;
}

好的,我想可能有一个实用的方法,但我没有看到。谢谢你的反向检查;)
Set<String> renderIds = getClientBehaviorRenderIds(component, "valueChange");
// ...
public static Set<String> getClientBehaviorRenderIds(UIComponent component, String behaviorName) {
    Set<String> clientBehaviorRenderIds = new HashSet<String>();

    if (!(component instanceof ClientBehaviorHolder)) {
        return clientBehaviorRenderIds;
    }

    List<ClientBehavior> clientBehaviors = ((ClientBehaviorHolder) component).getClientBehaviors().get(behaviorName);

    if (clientBehaviors == null) {
        return clientBehaviorRenderIds;
    }

    for (ClientBehavior clientBehavior : clientBehaviors) {
        if (clientBehavior instanceof AjaxBehavior) {
            clientBehaviorRenderIds.addAll(((AjaxBehavior) clientBehavior).getRender());
        }
    }

    return clientBehaviorRenderIds;
}