java – JSF自定义组件:如何获取属性
发布时间:2020-12-15 02:27:45 所属栏目:Java 来源:网络整理
导读:我为jsf编写了一个自定义组件.渲染器扩展了com.sun.faces.renderkit.html_basic.ListboxRenderer.我的组件位于“ javax.faces.SelectMany” – 家庭. jsf-page中的代码如下所示: tb:myMenu id="testId" value="#{valueForm.someValue}" f:selectItem / f:se
我为jsf编写了一个自定义组件.渲染器扩展了com.sun.faces.renderkit.html_basic.ListboxRenderer.我的组件位于“
javax.faces.SelectMany” – 家庭.
jsf-page中的代码如下所示: <tb:myMenu id="testId" value="#{valueForm.someValue}"> <f:selectItem /> <f:selectItems value="#{dao.getSomething()}" /> <f:ajax render=":myTestForm:myId"/> </tb:myMenu> 如何在渲染器中获取render-attribute的值?我只需要值,不应该写入我的组件(像RenderKitUtils-class那样) 我目前的解决方案如下所示.它有效,但我对此并不满意. 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()); } } } } 解决方法
你究竟对此不满意吗?太冗长了?嗯,确实没有JSF API提供的实用方法,也没有Mojarra impl提供的实用方法.它就在这里停下来.你自己写吧.
至少,在你的代码片段中,第二个如果检查null是多余的,因为它never返回null.此外,behavior.keySet().contains(key)在同一行上也可以简化为behavior.containsKey(key).鉴于它永远不会返回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"); // ... 如果是嵌套的检查是令人不安的,你也可以进行逆向检查(这也是Mojarra一般写的方式;如果嵌套确实是一个不好的做法,那么: 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; } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
推荐文章
站长推荐
热点阅读