jsf如何按给定的id过滤结果

时间:2014-02-25 22:03:41

标签: jsf jsf-2

您好我有以下问题,我有一个表格,其中我显示了一个公司列表,我希望过滤该列表的方式,用户只能看到他创建的公司列表。 见表

<h:dataTable value="#{empresaController.items}" var="item" border="0" cellpadding="2" cellspacing="0" rowClasses="jsfcrud_odd_row,jsfcrud_even_row" rules="all" style="border:solid 1px">
 <h:column>
    <h:graphicImage rendered="#{not empty item.logo}"
                    value="/resources/images/#{item.logo}" styleClass="covers"/>
</h:column>
 <h:column>
    <h:graphicImage rendered="#{not empty item.imagen}"
                    value="/resources/images/#{item.imagen}" styleClass="covers"/>
</h:column>
    <h:column>
        <f:facet name="header">
            <h:outputText value="#{bundle.ListEmpresaTitle_nombre}"/>
        </f:facet>
        <h:outputText value="#{item.nombre}"/>
    </h:column>
    <h:column>
        <f:facet name="header">
            <h:outputText value="#{bundle.ListEmpresaTitle_descripcion}"/>
        </f:facet>
        <h:outputText value="#{item.descripcion}"/>
    </h:column>
    <h:column>
        <f:facet name="header">
            <h:outputText value="#{bundle.ListEmpresaTitle_rubroidRubro}"/>
        </f:facet>
        <h:outputText value="#{item.rubroidRubro.nombre}"/>
    </h:column>
    <h:column>
        <f:facet name="header">
            <h:outputText value="&nbsp;"/>
        </f:facet>
        <h:commandLink action="#{empresaController.prepareView}" value="#{bundle.ListEmpresaViewLink}"/>
        <h:outputText value=" "/>
        <h:commandLink action="#{empresaController.prepareEdit}" value="#{bundle.ListEmpresaEditLink}"/>
        <h:outputText value=" "/>
        <h:commandLink action="#{empresaController.destroy}" value="#{bundle.ListEmpresaDestroyLink}"/>
    </h:column>
</h:dataTable>

这是我的控制器:

private FacesContext facesContext = FacesContext.getCurrentInstance();
private UsuarioController usuarioController = (UsuarioController) facesContext.getApplication().evaluateExpressionGet(facesContext, "#{usuarioController}", UsuarioController.class);



    private EmpresaFacade getFacade() {
    return ejbFacade;
}

public PaginationHelper getPagination() {
    if (pagination == null) {
        pagination = new PaginationHelper(10) {
            @Override
            public int getItemsCount() {
                return getFacade().count();
            }

            @Override
            public DataModel createPageDataModel() {
                return new ListDataModel(getFacade().findRange(new int[]{getPageFirstItem(), getPageFirstItem() + getPageSize()}));
            }
        };
    }
    return pagination;
}

public SelectItem[] getItemsAvailableSelectMany() {
    return JsfUtil.getSelectItems(ejbFacade.findAll(), false);
}

public SelectItem[] getItemsAvailableSelectOne() {
    return JsfUtil.getSelectItems(ejbFacade.findAll(), true);
}

public SelectItem[] getItemsAvailableByUser() {
    List<Empresa> empByUsuarios = new ArrayList<Empresa>();

    for(Empresa emp: ejbFacade.findAll()){
        if(emp.getUsuarioidUsuario().getIdUsuario() 
                == usuarioController.getSelected().getIdUsuario()){
            empByUsuarios.add(emp);
        }
    }       
    return JsfUtil.getSelectItems(empByUsuarios, false);
}

当用户想要查看该列表时,如何调用getItemsAvailableByUser?

非常感谢

2 个答案:

答案 0 :(得分:0)

一种解决方案是将更改委派给另一个方法,并将项目列表更改为一个getItemsAvailableByUser返回。像这样:

public class Controller {

   private SelectItem[] items;
   // getter, setter

   public void changeItems() {
       items = getItemsAvailableByUser(); 
   } 

}

答案 1 :(得分:0)

我解决了它

public PaginationHelper getPagination() {
    if (pagination == null) {
        pagination = new PaginationHelper(10) {
            @Override
            public int getItemsCount() {
                return getItemsAvailableByUser().length;
            }

            @Override
            public DataModel createPageDataModel() {
                return new ListDataModel(findRangeByUser(new int[]{getPageFirstItem(), getPageFirstItem() + getPageSize()}));
            }
        };
    }
    return pagination;
}
public SelectItem[] getItemsAvailableByUser() {
    List<Empresa> empByUsuarios = new ArrayList<Empresa>();

    for(Empresa emp: ejbFacade.findAll()){
        if(emp.getUsuarioidUsuario().getIdUsuario() 
                == usuarioController.getUserSession().getUser().getIdUsuario()){
            System.out.println(emp.getUsuarioidUsuario().getNombre());
            empByUsuarios.add(emp);
        }
    }       
    return JsfUtil.getSelectItems(empByUsuarios, false);
}

public List<Empresa> findRangeByUser(int[] range){
    List<Empresa> empByUsuarios = new ArrayList<Empresa>();

    for(Empresa emp: ejbFacade.findAll()){
        if(emp.getUsuarioidUsuario().getIdUsuario() 
                == usuarioController.getUserSession().getUser().getIdUsuario()){
            System.out.println(emp.getUsuarioidUsuario().getNombre());
            empByUsuarios.add(emp);
        }
    }
    if(empByUsuarios.size() > 10){
        empByUsuarios.subList(range[0], range[1] - range[0]);
    }
    return empByUsuarios;
}

我重复了控制器(支持bean)并进行了这些更改,不足之处在于我有2个控制器几乎完全相同,欢迎任何关于如何避免这种情况的想法