Мне интересно, какие лучшие практики должны передавать данные (объект) между двумя компонентами ViewScoped.Лучшее решение для передачи объектов между двумя ViewScoped ManagedBeans
Они должны быть вид области видимости из-за проблемы, которую блестяще объяснил here (выражаясь коротко: В обоих представлениях я использую h:commandLink
из в h:dataTable
, который требует модель данных по-прежнему присутствовать при подаче).
Теперь проблема заключается в том, что щелчок по ссылке также переходит к новому представлению, поэтому, используя следующий код, мой объект передается, но после него уничтожается экземпляр DetailViewController
, а новый создается при изменении представления (как вы ожидаете).
Вид:
<h:dataTable value="#{searchController.dataModel}" var="item">
...
<h:column>
<f:facet name="header">Action</f:facet>
<h:commandLink id="open" value="open" action="#{searchController.showDetail(item)}" />
</h:column>
</h:dataTable>
Bean:
@ManagedBean
@ViewScoped
public class SearchController {
@ManagedProperty(value="#{detailViewController}")
private DetailViewController detailViewController;
// getters, setters, etc. ...
public String showDetail(Item i) {
detailViewController.setItem(i);
return "view_detail.xhtml";
}
}
Как бы вы решить эту проблему? Я думал о помещении объекта внутри Flash: FacesContext.getExternalContext.getFlash()
... Есть ли более простое или более элегантное решение?
Я забыл упомянуть, что я на Servlet 3.0/JSF 2.2 (Mojarra), если это актуально. – syntaxerror
Не устанавливайте 'detailViewController' как управляемое свойство, это просто неправильно. Верните свой идентификатор вида (может быть 'view_detail' в вашем случае, обратите внимание, что я обрезаю' .xhtml'). Позже, ссылка 'detailViewController' из * view_detail.xhtml *, и вы получите его экземпляр Framework. Для передачи параметра у вас есть широкий диапазон опций, как параметр вида, с использованием области флэш-памяти, с использованием области потока ... Просто перейдите к ней, и вы найдете интересные ссылки в SO, здесь у вас есть свои собственные: [flash] (http://stackoverflow.com/a/21277621/1199132) и [посмотреть] (http://stackoverflow.com/a/20882154/1199132) –
Фактически вы можете вернуть имя файла вместо ViewID в JSF 2. ;-) Что касается 'ManagedProperty', это решение, которое отлично работает с bean-компонентами RequestScoped: цель - просто получить ссылку на компонент be следующего вида, чтобы вы могли его инициализировать заранее. Но с помощью ViewScoped beans нет никакого смысла. Поэтому я предполагаю, что использование флэш-сферы - не самая худшая идея здесь. Спасибо за ваш ответ, я думал, что могу что-то забыть, и это может быть достигнуто еще проще ;-)) – syntaxerror