Как я могу сделать Поставщик меток, используя JSF-1.2? - PullRequest
1 голос
/ 09 января 2012

Я хочу автоматически установить атрибуты меток для компонентов UIInput на моих страницах для уже введенных компонентов HtmlOutputLabel, как это делал разработчик PrimeFaces: http://cagataycivici.wordpress.com/2011/02/11/label-provider-for-jsf-input-components/ Только он сделал это с помощью системных событий, функция доступна только в JSF-2.0, а мое приложение в JSF 1.2.

Возможно ли сделать это с помощью JSF-1.2, возможно, с Phase Listener? Какие бы были недостатки?

Заранее спасибо!

ОБНОВЛЕНИЕ: Вот как выглядит моя попытка прослушивания фазы до сих пор:

@Override
public void beforePhase(PhaseEvent event) {
    System.out.println("REGISTERING Label Provider");
    FacesContext context = event.getFacesContext();
    List<UIComponent> components = context.getViewRoot().getChildren();
    for (UIComponent uiComponent : components) {
        if (uiComponent instanceof HtmlOutputLabel) {
            HtmlOutputLabel outputLabel = (HtmlOutputLabel) uiComponent;
            System.out.println("CONFIGURING LABEL: " + outputLabel.getId());
            UIComponent target = outputLabel.findComponent(outputLabel
                    .getFor());
            if (target != null) {
                target.getAttributes().put("label", outputLabel.getValue());
            }
        }
    }
}

@Override
public PhaseId getPhaseId() {
    // Only listen during the render response phase.
    return PhaseId.RENDER_RESPONSE;
}

Когда я получаю доступ к представлению, оно никогда не печатает раздел «НАСТРОЙКА ЭТИКЕТКИ». Каким будет правильный тест, чтобы проверить, является ли uiComponent HtmlOutputLabel? Или что я делаю не так?

Ответы [ 2 ]

1 голос
/ 10 января 2012

UIViewRoot#getChildren() возвращает только прямых дочерних элементов корня представления, но не всех дочерних элементов, как вы ожидаете.Вам также нужно рекурсивно перебирать дочерних элементов каждого дочернего элемента.

Примерно так:

@Override
public void beforePhase(PhaseEvent event) {
    applyLabels(event.getFacesContext().getViewRoot().getChildren());
}

private static void applyLabels(List<UIComponent> components) {
    for (UIComponent component : components) {
        if (component instanceof HtmlOutputLabel) {
            // ...
        } else {
            applyLabels(component.getChildren()); // Reapply on its children.
        }
    }
}

Начиная с JSF 2.0 вышеприведенное, кстати, согласовано с UIComponent#visitTree() метод, который следует шаблону посетителя, так что вам просто нужно сделать один вызов.

0 голосов
/ 09 января 2012
<h:outputText value="#{yourVO.tax}" /> 

Создайте объект объекта передачи данных (DTO) в вашем классе действий и объявите налог на строковую переменную в DTO, чтобы вы могли использовать его для установки меток в вашем классе действий.

...