我试图呈现产品列表在.xhtml页面,从我的数据库在Postgres:我使用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方法getcataloggoprodotti ():
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;
}
}
那么,我做错了什么??经过几个小时的研究和搜索,我真的不知道该怎么办……
我已经找到了解决方案!希望这能帮助到有我同样问题的人。
我添加了这个
@PostConstruct
public void init() {
prodotti = pFacade.getCatalogoProdotti();
}
中的prodottoController bean,现在它显示了数据库上的所有产品!!PostConstruct必须在每次我们使用ViewScoped bean时使用,正如我在互联网上看到的那样。而且实体类"Prodotto"必须实现Serializable