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! [...]
[...] 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!
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.