CRUD JSF 2.0 + Hibernate: Parte 2– Utilizando a biblioteca Primefaces no Gerenciador de Livros

13 09 2010

Este blog possui um novo domínio agora jamacedo.com, clique aqui para acessá-lo!

Depois de algum tempo sem postar nada devido a adaptação ao Rio e a empresa que comecei a trabalhar, Concrete Solutions, volto com muitas ideias novas e tecnologias diferentes para compartilhar aqui no blog. Continuarei escrevendo sobre desenvolvimento java para web mas tratarei também de assuntos como arquitetura orientada a serviço (SOA), projeto e análise de serviços, padrões de projeto empresariais, bibliotecas java script e assuntos referentes ao mercado de trabalho de tecnologia.

Vamos descrever neste artigo algumas mudanças no nosso CRUD JSF 2 para que ele passe a interagir com o usuário utilizando ajax, também vamos melhorar a interface do CRUD com a biblioteca de componentes JSF PrimeFaces. Esta biblioteca de componentes foi uma das primeiras a dar suporte a nova versão do JSF, além de estar sendo constantemente melhorada pelo seu autor Cagatay Civici. Uma das últimas mudanças foi a possibilidade da escolha de diversos skins para os componentes, assim como a possibilidade de utilização do suporte de criação de skin do jquery para gerar skins personalizados para os componentes do PrimeFaces através do ThemeRoller. Utilizaremos skin também neste post.

O CRUD passará a ter a seguinte interface:

Pré Requisitos:

Avisos:

  • O desenvolvimento dos códigos foi realizado no Netbeans 6.9, porém você pode utilizar a IDE de sua preferência para construir o CRUD. Os projeto disponíveis para download no fim do tutorial é executável no Netbeans.
  • A versão do PrimeFaces utilizada foi a 2.2, utilize esta ou uma superior.

Adicionando e configurando a biblioteca PrimeFaces

Após  baixar a biblioteca PrimeFaces você deve adicioná-la ao projeto do CRUD de Livros. Caso não tenha ainda o projeto, baixe-o por aqui ou acompanhe a primeira paste do CRUD aqui.

A configuração necessária para que o PrimeFaces funcione é ZERO, isso mesmo, não é necessário nenhuma configuração xml para começar a utiliza-lo, apenas a sua declaração na página que o utilizar. No nosso caso a página index.xhtml deverá conter a seguinte declaração:

xmlns:p="http://primefaces.prime.com.tr/ui"

Para que possa ser utilizado um skin diferente na página, é necessário a inserção do seguinte código no arquivo web.xml

    <context-param>
        <param-name>primefaces.skin</param-name>
        <param-value>none</param-value>
    </context-param>

Esta configuração remove o skin padrão do PrimeFaces e permite que outros skins possam ser usados, sendo que, a especificação ocorre na página através da adição da tag <link>. Você deve clicar aqui para baixar o skin que é utilizado nas modificações deste CRUD. A pasta do skin deve ser colocada na pasta web do seu projeto. E as páginas que forem utilizar o skin devem conter a seguinte chamada dentro da tag <head>:

<link type="text/css" rel="stylesheet" href="dot-luv/skin.css" />

Porque utilizar ajax no nosso CRUD de Livros?

O ajax é a maneira que foi encontrada para que não fosse necessário recarregar toda uma página quando houvesse algumas mudanças apenas em parte dela. O objetivo do uso de ajax é tornar as páginas web mais próximas de softwares desktop e com isso poder ter uma aplicação que não depende de uma máquina específica e que pode ser acessada de qualquer lugar. Isso implica também em um novo modelo de negócio que começa a se difundir cada vez mais chamado Software as a Service (SaaS), ou, Software como um Serviço, este modelo se baseia em oferecer um serviço a diversos usuários pela web. Para o usuário a diferença está em não pagar um alto custo inicial pelo software como no modelo tradicional, além de poder acessar seu aplicativo de qualquer lugar. Para a empresa desenvolvedora a diferença está no lucro que não virá de uma vez como no modelo tardicional e também na facilidade de manutenção e updates para os usuários, pois, precisará realizadar apenas uma vez. Acho que comecei a me desviar um pouco do foco então vamos voltar. Em outro momento oportuno escreverei sobre SaaS.

Utilizando os componentes PrimeFaces no CRUD

Para melhorar a aparência do CRUD e adicionar a chamada assincrona por ajax aos métodos nós vamos adicionar alguns componentes da biblioteca PrimeFaces. Entre os componentes utilizados estão o layout, dataTable, commandLink, commandButton e o dialog.

Além de algumas mudanças nos códigos, nos descartaremos a página gerenciarLivro.xhtml e seu conteúdo irá para a página index.xhtml. Este conteúdo ficará dentro do componente dialog do primefaces e será chamado quando for necessário incluir ou alterar um livro.

