JSF – Migrando CRUD para Facelets

Neste post irei fazer a migração da nossa aplicação JSF completa utilizando RichFaces + Hibernate + MySQL na prática para Facelets.

Algumas das características do Facelets:

  • Utilização do XHTML como camada de visão da aplicação;

  • Permite a criação de componentes reutilizáveis;

  • Aumenta a performance da aplicação de 30% até 50% comparado com JSP, pois não usa a compilação para servlet;
  • Criação simplificada de templates;

  • Uso de código JSF em tags HTML com o atributo jsfc (não é muito recomendado);
  • Camada de visão padrão para o JSF 2.0;

Mais informações >>aqui<<.

Versões utilizadas

  • Eclipse 3.4.1
  • JDK 1.6
  • Tomcat 6.0.18
  • MyFaces 1.2.5
  • RichFaces 3.3.1
  • Hibernate Annotations 3.4.0
  • Hibernate 3.3.1
  • MySQL 5
  • JUnit 4.5
  • Caelum Stella 1.2

Estrutura do projeto

crud_facelets

Códigos

atualizaPessoa.xhtml:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
 xmlns:ui="http://java.sun.com/jsf/facelets"
 xmlns:h="http://java.sun.com/jsf/html"
 xmlns:f="http://java.sun.com/jsf/core"
 xmlns:a4j="http://richfaces.org/a4j"
 xmlns:stella="http://stella.caelum.com.br/faces"
 xmlns:rich="http://richfaces.org/rich">
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
 </head>

 <a4j:keepAlive beanName="pessoaMB" />

 <ui:composition template="/template/template.xhtml">
 <ui:define name="corpo">
 <h:form>
 <rich:messages />

 <fieldset><legend>Atualização de Dados</legend> 

 <rich:dataTable value="#{pessoaMB.pessoas}" var="fisica" rows="10" id="fisicas" width="100%" cellspacing="0" cellpadding="0" border="1">
 <h:column>
 <f:facet name="header">
 <h:outputText value="NOME" />
 </f:facet>
 <h:outputText value="#{fisica.nome}" />
 </h:column>

 <h:column>
 <f:facet name="header">
 <h:outputText value="E-MAIL" />
 </f:facet>
 <h:outputText value="#{fisica.email}" />
 </h:column>

 <h:column>
 <f:facet name="header">
 <h:outputText value="CPF" />
 </f:facet>
 <h:outputText value="#{fisica.cpf}" />
 </h:column>

 <h:column>
 <f:facet name="header">
 <h:outputText value="DATA NASC." />
 </f:facet>
 <h:outputText value="#{fisica.dataNascimento}">
 <f:convertDateTime pattern="dd/MM/yyyy" />
 </h:outputText>
 </h:column>

 <h:column>
 <f:facet name="header">
 <h:outputText value="CELULAR" />
 </f:facet>
 <h:outputText value="#{fisica.telefoneCelular}" />
 </h:column>

 <h:column>
 <f:facet name="header">
 <h:outputText value="Exclusão"/>
 </f:facet>

 <a4j:commandLink reRender="panelGridInputs">
 <h:outputText value="Selecionar"/>
 <f:setPropertyActionListener  value="#{fisica}" target="#{pessoaMB.pessoa}"/>
 </a4j:commandLink>

 </h:column>

 <f:facet name="footer">
 <rich:datascroller />
 </f:facet>
 </rich:dataTable>

 <rich:messages/>

 <a4j:region id="regiaoAjax">
 <a4j:status id="sts">
 <f:facet name="start">
 <h:graphicImage value="/images/ajax-loader.gif" />
 </f:facet>
 </a4j:status>
 </a4j:region>

 <h:panelGrid columns="2" id="panelGridInputs">
 <h:outputLabel for="nome" value="Nome "  />
 <h:inputText id="nome" value="#{pessoaMB.pessoa.nome}" style=" width : 254px;"/>

 <h:outputLabel for="email" value="E-mail "  />
 <h:inputText id="email" value="#{pessoaMB.pessoa.email}" style=" width : 249px;">
 <f:validator validatorId="emailValidator"/>
 </h:inputText>

 <h:outputLabel for="cpf" value="CPF "  />
 <h:inputText id="cpf" validatorMessage="CPF inválido!" value="#{pessoaMB.pessoa.cpf}" size="60" style=" width : 106px;">
 <rich:jQuery selector="#cpf" query="mask('999.999.999-99')" timing="onload"/>
 <stella:validateCPF formatted="true"/>
 </h:inputText>

 <h:outputLabel for="senha" value="Senha "  />
 <h:inputSecret id="senha" value="#{pessoaMB.pessoa.senha}" size="30"/>

 <h:outputLabel for="dataNasc" value="Data Nascimento: "  />
 <h:inputText id="dataNasc" validatorMessage="Data de nascimento com formato inválido!" value="#{pessoaMB.pessoa.dataNascimento}" size="60" style=" width : 75px;">
 <f:convertDateTime pattern="dd/MM/yyyy" />
 <rich:jQuery selector="#dataNasc" query="mask('99/99/9999')" timing="onload"/>
 </h:inputText> 

 <h:outputLabel for="telCel" value="Tel. Celular "  />
 <h:inputText id="telCel" value="#{pessoaMB.pessoa.telefoneCelular}">
 <rich:jQuery selector="#telCel" query="mask('(99) 9999-9999')" timing="onload"/>
 </h:inputText>

 <a4j:commandButton value="Atualizar" action="#{pessoaMB.merge}" styleClass="botoes" status="sts" reRender="fisicas"/>
 <a4j:commandButton value="Voltar" immediate="true" action="toIndex" styleClass="botoes"/>
 </h:panelGrid>
 </fieldset>
 </h:form>
 </ui:define>
 </ui:composition>
