Как восстановить управляемый Bean из другого управляемого Bean
У меня есть две страницы (скажем, page1 и page2) и один magaedBean для каждой страницы (mb1 и mb2). в mb1 у меня есть экземпляр mb2 со всеми их атрибутами, предварительно установленными методом в mb1. Что-то вроде этого:
public Mb1(){}//Default constructor
private Mb2 mb2;//Instance of Mb2 inside Mb1
я хочу, чтобы из метода в mb1 открыть представление page2 таким образом, чтобы контроллер page2(mb2) был экземпляром, хранящимся в mb1.
Оба моих управляемых компонента ДОЛЖНЫ быть ViewScoped, я знаю, что могу сделать это, используя область видимости сеанса, но это не то, что мне нужно. Есть ли способ сделать это?
1 ответ
Почему управляемый бин отвечает за инициализацию другого? Я бы предпочел предоставить необходимую информацию Mb2
чтобы он мог инициализировать себя.
Если вы настроены на передачу объекта и избегать Mb2
Самоинициализации (и если вы используете JSF 2), я предлагаю вам взглянуть на JSF Flash Scope.
Tough Flash сам по себе не является областью видимости, он основан на функциях (AFAIK) на основе реализации Ruby шаблона POST - REDIRECT - GET. Вместо использования компонента в качестве параметра, вы можете создать свой собственный объект, который хранит данные и Mb2
оперируйте этим.
Когда вам нужно перейти к page2
Просто сохраните этот элемент во флэш-памяти и получите его позже, когда будет создан Mb2.
Для его хранения вам понадобится Flash
, который можно получить несколькими способами:
FacesContext.getCurrentInstance().getExternalContext().getFlash();
Или же
@ManagedProperty("#{flash}")
private Flash flash;
public void setFlash(Flash jsfFlash) {
flash = jsfFlash;
}
Flash сам по себе является картой (как и для запроса и сеанса), поэтому вы можете поместить туда свой объект:
ManagingObject o = new ManagingObject();
//Initialize the object and set the desired properties.
flash.put("ManagingObject", mo);
Затем вы можете получить этот объект в Mb2
получив Flash
а затем взять объект от него, например, в preRenderView
определенное событие.