JSF 2. Создание пользовательского компонента с помощью CommandButton и получение атрибута для ActionListener - PullRequest
3 голосов
/ 12 января 2012

Я новичок в Stack Overflow и у меня есть вопрос о JSF 2.0 и пользовательских компонентах (я тоже использую primefaces 3, но я думаю, что это не так важно). Вот ситуация: у меня есть вложенный объект данных типа AdvancedCriterion, который содержит список AdvancedCriterion или Criterion (через интерфейс criteria). Эти критерии используются для создания сложного объекта фильтра следующим образом:

  • Расширенный критерий: И
    • Критерий: ПРОДУКТ равен "ABC"
    • Критерий: ПОЛЬЗОВАТЕЛЬ начинает с "A"
    • Расширенный критерий: ИЛИ
      • КРИТЕРИЙ: param1> 5
      • КРИТЕРИЙ: param2 <= 20 </li>

Я создал два новых компонента в Java: AdvancedCriterion.java и SimpleCriterion.java, чтобы выполнить рекурсию, потому что первая попытка сделать это с композитом не удалась. и рекурсивный вызов композита в композите создает переполнение стека: - (

Пока я не знаю, я могу отобразить объект статического фильтра, и он выглядит хорошо, но пользователь должен добавить или удалить критерии. Так что я добавляю несколько кнопок (здесь в него вошли простые символы). Вот некоторый код, который я начал с первого критерия, который всегда AdvancedCriterion.

<myTag:advancedCriteriaComponent criteria="#{manageFiltersBean.filterBuilder.criteria}" />

Я создаю кнопку Button и хочу передать родительский объект в ActionListener:

CommandButton addButton = new CommandButton();
addButton.setId("btnAdd" + UUID.randomUUID());
addButton.setAjax(true);
addButton.setValue(" + ");
addButton.addActionListener(new CriteriaActionListener());
addButton.getAttributes().put("criteria", this.currentCriteria);

Ну, и вот вам CriteriaActionListener:

@Override
    public void processAction(ActionEvent event) throws AbortProcessingException {
        AdvancedCriteria criteria = (AdvancedCriteria) event.getComponent().getAttributes().get("criteria");
        criteria.addCriteria(new Criterion());
        System.out.println("number of children: " + criteria.getChildren().size());

    }

В компоненте currentCriteria хорошо известен, и я могу видеть его дочерние элементы. В CriteriaActionListener объект пуст (имеет правильный тип, но выглядит как свежий инициализированный объект этого типа). Теперь вопрос: как я могу получить объект currentCriteria в CriteriaActionListener?

Я попробовал атрибут в ActionListener и установил его из компонента, тогда весь объект равен NULL. Я хотя и пытался создать ELExpression и получить его прямо для компонента (# {manageFiltersBean.addCriterion (критерии}), но объект NULL. У меня больше нет идей и, к сожалению, я очень новичок в JSF (около нескольких недель).

Может, дело в идентификаторе кнопок? Они случайные, потому что количество кнопок является динамическим. Я прочитал, что каждая кнопка должна иметь уникальный идентификатор для правильной работы. Или это что-то про атрибуты / параметры?

Спасибо за помощь,

* * Феликс тысяча сорок-девять

1 Ответ

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

Эта проблема решена, некоторые другие возникают. Ну, как было сказано выше, проблема была больше похожа на проблему с реализацией объекта AdvancedCriteria. Не было никакой связи или подсказки с CommandButton, только получатель с неправильным именем.

Вероятно, добавленная строка implements Serialiable помогает, хотя, я не знаю точно, потому что я пробовал много вещей (сохранение и восстановление состояний, перечисление propKeys с установщиками и получателями и тому подобное), в целом это не было решение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...