</html>

cadastraPessoa.xhtml:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
 xmlns:ui="http://java.sun.com/jsf/facelets"
 xmlns:h="http://java.sun.com/jsf/html"
 xmlns:f="http://java.sun.com/jsf/core"
 xmlns:a4j="http://richfaces.org/a4j"
 xmlns:stella="http://stella.caelum.com.br/faces"
 xmlns:rich="http://richfaces.org/rich">
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
 </head>

 <a4j:keepAlive beanName="pessoaMB" />

 <ui:composition template="/template/template.xhtml">
 <ui:define name="corpo">
 <h:form>
 <rich:messages />

 <fieldset>
 <legend>Cadastro de Pessoa</legend>
 <a4j:region id="regiaoAjax">
 <a4j:status id="sts">
 <f:facet name="start">
 <h:graphicImage value="/images/ajax-loader.gif" />
 </f:facet>
 </a4j:status>
 </a4j:region>

 <h:panelGrid columns="2" id="inputs">
 <h:outputLabel for="nome" value="Nome "  />
 <h:inputText id="nome" value="#{pessoaMB.pessoa.nome}" styleClass="edit" size="40" />

 <h:outputLabel for="email" value="E-mail "  />
 <h:inputText id="email" value="#{pessoaMB.pessoa.email}" required="true" requiredMessage="Campo e-mail obrigatório!" styleClass="edit" size="30">
 <f:validator validatorId="emailValidator"/>
 </h:inputText>

 <h:outputLabel for="senha" value="Senha "  />
 <h:inputSecret id="senha" value="#{pessoaMB.pessoa.senha}" required="true" requiredMessage="Campo senha obrigatório!" styleClass="edit" size="30"/>

 <h:outputLabel for="cpf" value="CPF "  />
 <h:inputText id="cpf" value="#{pessoaMB.pessoa.cpf}" styleClass="edit" size="11">
 <rich:jQuery selector="#cpf" query="mask('999.999.999-99')" timing="onload"/>
 <stella:validateCPF formatted="true"/>
 </h:inputText>

 <h:outputLabel for="dataNasc" value="Data Nascimento "  />
 <h:inputText id="dataNasc" validatorMessage="Data de nascimento com formato inválido!" value="#{pessoaMB.pessoa.dataNascimento}" styleClass="edit" size="10" >
 <f:convertDateTime pattern="dd/MM/yyyy" />
 <rich:jQuery selector="#dataNasc" query="mask('99/99/9999')" timing="onload"/>
 </h:inputText>

 <h:outputLabel for="telCel" value="Tel. Celular "  />
 <h:inputText id="telCel" value="#{pessoaMB.pessoa.telefoneCelular}" styleClass="edit" size="10">
 <rich:jQuery selector="#telCel" query="mask('(99) 9999-9999')" timing="onload"/>
 </h:inputText>

 <a4j:commandButton value="Inserir" action="#{pessoaMB.save}" status="sts" reRender="inputs" styleClass="botoes"/>
 <a4j:commandButton value="Voltar" immediate="true" action="toIndex" styleClass="botoes"/>
 </h:panelGrid>
 </fieldset>
 </h:form>
 </ui:define>
 </ui:composition>
