我在 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 一切正常,但我不喜欢这样,因为使用内存问题。
我的代码有什么问题...请帮助我。
格里兹,格里