Я не знаю, является ли это «принятым решением», но я реализовал идею, которая работает на меня. (Обратная связь с благодарностью!)
Так что я создал @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
событие для извлечения и установки объекта, где работать с.
На этом этапе вы можете удалить пару ключей с карты и недействить возможность получения этого объекта, или вы можете сохранить пару ключей на более длительный срок, просто обновив объект, если есть какие-либо изменения.
ОБНОВЛЕНИЕ: Концептуально это было действительно успешным (для меня как минимум). Я создал несколько полезных методов и классов, окружающих концепцию, чтобы сделать ее более универсальной. Если кто-то хочет получить более конкретные инструкции или я могу даже создать небольшую библиотеку, если кто-то захочет.
Я использовал 'ConversationScoped' совсем немного, но с этим я никогда не справлялся. Он имеет свои применения, но изначально я искал способ передать один объект «ViewScoped» другому. Снова CODI и DeltaSpike (формально Seams Faces) предлагают реализацию JSF для CDI. Я действительно искал универсальный способ передачи объекта из области видимости в область видимости по мере необходимости. – tarka
Внутри трюка запроса есть возможность перекладывать вещи с одной страницы на другую, но вы будете страдать от одного URL-адреса в адресной строке. –
Да. его немного уродливым, но я также написал немного JS, чтобы заменить основное содержимое страницы на ajax и использовать API истории html5, чтобы сделать что-то подобное. Проблема в том, что это не отличный пользовательский интерфейс. – tarka