Vamos ver como a página index.xhtml fica e depois vamos entender um poucos das mudanças realizadas.

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:p="http://primefaces.prime.com.tr/ui">
    <h:head>
        <title>Gerenciador de Livros</title>
        <link type="text/css" rel="stylesheet" href="dot-luv/skin.css" />
    </h:head>
    <h:body>
        <p:layout fullPage="true">
            <p:layoutUnit position="left" width="200" header="Atividades" resizable="true" closable="true" collapsible="true">
                <h:form prependId="false">
                    <p:commandLink value="Novo Livro" actionListener="#{livroController.prepararAdicionarLivro}" update="infosLivro" oncomplete="dialogGerLivro.show()"/>
                </h:form>
            </p:layoutUnit>
            <p:layoutUnit position="center">
                <h1>Gerenciador de Livros</h1>
                <br/>
                <h:form prependId="false">
                    <p:dataTable id="tabela" var="livro" value="#{livroController.listarLivros}">
                        <p:column>
                            <f:facet name="header">
                                <h:outputText value="Título"/>
                            </f:facet>
                            <h:outputText value="#{livro.titulo}" />
                        </p:column>
                        <p:column>
                            <f:facet name="header">
                                <h:outputText value="Autor"/>
                            </f:facet>
                            <h:outputText value="#{livro.autor}"/>
                        </p:column>
                        <p:column>
                            <f:facet name="header">
                                <h:outputText value="Páginas"/>
                            </f:facet>
                            <h:outputText value="#{livro.paginas}"/>
                        </p:column>
                        <p:column>
                            <f:facet name="header">
                                <h:outputText value="Editora"/>
                            </f:facet>
                            <h:outputText value="#{livro.editora}"/>
                        </p:column>
                        <p:column>
                            <f:facet name="header">
                                <h:outputText value="Isbn"/>
                            </f:facet>
                            <h:outputText value="#{livro.isbn}"/>
                        </p:column>
                        <p:column>
                            <f:facet name="header">
                                <h:outputText value="Avaliação"/>
                            </f:facet>
                            <h:outputText value="#{livro.avaliacao}"/>
                        </p:column>
                        <p:column>
                            <f:facet name="header">
                                <h:outputText value="Alterar"/>
                            </f:facet>
                            <p:commandButton actionListener="#{livroController.prepararAlterarLivro}" value="Alterar" update="infosLivro" oncomplete="dialogGerLivro.show()"/>
                        </p:column>
                        <p:column>
                            <f:facet name="header">
                                <h:outputText value="Excluir"/>
                            </f:facet>
                            <h:commandLink action="#{livroController.excluirLivro}" value="Excluir"/>
                        </p:column>
                    </p:dataTable>
                </h:form>
            </p:layoutUnit>
        </p:layout>

        <p:dialog header="Gerencia de Livro" widgetVar="dialogGerLivro"  resizable="false" modal="true" showEffect="slide" width="500">
            <h:form prependId="false">
                <h:panelGrid id="infosLivro" columns="2" style="margin-bottom:10px">

                    <h:outputLabel for="titulo" value="Título:" />
                    <h:inputText id="titulo" value="#{livroController.livro.titulo}"/>

                    <h:outputLabel for="autor" value="Autor:" />
                    <h:inputText id="autor" value="#{livroController.livro.autor}"/>

                    <h:outputLabel for="paginas" value="Páginas:" />
                    <h:inputText id="paginas" value="#{livroController.livro.paginas}"/>

                    <h:outputLabel for="editora" value="Editora:" />
                    <h:inputText id="editora" value="#{livroController.livro.editora}"/>

                    <h:outputLabel for="isbn" value="ISBN:" />
                    <h:inputText id="isbn" value="#{livroController.livro.isbn}"/>

                    <h:outputLabel for="avaliacao" value="Avaliação:" />
                    <h:selectOneMenu id="avaliacao" value="#{livroController.livro.avaliacao}">
                        <f:selectItem itemLabel="1" itemValue="1"/>
                        <f:selectItem itemLabel="2" itemValue="2"/>
                        <f:selectItem itemLabel="3" itemValue="3"/>
                        <f:selectItem itemLabel="4" itemValue="4"/>
                        <f:selectItem itemLabel="5" itemValue="5"/>
                    </h:selectOneMenu>

                    <p:commandButton update="tabela" oncomplete="dialogGerLivro.hide();" actionListener="#{livroController.adicionarLivro}" value="Inserir Livro"/>
                    <p:commandButton update="tabela" oncomplete="dialogGerLivro.hide();" actionListener="#{livroController.alterarLivro}" value="Alterar Livro"/>

                </h:panelGrid>
            </h:form>
        </p:dialog>

    </h:body>
</html>

O componente layout contém um subcomponente chamado layoutUnit. Nas configurações deste subcomponente nós informamos onde o código que estiver dentro dele vai se localizar na página. Por exemplo utilizando o position=”left” estamos falando que todo código dentro dete componente ficará do lado esquerdo da tela. Além disso, definimos a configuração fullPage do layout como true, o que faz o layout preencher toda a tela do browser.

A principal mudança do dataTable está na troca dos componentes padrões do jsf pelo dataTable do primefaces. Isso permite que a tabela seja renderizada e seja alterada com o uso do skin, além de muitas outras funcionalidades que não serão abordadas neste post. O dataTable passou a ter um id que serve para identifica-lo para que  fosse possível atualizar a tabela por ajax.