</html>

pesquisaPessoa.xhtml:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
 xmlns:ui="http://java.sun.com/jsf/facelets"
 xmlns:h="http://java.sun.com/jsf/html"
 xmlns:f="http://java.sun.com/jsf/core"
 xmlns:a4j="http://richfaces.org/a4j"
 xmlns:stella="http://stella.caelum.com.br/faces"
 xmlns:rich="http://richfaces.org/rich">
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
 </head>

 <a4j:keepAlive beanName="pessoaMB" />

 <ui:composition template="/template/template.xhtml">
 <ui:define name="corpo">
 <h:form>
 <rich:messages />

 <fieldset>
 <legend>Pesquisa de Pessoas</legend>
 <h:panelGrid columns="2">

 <h:outputLabel for="nomeLabel" value="Digite o nome: " />
 <h:inputText id="nomeInput" value="#{pessoaMB.pessoa.nome}" style=" width : 321px;" />

 <h:commandButton value="Pesquisar" action="#{pessoaMB.pesquisaByNome}" styleClass="botoes"/>
 <h:commandButton value="Voltar" immediate="true" action="toIndex" styleClass="botoes"/>
 </h:panelGrid>

 <h:panelGrid columns="2" id="panelGridInputs">
 <h:outputLabel for="nome" value="Nome "  />
 <h:inputText id="nome" readonly="true" value="#{pessoaMB.pessoa.nome}" style=" width : 254px;"/>

 <h:outputLabel for="email" value="E-mail "  />
 <h:inputText id="email" readonly="true" value="#{pessoaMB.pessoa.email}" style=" width : 249px;"/>

 <h:outputLabel for="cpf" value="CPF "  />
 <h:inputText id="cpf" readonly="true" validatorMessage="CPF inválido!" value="#{pessoaMB.pessoa.cpf}" size="60" style=" width : 106px;"/>

 <h:outputLabel for="dataNasc" value="Data Nascimento: "  />
 <h:inputText id="dataNasc" readonly="true" validatorMessage="Data de nascimento com formato inválido!" value="#{pessoaMB.pessoa.dataNascimento}" size="60" style=" width : 75px;">
 <f:convertDateTime pattern="dd/MM/yyyy" />
 </h:inputText> 

 <h:outputLabel for="telCel" value="Tel. Celular "  />
 <h:inputText id="telCel" readonly="true" value="#{pessoaMB.pessoa.telefoneCelular}" />
 </h:panelGrid>
 </fieldset>
 </h:form>
 </ui:define>
 </ui:composition>
</html>

