JSF Custom Component: Как получить атрибут - PullRequest
4 голосов
/ 01 сентября 2011

Я написал пользовательский компонент для JSF.Средство визуализации расширяет com.sun.faces.renderkit.html_basic.ListboxRenderer.Мой компонент находится в "javax.faces.SelectMany" -Family.

Код на jsf-странице выглядит так:

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

Как я могу получить значение атрибута renderв моем рендерере?Мне нужно только значение, в мой компонент ничего не должно записываться (как это делает 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());
                }
            }
        }
    }

1 Ответ

1 голос
/ 05 сентября 2011

Как именно тебе это не нравится?Слишком многословно?Что ж, на самом деле нет ни вспомогательного метода, предоставляемого ни JSF API, ни Mojarra impl, который бы это скрывал.Это просто останавливается здесь.Вы должны написать это сами.

По крайней мере, в вашем фрагменте вторая if проверка на null является излишней, поскольку она никогда не возвращает null.Кроме того, behaviors.keySet().contains(key) на той же строке также может быть упрощено до behaviors.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");
// ...

Если мешают вложенные проверки, вы также можете выполнять обратные проверки (так же написана Мохаррав общем, глубокое if вложение - это действительно плохая практика):

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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...