Os commandLinks e os commandButtons tiveram grandes alterações, pois é através deles que as chamadas ajax são realizadas. Vamos ver as principais mudanças:

  • Troca do action pelo actionListener: esta troca é necessária porque não vamos mais carregar outra página após a execução de um método no servidor. Nós vamos executar os métodos no servidor e depois apenas atualizar os componentes que sofreram mudanças com a execução do método.
  • O uso do atributo update informa quais componentes deverão ser renderizados novamente após a execução do actionListener, com isso o usuário passa a ter a sensação que está utilizando um programa desktop e não simplismente acessando um site.
  • O atributo onComplete serve para ativar o dialog que apresenta as informações de um livro para alterações ou inclusões. A ativação do dialog só ocorre após a execução do método que estiver definido no actionListener e também após a renderização dos componentes que estão na variável update.

O componente dialog permite a criação de uma janela modal que pode ser arrastada pela tela e torna a aplicação mais próxima ainda de aplicações desktop, pelo fato das janelas serem comuns nas aplicações desktop. Uma variável importante deste componente é o widgetVar que serve para definir um nome para o dialog. Com este nome o dialog pode ser apresentado ou escondido na tela através das funções javascript nomeDoDialog.show() e nomeDoDialog.hide(), respectivamente.

Estas são as informações importantes para compreender as mudanças realizadas nas páginas xhtml. Agora vamos ver como a classe  LivroController.java deve ficar para que tudo funcione corretamente.

package Controller;

import Dao.LivroDao;
import Dao.LivroDaoImp;
import Model.Livro;
import java.util.List;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.event.ActionEvent;
import javax.faces.model.DataModel;
import javax.faces.model.ListDataModel;

/**
 * @author José Alexandre
 */
@ManagedBean
@SessionScoped
public class LivroController {

    private Livro livro;
    private DataModel listaLivros;

    public DataModel getListarLivros() {
        List<Livro> lista = new LivroDaoImp().list();
        listaLivros = new ListDataModel(lista);
        return listaLivros;
    }

    public Livro getLivro() {
        return livro;
    }

    public void setLivro(Livro livro) {
        this.livro = livro;
    }

    public void prepararAdicionarLivro(ActionEvent actionEvent){
        livro = new Livro();
    }

    public void prepararAlterarLivro(ActionEvent actionEvent){
        livro = (Livro)(listaLivros.getRowData());
    }

    public String excluirLivro(){

        Livro livroTemp = (Livro)(listaLivros.getRowData());
        LivroDao dao = new LivroDaoImp();
        dao.remove(livroTemp);
        return "index";

    }

    public void adicionarLivro(ActionEvent actionEvent){

        LivroDao dao = new LivroDaoImp();
        dao.save(livro);

    }

    public void alterarLivro(ActionEvent actionEvent){

        LivroDao dao = new LivroDaoImp();
        dao.update(livro);

    }

}

A mudança realizada nesta classe está nos métodos deixarem de retornar uma String com a página de destino. Eles passam a não retornar nada e também passam a receber como parâmetro um objeto ActionEvent. Isso acontece porque o objetivo agora é apenas realizar algumas mudanças no servidor e depois atualizar somente algumas partes da página através de ajax.

Essas foram as mudanças necessárias no CRUD para que ele passasse a utilizar ajax e alguns dos componentes da biblioteca primefaces.

Conclusão

Podemos notar que com poucas mudanças tivemos um ganho enorme com relação a usabilidade e aparência do CRUD. A partir deste CRUD o usuário pode começar a explorar os diversos outros componentes disponibilizados pelo primefaces, veja aqui os demos de todos eles, lembrando que existem também outras bibliotecas de componentes que o usuário pode conhecer e que podem atender melhor as necessidades de componentes de acordo com o caso.

Espero que tenham aproveitado e entendido o funcionamento do uso dos componentes primefaces e do ajax!

Por hoje é só e até a próxima! Qualquer dúvida estou a disposição!

Download

Para baixar o código fonte compatível com Netbeans clique aqui.


Ações

Information

61 responses

13 09 2010
CRUD JSF 2.0 + Hibernate – Exemplo Gerenciando Livros « José Alexandre Macedo Blog

[…] A segunda parte deste CRUD com utilização de ajax e da biblioteca de componentes PrimeFaces está disponível aqui! […]

20 08 2012
Nelson

Great example! I was looking for something like this http://www.jtable.org/ using PrimeFaces, and your post is the closest thing I found. It would be cool if PrimeFaces had a powerful CRUD table!

14 09 2010
Tweets that mention CRUD JSF 2.0 + Hibernate: Parte 2– Utilizando a biblioteca Primefaces no Gerenciador de Livros « José Alexandre Macedo Blog -- Topsy.com

[…] This post was mentioned on Twitter by Garoto que programa, JoséAlexandreMacedo. JoséAlexandreMacedo said: [post] CRUD JSF 2.0 + Hibernate: Parte 2– Utilizando a biblioteca Primefaces no Gerenciador de Livros: http://wp.me/pBXUk-44 […]

14 09 2010
Marcelo

Muito Bom mesmo.!

