dataTable不显示列表

时间:2015-06-04 11:02:37

标签: postgresql jsf datatable

我正在尝试在Postgres中的数据库中呈现.xhtml页面中的产品列表:我正在使用JSF标记h:dataTable。不幸的是,当我显示页面时,我收到消息“目录是空的”,所以它似乎无法从数据库中获取值。 这是我正在谈论的页面:

<f:metadata>
    <f:viewParam id="prodotto_id" name="id" value="#{prodotto.id}"
        required="true"
        requiredMessage="Invalid page access. Please use a link from within the system."/>
</f:metadata>
<h:message for="prodotto_id" />

<h:head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Catalogo</title>
</h:head>
<h:body>
    <h2>Catalogo Prodotti</h2>
    <h:form>
        <h:outputText value="The catalogue is empty."
            rendered="#{empty prodottoController.prodotti}" />
        <h:dataTable value="#{prodottoController.prodotti}" var="prodotto"
            rendered="#{not empty prodottoController.prodotti}">
            <h:column>
                <f:facet name="header">Nome</f:facet>
                <h:commandLink action="#{prodottoController.findProdotto}"
                    value="#{prodotto.nome}" style="color: orange">
                    <f:param name="id" value="#{prodotto.id}" ></f:param>
                </h:commandLink>
            </h:column>
            <h:column>
                <f:facet name="header">Prezzo per unità</f:facet>
                <h:outputText value="#{prodotto.prezzo}" />
            </h:column>
            <h:column>
                <f:facet name="header">Codice</f:facet>
                <h:outputText value="#{prodotto.codice}" />
            </h:column>
            <h:column>
                <f:facet name="header">Quantità in magazzino</f:facet>
                <h:outputText value="#{prodotto.quantita}" />
            </h:column>
            <h:column>
                <f:facet name="header"></f:facet>
                <h:commandButton action="/newRigaOrdine.xhtml?faces-redirect=true"
                    value="Aggiungi all'ordine"
                    rendered="#{not empty loginCliente.clienteLoggato.email 
                                and empty loginAdmin.admin.email}">
                </h:commandButton>
            </h:column>
            <h:column>
                <f:facet name="header"></f:facet>
                <h:commandButton action="#{prodottoController.deleteProdotto}"
                    value="Elimina Prodotto"
                    rendered="#{not empty loginAdmin.admin.email and empty loginCliente.clienteLoggato.email}">
                    <f:param name="id" value="#{prodotto.id}" />
                </h:commandButton>
            </h:column>
        </h:dataTable>
        <h:outputLink value="formCreaProdotto.xhtml?faces-    redirect=true"
            rendered="#{not empty loginAdmin.admin.email and empty    loginCliente.clienteLoggato.email}">Aggiungi un prodotto al catalogo</h:outputLink>
    </h:form>
</h:body>
</html>

这是prodottoController托管bean:

 @ManagedBean (name="prodottoController")
@ViewScoped
public class ProdottoController implements Serializable {


    private static final long serialVersionUID = 1L;


    private Long id;

    private String nome;
    private Float prezzo;
    private String descrizione;
    private String codice;
    private int quantita;

    private String errore;

    private Prodotto prodotto;
    private List<Prodotto> prodotti;

    @EJB (beanName="pFacade")
    private ProdottoFacade pFacade;



    public String creaProdotto() {
        try {
            this.prodotto = pFacade.creaProdotto(nome, codice, descrizione, prezzo, quantita);
            return "newProdotto"; 
            }
        catch (Exception e) {
            errore="Prodotto già esistente sul database. Per favore inserisci un prodotto con codice differente";
            return errore; 
        }
    }

    public String listProdotti() {
        this.prodotti = pFacade.getCatalogoProdotti();
        return "showProdotti"; 
    }

    public String findProdotto() {
        this.prodotto = pFacade.getProdottoByID(id);
        return "showProdotto";
    }

    public String deleteProdotto() {   
        pFacade.deleteProdottoById(id);
        return "showProdotti";
    } //getters and setters

这是facade方法getCatalogoProdotti():

public List<Prodotto> getCatalogoProdotti() {

    try {
        TypedQuery<Prodotto> q = em.createQuery("SELECT p FROM Prodotto p", Prodotto.class);
        return q.getResultList();

    } 
    catch (Exception e) {
        String q = "la lista è vuota";
        System.out.println(q);
        return null;
        }
    }

那么,我做错了什么?经过几个小时的学习和搜索,我真的不知道该怎么做......

1 个答案:

答案 0 :(得分:0)

我找到了解决方案的家伙!希望这对遇到同样问题的人有所帮助。

我添加了这个

    @PostConstruct
public void init() {
    prodotti = pFacade.getCatalogoProdotti();
} 

在prodottoController bean中,现在它显示了数据库中的所有产品!! 每次我们使用ViewScoped bean时都必须使用PostConstruct,正如我在互联网上阅读的那样。 呃,实体类“Prodotto”也必须实现Serializable。