4

我在 Glassfish v3 应用服务器中使用 JSF 2.0 和 EJB 3.1。而且我实际上面临着以下问题:
在带有 RequestScope 的 MenagedBean 中,我想访问一个会话对象(带有 @Stateful 的 EJB),它应该将一些会话相关信息存储为选定类别、选定页面(带有用于每个类别)等 - 我认为没什么特别的。
首次选择类别时,将创建并显示数据表。到目前为止还好。现在,如果单击项目(行)(以显示项目的详细信息)或如果应显示下一页,则重新创建会话(有状态 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 的 Scope 更改为 SessionScope 一切正常,但我不喜欢这样,因为使用内存问题。

我的代码有什么问题...请帮助我。

格里兹,格里

4

1 回答 1

6

您的 RequestScoped ManagedBean 会为每个请求重新实例化(毕竟这就是 RequestScoped 的含义)。因此,每次实例化都会注入一个的SFSB 实例。

于 2010-12-30T13:39:22.153 回答