Vou da uma lida neste novo post, para estudar.

Existe algumas duvidas em relação ao código java da primeira parte. Seria interessante se todo o código fosse comentado, assim ficaria mais fácil. Tem algumas coisas do hibernate que não abstrai.

Claro, o que você já fez, foi o bastante em desenvolver e publicar essa aplicação, esclareceu muitas duvidas que eu tinha em relação ao desenvolvimento JSF.

Estou desenvolvendo um sisteminha para meu tcc e irei utilizar JSF. Espero conseguir. kkkk

Agradeço em nome de todos que visualizarão seu Post.

Ótimo trabalho e Obrigado.

Abraços,
Marcelo Wanderley

14 09 2010
José Alexandre Macedo

Olá Marcelo,
Caso queira me falar melhor quais são suas dúvidas em relação ao código java fique a vontade que te explico!
Espero que ajude no seu tcc… qualquer dúvida estou ai!

Abraços,
José Alexandre

14 09 2010
Marcelo

Alexandre,

Eu tenho conhecimento em php.

Como não entendo muito “ainda” a sintaxe do Java, seria possível você fazer alguns comentários nas classes que foram criada?

Tipo:

– Class
Livro
LivroDaoImp
HibernateUtil
LivroController

– Interface
LivroDao

Em relação a configurações e aos Views já deu para abstrair.

Muito Obrigado, Alexandre,
Marcelo Wanderley

14 09 2010
José Alexandre Macedo

Marcelo,

Assim que possível comentarei algumas classes para torna-las mais claras!

Abraços,
José Alexandre

14 09 2010
Marcelo

Alexandre,

Espero não ser incomodo.

Agradeço pela atenção.

Obrigado.

Abraços,
Marcelo Wanderley

14 09 2010
Guto

Alguém conseguiu rodar o exemplo no Eclipse?
Estou levando uma surra aqui… se alguém gostaria de disponibilizar o código/jar’s/configs???

Ótimo artigo!

14 09 2010
José Alexandre Macedo

Guto,

Você pode se basear na versão que o Edson Lopes fez da primeira parte do CRUD, disponível aqui, e então fazer as modificações explicadas na parte 2!

15 09 2010
Marcelo

Olá Alexandre bom dia,

Olha aqui novamente. rsrsrs

Alexandre, existe muitas diferenças entre as versões jsf 1.2 para 2.0 ?
Foi utilizado spring neste pequeno sisteminha que você fez?
O que seria Spring?

Obrigado pela força.!

Abraços,
Marcelo Wanderley

15 09 2010
José Alexandre Macedo

Olá Marcelo!
Bom dia!
Existem muitas diferenças sim entre as versões 1.2 e 2 do JSF! Essa nova versão amadureceu bastante, passando a contar com muito menos configurações xml, novos tipos de escopo, criação de componentes personalizados de forma mais fácil entre muitas outras coisas, aumentando assim a produtividade no desenvolvimento!
Não utilizei spring no CRUD pois a intenção foi focar no jsf e um pouco no hibernate… poderia pensar no uso de spring no CRUD em uma 3ª ou 4ª parte…
Spring é um framework muito robusto para desenvolvimento web com java. Ele pode melhorar diversos aspectos da aplicação, como, segurança(spring security), diminuição do acoplamento (IoC). Spring também dá suporte a programação orientada a aspecto, a banco de dados, além de poder ser utilizado como um framework mvc.
É importante aprender a utiliza-lo uma hora pois sua aplicação pode ganhar muito com ele.
Existem também frameworks de desenvolvimento java para web que utilizam o spring por trás, como por exemplo o vraptor.

Qualquer dúvida estou ai!

Abraços,
José Alexandre

23 09 2010
Najib El Alam

José, achei muito bom o tutorial, não tive problema algum para importar o projeto e fazer funcionar. Parabéns pela boa vontade.

Alterei a dataTable para incluir paginação e ordenação. Estou com problema na ordenação. Simplesmente quando seleciono uma coluna, parece que ocorre o evento via ajax, pois a table dá uma piscada, mas a ordem dos dados permanecem.

já mudei o a dataTable pra dynamic=”true” forçando a exec do ajax no servidor mas mesmo assim não tá funcionando.

você poderia por favor tentar me ajudar nessa questão ?

obrigado.

23 09 2010
José Alexandre Macedo

Olá Najib,

obrigado pelos elogios…

posso tentar te ajudar sim, você chegou a ver se apareceu algum erro no tomcat?!

24 09 2010
Najib El Alam

Não aparece nada na log do tomcat.

24 09 2010
José Alexandre Macedo

Najib,

envie então o datatable pra que eu de uma olhada…

28 09 2010
Andre

Opa, primeiramente parabens pelo POST, me ajudou muito. Muito bom mesmo.
Continue postando amigo.

28 09 2010
André

Amigo, fiz o teu exemplo junto com facelets(Template), so que na hora de abrir o formulário, o formulário fica em segundo plano.

Sabe me dizer o porque disso estar acontecendo.
Helps.

😉

28 09 2010
José Alexandre Macedo

Olá André,

Como assim fica em segundo plano?
Poderia me explicar melhor?!