removePessoa.xhtml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
 xmlns:ui="http://java.sun.com/jsf/facelets"
 xmlns:h="http://java.sun.com/jsf/html"
 xmlns:f="http://java.sun.com/jsf/core"
 xmlns:a4j="http://richfaces.org/a4j"
 xmlns:stella="http://stella.caelum.com.br/faces"
 xmlns:rich="http://richfaces.org/rich">
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
 </head>

 <a4j:keepAlive beanName="pessoaMB" />

 <ui:composition template="/template/template.xhtml">
 <ui:define name="corpo">
 <h:form>
 <rich:messages />
 <fieldset><legend>Remoção de Pessoas</legend>
 <rich:dataTable value="#{pessoaMB.pessoas}" var="fisica" rows="10" id="fisicas" width="100%" cellspacing="0" cellpadding="0" border="1">
 <h:column>
 <f:facet name="header">
 <h:outputText value="NOME" />
 </f:facet>
 <h:outputText value="#{fisica.nome}" />
 </h:column>

 <h:column>
 <f:facet name="header">
 <h:outputText value="E-MAIL" />
 </f:facet>
 <h:outputText value="#{fisica.email}" />
 </h:column>

 <h:column>
 <f:facet name="header">
 <h:outputText value="CPF" />
 </f:facet>
 <h:outputText value="#{fisica.cpf}" />
 </h:column>

 <h:column>
 <f:facet name="header">
 <h:outputText value="DATA NASC." />
 </f:facet>
 <h:outputText value="#{fisica.dataNascimento}">
 <f:convertDateTime pattern="dd/MM/yyyy" />
 </h:outputText>
 </h:column>

 <h:column>
 <f:facet name="header">
 <h:outputText value="CELULAR" />
 </f:facet>
 <h:outputText value="#{fisica.telefoneCelular}" />
 </h:column>

 <h:column>
 <f:facet name="header">
 <h:outputText value="Exclusão"/>
 </f:facet>

 <a4j:commandLink action="#{pessoaMB.delete}" status="sts" reRender="fisicas" >
 <h:outputText value="Excluir"/>
 <f:setPropertyActionListener value="#{fisica.id}" target="#{pessoaMB.id}" />
 </a4j:commandLink>
 </h:column>

 <f:facet name="footer">
 <rich:datascroller />
 </f:facet>
 </rich:dataTable>

 <a4j:region id="regiaoAjax">
 <a4j:status id="sts">
 <f:facet name="start">
 <h:graphicImage value="/images/ajax-loader.gif" />
 </f:facet>
 </a4j:status>
 </a4j:region>

 <h:commandButton value="Voltar" immediate="true" action="toIndex" styleClass="botoes"/>
 </fieldset>
 </h:form>
 </ui:define>
 </ui:composition>
</html>

login.xhtml:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
 xmlns:ui="http://java.sun.com/jsf/facelets"
 xmlns:h="http://java.sun.com/jsf/html"
 xmlns:f="http://java.sun.com/jsf/core"
 xmlns:a4j="http://richfaces.org/a4j"
 xmlns:stella="http://stella.caelum.com.br/faces"
 xmlns:rich="http://richfaces.org/rich">
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
 </head>

 <a4j:keepAlive beanName="pessoaMB" />

 <ui:composition template="/template/template.xhtml">
 <ui:define name="corpo">
 <h:form>
 <rich:messages />
 <fieldset>
 <h:panelGrid columns="2">
 <h:outputText value="E-mail" styleClass="rotulos" />
 <h:inputText id="email" value="#{pessoaMB.pessoa.email}" styleClass="edit" size="25">
 <f:validator validatorId="emailValidator" />
 </h:inputText>    

 <h:outputLabel for="senha" value="Senha" styleClass="rotulos"/>
 <h:inputSecret id="senha" styleClass="edit" validatorMessage="A senha deve ter no mínimo 6 caracteres!" value="#{pessoaMB.pessoa.senha}" size="25">
 <f:validateLength minimum="6"/>
 </h:inputSecret>
 <h:commandButton id="botao" value="Entrar" action="#{pessoaMB.login}" />
 </h:panelGrid>
 </fieldset>
 </h:form>
 </ui:define>
 </ui:composition>
</html>

template.xhtml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
 xmlns:ui="http://java.sun.com/jsf/facelets"
 xmlns:h="http://java.sun.com/jsf/html"
 xmlns:f="http://java.sun.com/jsf/core"
 xmlns:a4j="http://richfaces.org/a4j"
 xmlns:stella="http://stella.caelum.com.br/faces"
 xmlns:rich="http://richfaces.org/rich">

<head>
 <link rel="StyleSheet" type="text/css" href="/jsf/style/estilos.css" media="screen" />
 <script type="text/javascript" src="/jsf/resources/jquery.maskedinput-1.2.1.js"></script>

 <title>
 <ui:insert name="pageTitle">
 <h:outputText value="CRUD Facelets "/>
 </ui:insert>
 </title>
</head>

<body>
 <div id="topo">
 <ui:insert name="topo">
 Topo do CRUD Facelets
 </ui:insert>
 </div>

 <div id="corpo">
 <ui:insert name="corpo">
 Conteúdo
 </ui:insert>
 </div>

 <div id="rodape">
 <ui:insert name="rodape">
 <hr/>
 Rodapé CRUD Facelets
 </ui:insert>
 </div>
