Я новичок в 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 (около нескольких недель).
Может, дело в идентификаторе кнопок? Они случайные, потому что количество кнопок является динамическим. Я прочитал, что каждая кнопка должна иметь уникальный идентификатор для правильной работы. Или это что-то про атрибуты / параметры?
Спасибо за помощь,
* * Феликс тысяча сорок-девять