5 10 2010
Marcelo Wanderley

Olá Alexandre tudo bem?

Eu tentei fazer um exemplo apartir de um novo projeto. Fiz o mesmo procedimento, porém utilizei outra tabela.

Gerou este erro quando compilo:

org.hibernate.hql.ast.QuerySyntaxException: Pessoa is not mapped [from Pessoa]
at org.hibernate.hql.ast.util.SessionFactoryHelper.requireClassPersister(SessionFactoryHelper.java:158)
at org.hibernate.hql.ast.tree.FromElementFactory.addFromElement(FromElementFactory.java:87)
at org.hibernate.hql.ast.tree.FromClause.addFromElement(FromClause.java:70)
at org.hibernate.hql.ast.HqlSqlWalker.createFromElement(HqlSqlWalker.java:255)
at org.hibernate.hql.antlr.HqlSqlBaseWalker.fromElement(HqlSqlBaseWalker.java:3056)
at org.hibernate.hql.antlr.HqlSqlBaseWalker.fromElementList(HqlSqlBaseWalker.java:2945)
at org.hibernate.hql.antlr.HqlSqlBaseWalker.fromClause(HqlSqlBaseWalker.java:688)
at org.hibernate.hql.antlr.HqlSqlBaseWalker.query(HqlSqlBaseWalker.java:544)
at org.hibernate.hql.antlr.HqlSqlBaseWalker.selectStatement(HqlSqlBaseWalker.java:281)
at org.hibernate.hql.antlr.HqlSqlBaseWalker.statement(HqlSqlBaseWalker.java:229)
at org.hibernate.hql.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:228)
at org.hibernate.hql.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:160)
at org.hibernate.hql.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:111)
at org.hibernate.engine.query.HQLQueryPlan.(HQLQueryPlan.java:77)
at org.hibernate.engine.query.HQLQueryPlan.(HQLQueryPlan.java:56)
at org.hibernate.engine.query.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:72)
at org.hibernate.impl.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:133)
at org.hibernate.impl.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:112)
at org.hibernate.impl.SessionImpl.createQuery(SessionImpl.java:1623)
at br.com.sadeweb.dao.PessoaDaoImp.list(PessoaDaoImp.java:36)
at br.com.sadeweb.controller.PessoaController.getListarPessoas(PessoaController.java:30)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at javax.el.BeanELResolver.getValue(BeanELResolver.java:302)
at javax.el.CompositeELResolver.getValue(CompositeELResolver.java:175)
at com.sun.faces.el.FacesCompositeELResolver.getValue(FacesCompositeELResolver.java:72)
at com.sun.el.parser.AstValue.getValue(AstValue.java:116)
at com.sun.el.parser.AstValue.getValue(AstValue.java:163)
at com.sun.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:219)
at com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:102)
at javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:190)
at javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:178)
at javax.faces.component.UIData.getValue(UIData.java:554)
at javax.faces.component.UIData.getDataModel(UIData.java:1248)
at javax.faces.component.UIData.getRowCount(UIData.java:339)
at org.primefaces.component.datatable.DataTableRenderer.encodeTbody(DataTableRenderer.java:387)
at org.primefaces.component.datatable.DataTableRenderer.encodeMarkup(DataTableRenderer.java:152)
at org.primefaces.component.datatable.DataTableRenderer.encodeEnd(DataTableRenderer.java:78)
at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:878)
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1620)
at javax.faces.render.Renderer.encodeChildren(Renderer.java:168)
at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:848)
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1613)
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1616)
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1616)
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1616)
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1616)
at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:380)
at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:126)
at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:127)
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:313)
at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1523)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:279)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:188)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:641)
at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:97)
at com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.java:85)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:185)
at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:325)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:226)
at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:165)
at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:791)
at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:693)
at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:954)
at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:170)
at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:135)
at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:102)
at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:88)
at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:76)
at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:53)
at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:57)
at com.sun.grizzly.ContextTask.run(ContextTask.java:69)
at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:330)
at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:309)
at java.lang.Thread.run(Thread.java:619)

Ainda não sei ler este tipo de erro.

Poderia ajudar?

Abraços,
Marcelo Wanderley

6 10 2010
José Alexandre Macedo

Olá Marcelo,

É um problema que pode estar relacionado a três coisas…

¹ Veja se a classe Pessoa está com as annottations do hibernate
² Na hora de utilizar os métodos do hibernate veja se o nome da tabela está correto, se eu não me engano, a primeira letra deve estar em maiúsculo…
³ Confira as importações para ver se está importando dos lugares corretos

Caso faça isso e não de certo você me da um toque!

Abraços!

6 10 2010
Marcelo

Olá Alexandre,

Eu tinha colocado um código ontem a noite.

Você chegou a visualizar?

abraços,
Marcelo Wanderley

6 10 2010
José Alexandre Macedo

Olá Marcelo!

Não tive tempo ontem… vou dar uma olhada e respondo lá msmo!

Abraços!

6 10 2010
Marcelo Wanderley

Olá Alexandre,

Obrigado pela paciência.

Eu coloquei os annottations nos métodos, verifiquei as importações. E até agora nada.