</body>
</html>

web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
 <display-name>crud_facelets</display-name>
 <welcome-file-list>
 <welcome-file>index.html</welcome-file>
 <welcome-file>index.htm</welcome-file>
 <welcome-file>index.jsp</welcome-file>
 </welcome-file-list>
 <context-param>
 <param-name>javax.faces.DEFAULT_SUFFIX </param-name>
 <param-value>.xhtml </param-value>
</context-param>
<context-param>
 <param-name>facelets.DEVELOPMENT </param-name>
 <param-value>true </param-value>
</context-param>
<context-param>
 <param-name>com.sun.faces.validateXml </param-name>
 <param-value>false </param-value>
</context-param>
 <context-param>
 <param-name>com.sun.faces.verifyObjects </param-name>
 <param-value>true </param-value>
</context-param>
 <servlet>
 <servlet-name>Faces Servlet</servlet-name>
 <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
 <load-on-startup>1</load-on-startup>
 </servlet>
 <servlet-mapping>
 <servlet-name>Faces Servlet</servlet-name>
 <url-pattern>*.jsf</url-pattern>
 <url-pattern>*.faces</url-pattern>
 </servlet-mapping>

 <context-param>
 <param-name>org.ajax4jsf.SKIN</param-name>
 <param-value>blueSky</param-value>
 </context-param>
 <filter>
 <display-name>Ajax4jsf Filter</display-name>
 <filter-name>ajax4jsf</filter-name>
 <filter-class>org.ajax4jsf.Filter</filter-class>
 </filter>
 <filter-mapping>
 <filter-name>ajax4jsf</filter-name>
 <servlet-name>Faces Servlet</servlet-name>
 <dispatcher>REQUEST</dispatcher>
 <dispatcher>FORWARD</dispatcher>
 <dispatcher>INCLUDE</dispatcher>
 </filter-mapping>

 <filter>
 <display-name>AuthFilter</display-name>
 <filter-name>AuthFilter</filter-name>
 <filter-class>br.com.serjaum.filtro.AuthFilter</filter-class>
 </filter>
 <filter-mapping>
 <filter-name>AuthFilter</filter-name>
 <url-pattern>/*</url-pattern>
 </filter-mapping>

 <context-param>
 <param-name>facelets.SKIP_COMMENTS</param-name>
 <param-value>true</param-value>
 </context-param>
</web-app>

Importando o projeto

  1. Baixe o projeto completo >>aqui<<;
  2. Descompacte o projeto no seu workspace;
  3. No Eclipse vá em: File –> Import –> General – Existing Projects into Workspace –> Next –> Selecione o projeto descompactado no workspace –> Finish.

Criando o banco de dados

  1. Com o MySQL instalado e configurado com usuário: root e senha: root crie um novo schema com o nome de jsf.
  2. Execute a classe br.com.serjaum.util.GerarTabelas.java. Essa classe criará as tabelas que foram mapeadas no arquivo hibernate.cfg.xml, no caso a classe Pessoa terá uma tabela correspondente com o nome de pessoa no nosso banco de dados.

Resultado

resultado_facelets


26 Comentários on “JSF – Migrando CRUD para Facelets”

  1. Hudson.negao disse:

    parabens pela iniciativa

  2. Leonardo disse:

    Parabéns, muito bom material!

  3. Daniel Jurado disse:

    Precisava disso! Otima iniciativa! Obrigado!

  4. Daniel Jurado disse:

    Uma pequena duvida:

    Nao sei se por estar usando glassfish, o setRedirect nao funciona… É necessário usar um Navigation Rule para mapear success e failure na pagina de login. Estou certo?

  5. André disse:

    Parabéns pelo exemplo! Muito bom trabalho com o uso do jQuery.

    Só um detalhe que no download desse projeto o template está apontando para o projeto anterior

    ^
    |
    /crud_facelets/

    Valeu

  6. Paulo Ribeiro disse:

    Tentei usar esse exemplo :

    Tomcat 6
    java 5
    Eclipse 3.4

    e na hora de fazer o deploy está me dando erro :
    SEVERE: Exception sending context initialized event to listener instance of class com.sun.faces.config.ConfigureListener
    com.sun.faces.config.ConfigurationException: CONFIGURATION FAILED! org.ajax4jsf.application.DebugLifecycleFactory
    at com.sun.faces.config.ConfigManager.initialize(ConfigManager.java:212)
    at com.sun.faces.config.ConfigureListener.contextInitialized(ConfigureListener.java:174)
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:3843)
    at org.apache.catalina.core.StandardContext.start(StandardContext.java:4342)
    at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
    at org.apache.catalina.core.StandardHost.start(StandardHost.java:719)
    at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
    at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443)
    at org.apache.catalina.core.StandardService.start(StandardService.java:516)
    at org.apache.catalina.core.StandardServer.start(StandardServer.java:710)
    at org.apache.catalina.startup.Catalina.start(Catalina.java:578)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:288)
    at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:413)
    Caused by: java.lang.InstantiationException: org.ajax4jsf.application.DebugLifecycleFactory
    at java.lang.Class.newInstance0(Unknown Source)
    at java.lang.Class.newInstance(Unknown Source)
    at javax.faces.FactoryFinder.getImplGivenPreviousImpl(FactoryFinder.java:578)
    at javax.faces.FactoryFinder.getImplementationInstance(FactoryFinder.java:459)
    at javax.faces.FactoryFinder.getFactory(FactoryFinder.java:260)
    at com.sun.faces.config.processor.FactoryConfigProcessor.verifyFactoriesExist(FactoryConfigProcessor.java:186)
    at com.sun.faces.config.processor.FactoryConfigProcessor.process(FactoryConfigProcessor.java:131)
    at com.sun.faces.config.ConfigManager.initialize(ConfigManager.java:202)
    … 16 more
    25/09/2009 12:33:36 org.apache.catalina.core.StandardContext start
    SEVERE: Error listenerStart
    25/09/2009 12:33:36 org.apache.catalina.core.StandardContext start
    SEVERE: Context [/crud_facelets] startup failed due to previous errors
    25/09/2009 12:33:37 org.apache.coyote.http11.Http11Protocol start
    INFO: Starting Coyote HTTP/1.1 on http-8080
    25/09/2009 12:33:37 org.apache.jk.common.ChannelSocket init
    INFO: JK: ajp13 listening on /0.0.0.0:8009
    25/09/2009 12:33:37 org.apache.jk.server.JkMain start
    INFO: Jk running ID=0 time=0/125 config=null
    25/09/2009 12:33:37 org.apache.catalina.startup.Catalina start
    INFO: Server startup in 4829 ms

  7. Draven disse:

    Bom dia,

    Estou com problemas para executar a classe GerarTabelas.java.
    Será que poderia enviar o script do bd ?

    Obrigado !!!

  8. Otaner disse:

    Muito bom o exemplo Serjaum!

    Tenho apenas uma dúvida rápida!

    O que tenho que fazer para alterar seu exemplo no eclipse e surtir efeito minhas alterações. Eu faço várias alterações aqui, as vezes aparece o resultado as vezes não.

    Para executar estou indo em BOTÃO DIREITO DO MOUSE SOBRE O PROJETO -> RUN AS -> RUN ON SERVER -> SELECIONO O TOMCAT -> FINISH.

    Eu tenho que fazer um build em algum lugar para surtir efeito no Tomcat? Onde faço isso?

    No mais muito obrigado por seu blog, é de muita ajuda para quem está conhecendo richfaces, jsf, etc!

  9. juniorsatanas disse:

    Este site é otimo ! srjau valeu !

  10. juniorsatanas disse:

    Serjaummmmmmmmmm Tudo bom ?

    Estou usando teu crud para fazer um sistema da biblioteca daqui !

    //*************************************************//
    /* relacionamento 1 Pessoa para n Mensalidade
    *
    //*************************************************/
    @OneToMany(mappedBy=”pessoa”, fetch=FetchType.LAZY)
    @Cascade(org.hibernate.annotations.CascadeType.ALL)
    private List mensalidades = new ArrayList();

    public List getMensalidades() {
    return mensalidades;
    }

    public void setMensalidades(List mensalidades) {
    this.mensalidades = mensalidades;
    }

    *******************************************************

    //*************************************************//
    /* relacionamento n Mensalidade para 1 Pessoa
    *
    //*************************************************/
    @ManyToOne(cascade=javax.persistence.CascadeType.ALL)
    @JoinColumn(name=”idpessoa”, referencedColumnName = “idpessoa”)
    private Pessoa pessoa;

    public Pessoa getPessoa() {
    return pessoa;
    }

    public void setPessoa(Pessoa pessoa) {
    this.pessoa = pessoa;
    }

    Como fica o formulario em XHTML para fazer esse join ?

    Grande abraço !

  11. juniorsatanas disse:

    para gerar tabelas !

    package br.gov.nutec.util;

    import org.hibernate.cfg.AnnotationConfiguration;
    import org.hibernate.cfg.Configuration;
    import org.hibernate.tool.hbm2ddl.SchemaExport;

    public class GerarTabelas {
    public static void main(String[] args) {
    Configuration cfg = new AnnotationConfiguration();
    cfg.configure();

    SchemaExport se = new SchemaExport(cfg);
    se.create(true, true);
    }
    }

  12. Cara…
    meus parabenss!!
    mtoo bom material!

  13. Felipe disse:

    Cara todos os meus xhtml estão com erro, quais as configurações do eclipse necessárias?

    valew

  14. Felipe disse:

    Warning: unknown attribute “xmlns:rich”
    Warning: unknown attribute “xmlns:stella”
    Warning: unknown attribute “xmlns:a4j”
    Warning: unknown attribute “xmlns:f”
    Warning: unknown attribute “xmlns:h”
    Warning: unknown attribute “xmlns:ui”

    • serjaumfantin disse:

      Warning é diferente de Erro.

      No máximo você vai precisar configurar o build path adicionando uma JRE e adicionar um Web Server.

      Abraços…

  15. Emanuel Pereira disse:

    olá, fiz um exemplo com esse codigo fonte, mais quando registro o AuthFilter no xml o css não funciona mais, como resolvo?

    obrigado!!!

  16. Rodrigo disse:

    Cara, só tenho uma coisa pra dizer:
    PARABÉNS!

    Muito bom material, e muito boa a maneira simples que você encontrou de mostrar as potencialidades dessas tecnologias. Ficam aqui meus agradecimentos pela abertura de portas que seus artigos me deram para adotar essas fantásticas tecnologias para o dia-a-dia de minha empresa e para minha vida profissional.

    Obrigado mais uma vez!!!

    Rodrigo

  17. heybell disse:

    Parabéns por compartilhar o conhecimento!!!

    Preciso adicionar bibliotecas para este projeto?

  18. Hugo Doti disse:

    Olá Sérgio, estou tendo o seguinte problema, tenho na minha base cadastrados 2 Hugo um Hugo Doti e outro Hugo Daniel, quando pesquiso Hugo ele estoura o seguinte erro:
    Org.hibernate.NonUniqueResultException – Query did not return a unique result: 2

    Teria como me ajudar?

  19. Lima disse:

    Não consegui rodar: java.sql.SQLException – Access denied for user ‘root’@’localhost’ (using password: YES)

  20. Gmail disse:

    Se for Buscar pessoas que começam com o mesmo nome, exemplo: Maria … não funfa.

    public Pessoa pesquisaPessoaByNome(String nome) {
    		logger.info("pesquisaPessoaByNome : " + nome);
    		Criteria c = session.createCriteria(Pessoa.class);
    		c.add(Restrictions.ilike("nome", "%" + nome + "%"));
    
    		return (Pessoa)c.uniqueResult();
    	}
    
  21. Rodrigo disse:

    Achei muito interessante, uma pena não ter um tuto explicando melhor como fazer esse CRUD rodar, pois pra mim gerou muitos erros e a questao de
    ### Execute a classe br.com.serjaum.util.GerarTabelas.java. Essa classe criará as tabelas que foram mapeadas no arquivo hibernate.cfg.xml, no caso a classe Pessoa terá uma tabela correspondente com o nome de pessoa no nosso banco de dados.###

    ficou muito vaga, principalmente para novatos como eu


Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s