2012-05-14 1 views
0

Мне нужна помощь в реализации операций CRUD. Мое приложение содержит таблицу объектов. Каждый объект описывается списком свойств (значений). Одно свойство изменяется с помощью специального редактора JSF, в зависимости от типа свойства.Добавление/редактирование операций с объектами с динамическими свойствами

Когда пользователь добавляет новую учетную запись, список редакторов определяется по типу объекта и отображается в форме с использованием тегов custom:include. Этот настраиваемый тег используется для динамического включения редакторов <custom:include src="#{editor.component}">. Свойство компонента указывает на расположение редактора JSF.

Каждый редактор имеет управляемый компонент, который реализует интерфейс ValueHolder и наследует класс AbstractEditor. AbstractEditor содержит метод updateEditor.

public interface ValueHolder { 
    String EDITOR_VALUES = "editorValues"; 
    public Object getValue(); 
} 

Я использую карту сеанса с именем редактора в качестве значения ключа и редактора как значения. Когда пользователь изменяет свойство, вызывается метод updateEditor, и карта обновляется с новым значением редактора.

Проблема заключается в объеме компонентов, стоящих за редакторами. Если я использую @SessionScoped beans, код, который инициализирует редактор, не вызывается снова, и я не могу обрабатывать действия add/edit. @SessionScoped работает только для добавления. Я пробовал с @RequestScoped, но бобы вызываются очень часто, и я не знаю, действительно ли это хорошо.

Я использую JSF2, PrimeFaces 3.0.M4 и Spring Web Flow для навигации.

+0

'@ RequestScoped' - это то, что вам нужно использовать для чего-то подобного, но если вам не нравится, что бобы называются много раз, вы можете использовать' @ SessionScope' и «перезагрузить» его (вручную !) в конце метода 'updateEditor()' для «имитации» инициализации! – StepTNT

+0

Можете ли вы привести мне пример? – Seitaridis

ответ

0

Я сохранил фасоль @SessionScoped. Боб имеет свое имя, хранящееся в сеансе, и оно совпадает с именем файла редактора. Таким образом, существует связь между редакторами и фасолью.

A initialize метод был добавлен в интерфейс ValueHolder. Этот метод вызывается, когда объект добавляется/изменяется.

1

Вы посмотрели на использование @ViewScoped бобы? Объекты, охваченные представлением, остаются в области действия, пока вы продолжаете возвращаться на ту же страницу. Это похоже на то, что вы делаете.

В качестве альтернативы, если вы используете CDI, вы можете использовать @ConversationScoped, чтобы сохранить компонент в области, пока вы делаете обновления. Это имеет определенное начало и конец. Это позволит вам определить, когда компонент выходит из сферы действия.

+0

В представлении содержится таблица с объектами. Когда я добавляю/редактирую объект, над этой таблицей появляется модальное окно. Я не могу использовать @ViewScoped beans, потому что это представление не изменяется. Он изменяется только при переходе к другому представлению. – Seitaridis

+0

Как я могу использовать @ConverstionScoped в моем контексте? – Seitaridis

+0

Компонент '@ ConversationScoped' начнет разговор, когда пользователь отредактирует объект, и разговор завершится, когда пользователь сохранит объект в качестве примера. –

Смежные вопросы