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:
- Este post é uma continuação do CRUD JSF 2.0 + Hibernate – Exemplo Gerenciando Livros, portanto é interessante que você acompanhe os passos inicias no CRUD para que entenda o que será alterado neste.
- Biblioteca de componentes PrimeFaces disponível aqui
- Os demais pré requisitos estão descritos na primeira parte do CRUD JSF 2
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 segunda parte deste CRUD com utilização de ajax e da biblioteca de componentes PrimeFaces está disponível aqui! […]
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!
[…] 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 […]
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
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
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
Marcelo,
Assim que possível comentarei algumas classes para torna-las mais claras!
Abraços,
José Alexandre
Alexandre,
Espero não ser incomodo.
Agradeço pela atenção.
Obrigado.
Abraços,
Marcelo Wanderley
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!
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!
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
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
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.
Olá Najib,
obrigado pelos elogios…
posso tentar te ajudar sim, você chegou a ver se apareceu algum erro no tomcat?!
Não aparece nada na log do tomcat.
Najib,
envie então o datatable pra que eu de uma olhada…
Opa, primeiramente parabens pelo POST, me ajudou muito. Muito bom mesmo.
Continue postando amigo.
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.
😉
Olá André,
Como assim fica em segundo plano?
Poderia me explicar melhor?!
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
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!
Olá Alexandre,
Eu tinha colocado um código ontem a noite.
Você chegou a visualizar?
abraços,
Marcelo Wanderley
Olá Marcelo!
Não tive tempo ontem… vou dar uma olhada e respondo lá msmo!
Abraços!
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
Oi Alexandre,
Fico no aguardo ?
Abraços,
Marcelo Wanderley
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!
Ok Alexandre,
Ficarei no aguardo.
Os nomes estão em maiúsculo e mesmo assim nada =[
Abraços e Obrigado,
Marcelo Wadnerley
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!
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
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
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!
Qual a diferença do action pro actionListener? E no commandButton o que o update faz?
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
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. 😀
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
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
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
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!
relatorio jsf 2
http://pobrecomputeiro.wordpress.com/2010/08/14/jasperreports-para-quem-tem-jsf-2-e-o-primefaces/
mas não conseguir por para rodar !
abraço.
Interessante Junior, qual o problema que ocorre?!
[…] A segunda parte deste CRUD com utilização de ajax e da biblioteca de componentes PrimeFaces está disponível aqui! […]
Alexandre, não da erro só não gera um relatório kkkkkkkkkkkk vou esperar seu crud !
abraço e feliz natal !
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!
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!
Aconteceu comigo, no meu caso, faltava o new Livro() no método construtor do bean. Veja se ajuda.
public LivroController() {
livro = new Livro();
}
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.
Parabéns pelo post, muito bom!
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.
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
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!
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 …
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 …
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?
Estou usando o primefaces-3.2.jar e está dando erro no index.xhtml. Você sabe a solução?
Obrigado.
Esqueci de postar o erro:
Cannot find component with identifier “infosLivro” in view.
javax.faces.FacesException: Cannot find component with identifier “infosLivro” in view.
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.
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.
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
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
////////////////////
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
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.