estou usando uma tabela pessoa, cujo essa tabela esta tabela usa os campos com os nomes em maiúsculos, isso influência?
-No DAO coloquei da mesma forma, tudo em maiúsculo.
– Na index, não utilizei todos os campos da tabela, tentei manipular apenas alguns campos.

Logo abaixo vai o link do projeto, seria possível verificar onde estaria o erro, assim tento entender o que esta acontecendo.

http://rapidshare.com/files/423555756/JAVA_JSF.war

– Tenho algumas tabelas que são relacionadas. O hibernate já prepara todo o relacionamento entre as tabelas?

Muito obrigado Alexandre,
Abraços,
Marcelo Wanderley

7 10 2010
Marcelo Wanderley

Oi Alexandre,

Fico no aguardo ?

Abraços,
Marcelo Wanderley

8 10 2010
José Alexandre Macedo

Olá Marcelo,
Estou na correria esta semana aqui na empresa e assim que der dou uma olhada pra você OK?!
Acho melhor vc colocar o nome em minusculo na tabela… de uma olhada nisso pra ver…

Logo te respondo se demorar pode me cobrar…

Abraços!

9 10 2010
Marcelo Wanderley

Ok Alexandre,

Ficarei no aguardo.

Os nomes estão em maiúsculo e mesmo assim nada =[

Abraços e Obrigado,
Marcelo Wadnerley

13 10 2010
José Alexandre Macedo

Marcelo o Pedro disse que teve o mesmo problema e no caso dele estavam faltando algumas libs, veja se não é o seu caso tb e dps me avise!

Abraços!

23 10 2010
Pedro Henrique Castro

Bom tarde José Alexandre! Estou fazendo meu projeto TCC como mencionado a você, porém me deparei com um problema agora, estava fazendo e rodando no Mozilla, até aí beleza roda tranquilo, fui fazer um teste no IE e não abre por nada. Sabe o que possa ser? Tem algum contato e-mail pra entrar em contato contigo? Meu e-mail: phcastro03@yahoo.com.br

26 10 2010
Eugenio

Primeiramente, parabens, seu material é otimo.
To com um problema aqui, to usando seu crud como modelo. Tava tudo funcioando correntamente mas quando eu comecei a usar o primefaces na pagina ta dando esse erro.
/view/formProduto.xhtml @19,87 value=”#{produtoController.produto.nome}”: Target Unreachable, ‘produto’ returned null
e nao mudei nada com relação a isso para que pudesse ocorrer o erro

26 10 2010
José Alexandre Macedo

E ai Eugêio não vi que era você nas duas mensagem senão tinha respondido só em uma!
Confira a classe produtoController para ver se ela está de acordo com a produtoCOntroller da 2ª parte do CRUD.. em algum lugar o objeto produto está ficando null sem poder mais veja essa classe e dps me diga se achou algo!

Abraços!

26 10 2010
Eugênio

Qual a diferença do action pro actionListener? E no commandButton o que o update faz?

26 10 2010
José Alexandre Macedo

Olá Eugenio,

O actionListener é um ouvinte que apenas executa alguns códigos no servidor e não precisa retornar nenhuma página (não redireciona após executar como é o caso do action). O update informa quais componentes da páginas deverão ser renderizados novamente após a execução do actionListener, estes dois atributos foram utilizados para que o ajax funcionasse!

Espero ter esclarecido, qualquer coisa vc me fala!

Abraços,

José Alexandre Macedo

26 10 2010
Eugenio

Esclareceu sim, muito obrigado.
Sobre a primeira pergunta que eu fiz, o problema é que eu estava usando um menu item com um action(que deveria retornar uma pagina) so que nao estava retornando(apesar de chamar o metodo no bean) ai entao eu tinha colocado url=”” no final pra ir direto pra url, mas ai nao passava pelo metodo ai eu teria um produto nulo. Ai eu resolvi da seguinte forma, tirei o “url” e coloquei ajax=”false” ai agora ta funcionando direitinho. 😀

10 11 2010
Andre Luiz

Ola jose, exemplo excelente esse q vc deu. Bem q vc poderia implementar um relatorio agora, nao vi ainda nenhum tutorial de relatorio, e sei q vc e o cara mais apropriado pra implementar isso. obrigado pelos tutoriais e por tudo

10 11 2010
José Alexandre Macedo

Olá André,

Achei sua ideia interessante e diferente!
Vou ver se implemento ela em um dos próximos posts!
Agradeço a sugestão e sempre que tiver pode me falar!

Abraços,
José A Macedo

30 11 2010
juniorsatanas

Gostei do CRUD, gostaria de por Spring Security nele, e usalo para aprender… juntando com um pouco de Relacionamento e um relatorio básico !

Poderia dizer se é possivel usar Spring Security nele ?

junior

30 11 2010
José Alexandre Macedo

Olá Junior!

É possível sim utilizar Spring Security nele…
Estou querendo colocar logo mas o tempo ta mto curto nos últimos dias, estou terminando um trabalho para entregar na sexta daí poderei escrever o post!

Abraços!

30 11 2010
juniorsatanas
30 11 2010
José Alexandre Macedo

Interessante Junior, qual o problema que ocorre?!

16 12 2010
CRUD JSF 2.0 + Hibernate – Exemplo Gerenciando Livros | José Alexandre Macedo Blog

[…] A segunda parte deste CRUD com utilização de ajax e da biblioteca de componentes PrimeFaces está disponível aqui! […]

22 12 2010
juniorsatanas

Alexandre, não da erro só não gera um relatório kkkkkkkkkkkk vou esperar seu crud !

abraço e feliz natal !

22 12 2010
José Alexandre Macedo

Olá Junior!

Tudo certo por aí?!

Velho,

Acabei meu compromisso maior hoje… sem dúvidas vou voltar a escrever agora… estou terminando de migrar o blog tb pro domínio jamacedo.com, já está praticamente pronto, caso entre e ache algum pau me avise blz?! 🙂

Desejo um Feliz Natal pra você também viu!

Grande abraços!

12 08 2011
Gabriel

José Alexandre primeiramente parabéns pelo ótimo material de estudos. Estou seguindo o artigo para aprender sobre primefaces na pratica segui todos os passos como foram ditos
baixei esse theme aqui(que foi o descrito no artigo):
http://repository.prime.com.tr/org/primefaces/themes/dot-luv/1.0.1/dot-luv-1.0.1.jar

estou trabalhando com o primefaces 2.2

Quando inicio o apache tomcat ele le todas as bibliotecas corretamente, apóis isso eu tento rodar a aplicacao no navegador e o console do eclipse me retorna o seguinte erro (resumido):

GRAVE: Servlet.service() for servlet Faces Servlet threw exception
javax.el.PropertyNotFoundException: /index.xhtml at line 100 and column 96 value=”#{livroController.livro.avaliacao}”: Target Unreachable, ‘livro’ returned null

Linha correspondente:
obs: A codificacao das classes está identica a descrita no artigo.

pelo que eu intendi quando ele vai chamar a propriedade “avaliacao” da classe “Livro” pela classe “LivroController” a chamada retorna null

tenho 1 perguntas e 1 problema se voce puder me ajudar ficaria muito grato:

1- Tudo que está dentro do “dialog” só será mostrado na tela executado quando eu clicar em “Novo Livro” ou “Alterar” correto ? entao porque ele dá esse, de algo que está dentro do “dialog”, sem eu ao menos chama-lo(clicando em 1 dos butoes acima) ?

O probelma no qual gostaria de uma help seu é: Como fasso essa jossa funcionar ? rs Como corrijo esse erro ?

obrigado pela atencao, aguardando resposta
belo artigo parabens!

24 05 2012
Kleber Cardoso

Aconteceu comigo, no meu caso, faltava o new Livro() no método construtor do bean. Veja se ajuda.

public LivroController() {
livro = new Livro();
}

30 09 2011
nosbor84

Olá Alexandre, primeiramente parabéns pelo artigo, está excelente. Só tenho uma dúvida. Estou tentando fazer um mestre detalhe, sendo que os detalhes são inseridos através de modal. O problema é que quando eu coloco o botão que abre o Modal do detalhe dentro do form principal, aí não funciona. Você sabe se isso é um bug? Exista uma forma de eu usar formulários aninhados? Valeu.

20 10 2011
Leandro

Parabéns pelo post, muito bom!

19 02 2012
Marcos

Copiei aqui o tutorial passo a passo, mas obtive a seguinte mensagem de erro:

livro is not mapped [from livro]

——————–

Onde pode estar meu erro?
Desde já, agradeço.

11 04 2012
Guilherme

Amigo por favor pode me ajudar neste erro?

quando tento rodar o projeto a pagina web diz:
/index.xhtml: The class ‘Controller.LivroController’ does not have the property ‘prepararAdicionarLivro’.

No aguardo

12 04 2012
Cleiton Uchoa

Olá Amigo, primeiro gostaria de parabeniza-lo pelo post. Ficou muito bom mesmo. Estou fazendo alguns upgrades nesse sistema, e queria fazer um filtro utilizando um para trazer os livros de acordo com o autor escolhido. Poderia me da um luz de como poderia fazer isso?

att ..

Vlw amigo!

12 04 2012
Cleiton Uchoa

Olá cara amigo. . Venho apenas para informar que conseguir fazer o que eu queria… Hehe.
Eu nunca tinha mexido com hibernate e sabia muito pouco de JSF, mas graça ao seu tutorial
deu pra fazer muita coisa …

A quem interessar estarei aqui postando minhas alterações. Gostaria da sua opinião pra saber
se fiz tudo certinho, ou tinha uma maneira mais facil de fazer isso …

Alterações:

– Na “index.xhtm” eu incluir o seguinte campo fora do form onde se encontra o dataTable:
Filtro por Autor:

– Na classe “LivroController” eu incluir os atributos:
List comboAutor = null; // Será usado para popular o selectOneMenu
String selected = “”; // Usado para guardar a opção escolhida no selectOneMenu

Incluir os métodos:

public List getComboAutor(){
List lista = new LivroDaoImp().listAutor();
comboAutor = new ArrayList();
comboAutor.addAll(lista);

Livro livro = new Livro();
return comboAutor;
}

public void setComboAutor(List comboAutor) {
this.comboAutor = comboAutor;
}

public String getSelected(){
return selected;
}

public void setSelected(String selected){
this.selected = selected;
}

E alterei o método “public DataModel getListarLivros()” para:

public DataModel getListarLivros() {
List lista = null;
if(selected.equals(“”)){
lista = new LivroDaoImp().list();
}
else{
lista = new LivroDaoImp().list(selected);
}
listaLivros = new ListDataModel(lista);
return listaLivros;
}

– Na classe “LivroDaoImp” eu incluir os seguintes métodos:

public List list(String pAutor) {
Session session = HibernateUtil.getSessionFactory().openSession();
Transaction t = session.beginTransaction();
List lista = session.createQuery(“from Livro where autor = ‘” + pAutor + “‘”).list();
t.commit();
return lista;
}

public List listAutor() {
Session session = HibernateUtil.getSessionFactory().openSession();
Transaction t = session.beginTransaction();
List lista = session.createQuery(“select distinct(autor) from Livro”).list();
t.commit();

return lista;
}

Pronto, feito isso eu conseguir inserir um filtro de pesquisa pelos autores dos livros! ^^

Estarei fazendo mais upgrades no sistema…

Mas uma vez agradeço ao Macedo pelo excelente Post!!!

att …

12 04 2012
Cleiton Uchoa

Meu controle “h:selectOneMenu” nao apareceu le em cima na parte logo após o ‘Filtro por Autor:’ devido as TAGs, vou postar substituindo TAGS por colchetes “[]”, assim poderei mostrar meu Código:

– Na “index.xhtm” eu incluir o seguinte campo fora do form onde se encontra o dataTable:
[h:outputLabel]Filtro por Autor:[/h:outputLabel]
[h:selectOneMenu style=”align:right” id=”autor” onchange=”submit()” value=”#{livroController.selected}”]
[f:selectItem itemValue=”” itemLabel=”Selecione…” /]
[f:selectItems value=”#{livroController.comboAutor}”/]
[/h:selectOneMenu]

att …

10 05 2012
Danilo furtado (@Danilo21Furtado)

Parabéns ficou muito bom consegui entender direitinho, unica coisa que ficou uma pequena duvida foi em relação ao Ajax, só de usar o update referenciando a tabela e usar o actionListerner o JSF já sabe que isso é Ajax?

18 05 2012
Wellington

Estou usando o primefaces-3.2.jar e está dando erro no index.xhtml. Você sabe a solução?

Obrigado.

18 05 2012
Wellington

Esqueci de postar o erro:

Cannot find component with identifier “infosLivro” in view.
javax.faces.FacesException: Cannot find component with identifier “infosLivro” in view.

24 05 2012
Kleber Cardoso

Passei por esse problema. Da versão 2.2 para a 3.2 ou superior tem umas diferenças na implementação do JSF, como vc pode conferir no http://www.primefaces.org/showcase-labs/ui/commandLink.jsf. Depois dessas correções, vai rodar tranquilo.

6 07 2012
Adler

Olá quando rodo ele me apresenta o seguinte erro
Cannot find component with identifier “infosLivro” referenced from “j_idt10”.
Mas não consegui encontrar o problema.

27 09 2012
franklin Santos

oi jose talves já tem um exemplo cuandose chamadas de três mesas, onde você pode atualizar e excluir

oi jose talves já tem um exemplo cuandose chamadas de três mesas, onde você pode atualizar e excluir

27 09 2012
franklin Santos

hola jose el material que hay en tu pagina es muy bueno
y me funciona

pero necesitaba como puedo hacer para

– insertar datos a tres tablas de una base de datos
– la operacion de actualizar que actualize las tres tablas y dar de baja por decir aun usuario articulo y proveedor

///// estoy intentando hacer un sistema pero la verdad te digo despues de ver varios tutoriales en pdf, paginas web y cientos de videos el tuyo me fue mas entendible
////////////////////

27 09 2012
franklin Santos

agora portugês

oi jose o material em seu site é muito bom
e funciona

mas precisava de como eu posso fazer para

– Inserção de dados em três tabelas de um banco de dados
– A operação de atualização que atualiza as três tabelas e anular a dizer mesmo artigo usuário e fornecedor

Eu estou tentando fazer um sistema, mas digo-vos a verdade, depois de ver vários tutoriais em pdf, páginas da web e centenas de vídeos vocês eu era mais compreensível

2 02 2013
pedrofsnfsn

Olá, estou tendo o seguinte erro:

“Cannot find component with identifier “infosLivro” referenced from “j_idt10″.”

Pelo que entendi o problema é com o componente de id infosLivro, o <h:panelGrid….

Como é que eu refaço ele pra corrigir o erro e conseguir exibir a página?
Preciso fazer um trabalho utilizando o PrimeFaces e gostei do exemplo dado, gostaria de ver melhor a página pra entender o funcionamento – haja visto que o meu professor de PW ainda não ministrou este conteúdo.

Deixar mensagem para José Alexandre Macedo Cancelar resposta