Как передать свойство bean из одного представления в другое

Я использую JSF 2.1 и Primefaces:

У меня есть обработанный вид с управляемым компонентом с управляемым свойством и метод, который устанавливает что-то на другой вид управляемого управляемого компонента и пересылает на другую страницу, ссылающуюся на управляемый компонент:

@ManagedBean
@ViewScoped
public class HelloMB {

 @ManagedProperty("otherMB")
 private OtherMB other;

 public String changeOtherMB() {
 otherMB.setAnyObject(new Object());
 return "otherPage.xhtml";
 }

}

@ManagedBean
@ViewScoped
public class OtherMB {

 private Object o; 

 public void setAnyObject(Object o) {
 this.o = o;
 }

}

Таким образом, когда otherPage отображается o, значение null.

У вас есть идея, как я могу это решить? Как сохранить объект в управляемом компоненте @ViewScoped и сохранить его на другой странице без использования @SessionScoped?

1 ответ

Область просмотра уничтожается и воссоздается после перехода к другому представлению JSF. Вы знаете, область представления живет до тех пор, пока вы взаимодействуете с одним и тем же представлением JSF. В этом конкретном случае вы фактически #{otherMB} два экземпляра управляемого компонента #{otherMB} во время одного запроса. Один экземпляр, который используется представлением источника, и другой экземпляр, который используется представлением адресата.

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

@ManagedBean
@ViewScoped
public class HelloMB implements Serializable {

 public String changeOtherMB() {
 ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext();
 ec.getRequestMap().put("anyObject", anyObject);
 return "otherPage.xhtml";
 }

}
@ManagedBean
@ViewScoped
public class OtherMB {

 private Object anyObject; 

 @PostConstruct
 public void init() {
 ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext();
 this.anyObject = ec.getRequestMap().get("anyObject");
 }

}

Я, однако, задаюсь вопросом, знаете ли вы о важности идемпотентных и не-идемпотентных запросов. Возможно, вам действительно нужна ссылка "простой ваниль", без необходимости вызывать метод действия с боковым видом. См. Последнюю ссылку "См. Также" ниже для обширного примера.

Смотрите также:

licensed under cc by-sa 3.0 with attribution.