Java JSF自定义组件:如何获取<;的属性;f:ajax/>;
我已经为jsf编写了一个自定义组件。渲染器扩展了com.sun.faces.renderkit.html_basic.ListboxRenderer。我的组件在“javax.faces.SelectMany”系列中 jsf页面中的代码如下所示: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
<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;
}