加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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;
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读