Я использую JSF 2.0 и EJB 3.1 на сервере приложений Glassfish v3.И на самом деле я сталкиваюсь с следующей проблемой:
В MenagedBean с RequestScope я хочу получить доступ к объекту сеанса (EJB с @Stateful), который должен хранить некоторую информацию, относящуюся к сеансу, как выбранную категорию, выбранную страницу (спагинация данных для каждой категории) и т. д. - я думаю, ничего особенного.
При первом выборе категории создается и отображается таблица данных.Пока все в порядке.Теперь, если по элементу (строке) щелкают (чтобы показать детали элемента) или если должна отображаться следующая страница, сеанс (EJB с сохранением состояния) воссоздается, и снова значения по умолчанию используются для отображения и визуализации страницы.
Код выглядит следующим образом:
@ManagedBean
@RequestScoped
public class TableViewBean {
@EJB
SessionBean session;
public DataModel getTable() {
return session.getDataModel();
}
public SessionBean getSession(){
return session;
}
public void next() {
session.getPaginator().nextPage();
session.resetList();
}
public void previous() {
session.getPaginator().previousPage();
session.resetList();
}
// some other code
}
и EJB сеанса:
@Stateful
public class SessionBean {
private String selectedType = "Entity";
private DataModel dataModel;
private int rowsPerPage = 5;
private Paginator paginator;
public void setSelectedType(String type){
if(!type.equalsIgnoreCase(selectedType)){
selectedType = type;
updateService();
}
resetList();
}
public void resetList() {
dataModel = null;
}
public void resetPagination() {
paginator = null;
}
public int getRowsPerPage() {
return rowsPerPage;
}
public void setRowsPerPage(int rowsPerPage) {
this.rowsPerPage = rowsPerPage;
resetList();
resetPagination();
}
public Paginator getPaginator() {
if (paginator == null) {
paginator = new Paginator(rowsPerPage) {
@Override
public int getItemsCount() {
return selectedService.getCount();
}
@Override
public DataModel createPageDataModel() {
DataModel model = null;
if(selectedService != null){
model = new ListDataModel(....);
}
return model;
}
};
}
return paginator;
}
public DataModel getDataModel() {
if(dataModel == null){
dataModel = getPaginator().createPageDataModel();
}
return dataModel;
}
}
Если изменить область действия ManagedBean наSessionScope все работает нормально, но мне это не нравится из-за проблем с памятью.
Что не так с моим кодом ... пожалуйста, помогите мне.
Greetz, Gerry