2013-03-22 3 views
3

Хорошо, я знаю, что вопросы о сфере спектра возникают постоянно, но меня интересует несколько иной подход к решению. @ViewScope - это фантастический мост между @RequestScope и @SessionScope.Сохранение ViewScoped bean-элементов по нескольким точкам

Однако по-прежнему существует общий прецедент (по крайней мере, для меня), где я действительно не хочу использовать @SessionScope, но мне нужны данные по нескольким представлениям. Действительно простой случай - когда у меня есть несколько наборов данных, соединенных друг с другом в зависимости от предыдущих выборов.

Возможно использовать <f:paramView> и передать одну или несколько частей данных в качестве параметров в адрес, а затем снова извлечь все из базы данных. Меня больше интересует поиск способа создания «моментального снимка» состояния/переменных beans, создания нового @ViewScope, а затем «восстановления» состояния моментального снимка для нового компонента.

Существует ли такая вещь? Идеи? Мнения?

ответ

2

Я не знаю, является ли это «принятым решением», но я реализовал идею, которая работает на меня. (Обратная связь с благодарностью!)

Так что я создал @SessionScoped класс с парой статических карт:

private static Map<String, Object> objectVariableMap; 

// Getters, setters and methods etc. are omitted for simplicity 

Идея заключается в том, что я указал карту, которая принимает строку как ключ и Объект как ценность. Я специально не задал тип объекта, чтобы я мог хранить любой тип объекта. Предостережение заключается в том, что вы должны быть уверены в типе объекта при его извлечении, чтобы вернуть его обратно в исходный тип.

Настало время установить данные с первого @ViewScoped. Я генерирую случайный UUID (или что вам нужно) в качестве ключа , а затем задает значение значение объекту, с которым я работаю (т.е. this, или действительно любые другие объекты, которые вы, возможно, захотите передать следующий вид). Сохраните ключ, значение на карте и установите параметр URL для ключа.

Я никогда не увлекаюсь передачей данных как идентификаторов пользователя и т. Д. В параметрах URL (даже при его зашифрованном виде). Эта идея имеет дополнительное преимущество - предлагать одноразовые URL-адреса, которые имеют определенный срок службы.

На приемном конце (то есть. Новый @ViewScoped боб, или любая другая возможность для этого вопроса) вы читаете в URL PARAM (ключ карты) с помощью <f:paramView>, а затем использовать preRenderView событие для извлечения и установки объекта, где работать с.

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

ОБНОВЛЕНИЕ: Концептуально это было действительно успешным (для меня как минимум). Я создал несколько полезных методов и классов, окружающих концепцию, чтобы сделать ее более универсальной. Если кто-то хочет получить более конкретные инструкции или я могу даже создать небольшую библиотеку, если кто-то захочет.

1

Для этого вы можете использовать CDI «Scorpion Scope». Это уже, чем область сеанса, но более широкая, чем область обзора.

Если страницы, между которыми вы передаете параметры, являются единицей, вы также можете сделать их потоком в JSF 2.2 и использовать область потока.

Проекты, такие как CODI, предлагают различные другие области, которые могут использоваться между страницами.

+0

Я использовал 'ConversationScoped' совсем немного, но с этим я никогда не справлялся. Он имеет свои применения, но изначально я искал способ передать один объект «ViewScoped» другому. Снова CODI и DeltaSpike (формально Seams Faces) предлагают реализацию JSF для CDI. Я действительно искал универсальный способ передачи объекта из области видимости в область видимости по мере необходимости. – tarka

+0

Внутри трюка запроса есть возможность перекладывать вещи с одной страницы на другую, но вы будете страдать от одного URL-адреса в адресной строке. –

+0

Да. его немного уродливым, но я также написал немного JS, чтобы заменить основное содержимое страницы на ajax и использовать API истории html5, чтобы сделать что-то подобное. Проблема в том, что это не отличный пользовательский интерфейс. – tarka

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