2014-01-24 5 views
3

Мне интересно, какие лучшие практики должны передавать данные (объект) между двумя компонентами 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() ... Есть ли более простое или более элегантное решение?

+0

Я забыл упомянуть, что я на Servlet 3.0/JSF 2.2 (Mojarra), если это актуально. – syntaxerror

+0

Не устанавливайте 'detailViewController' как управляемое свойство, это просто неправильно. Верните свой идентификатор вида (может быть 'view_detail' в вашем случае, обратите внимание, что я обрезаю' .xhtml'). Позже, ссылка 'detailViewController' из * view_detail.xhtml *, и вы получите его экземпляр Framework. Для передачи параметра у вас есть широкий диапазон опций, как параметр вида, с использованием области флэш-памяти, с использованием области потока ... Просто перейдите к ней, и вы найдете интересные ссылки в SO, здесь у вас есть свои собственные: [flash] (http://stackoverflow.com/a/21277621/1199132) и [посмотреть] (http://stackoverflow.com/a/20882154/1199132) –

+0

Фактически вы можете вернуть имя файла вместо ViewID в JSF 2. ;-) Что касается 'ManagedProperty', это решение, которое отлично работает с bean-компонентами RequestScoped: цель - просто получить ссылку на компонент be следующего вида, чтобы вы могли его инициализировать заранее. Но с помощью ViewScoped beans нет никакого смысла. Поэтому я предполагаю, что использование флэш-сферы - не самая худшая идея здесь. Спасибо за ваш ответ, я думал, что могу что-то забыть, и это может быть достигнуто еще проще ;-)) – syntaxerror

ответ

0

Параметры просмотра можно использовать. (См How do you pass view parameters when navigating from an action in JSF2?)

Как правило, ваш метод возвращает URL с параметрами запроса:

public String showDetail(Item i) { 
    return "view_detail.xhtml?id="+i.getId(); 
} 

И в файле view_detail.xhtml, добавьте аф: viewParam тег вычисляемый на вашей области боба:

<f:metadata> 
    <f:viewParam name="id" value="#{myBean.id}" /> 
</f:metadata> 

После этого из вашего бэкбона вы используете это поле, чтобы получить экземпляр вашего объекта в методе @postConstruct. Если вы не используете тег f: viewparam, вы также можете получить параметры запроса для получения идентификатора.

private String id; 
private Item item; 

@PostConstruct 
public void init() { 
    if (id != null) { 
    item = fetchItem(id); 
    } else { 
    FacesContext facesContext = FacesContext.getCurrentInstance(); 
    ExternalContext externalContext = facesContext.getExternalContext(); 
    Map<String, String> requestParameterMap = externalContext.getRequestParameterMap(); 
    if (requestParameters.containsKey("id")) { 
     id = requestParameters.get("id"); 
     item = fetchItem(id); 
    } else { 
     throw new WebServiceException("No item id in request parameters"); 
    } 
    } 
} 
Смежные вопросы