Desde quando decidi fazer o meu TCC em Java em vez de PHP e ASP.NET, linguagens que tenho mais domínio, enfrentei algumas adaptações, ou seja, cada linguagem impõe uma determinada maneira para se fazer algo, até que é parecido em alguns pontos, mas a mudança é inquestionável. Vejo que existe uma galera ai com dúvidas de como criar um projeto com VRaptor e Hibernate para realizar o famoso CRUD, portanto vou colocar aqui o básico do básico para fazer isso.
Como pré-requisito precisamos de um projeto Maven (caso tenha dúvida de como criar um, sugiro ler isso) com as seguintes dependências no pom.xml:
Também precisamos do MySQL, do MySQL Workbench para manipularmos o banco (pode ser qualquer outra ferramenta) e do servlet container Apache Tomcat (por isso coloquei como compile o JSTL). Conforme visto nas dependências, temos o básico para usar o Hibernate: suporte do VRaptor para integrar, o core do framework mais o driver do nosso banco ao qual o Hibernate utilizará para lê-lo.
Na atual versão do VRaptor (3.5.0) o suporte ao Hibernate e ao JPA foram migrados para projetos externos, nesse tutorial usaremos o hibernate.cfg.xml, por isso utilizaremos só vraptor-hibernate. Caso quiséssemos usar o persistence.xml, teríamos que colocar uma dependência do vraptor-jpa. Um outro ponto importante é que poderíamos usar o Hibernate 4 pois já existe um suporte do VRaptor para isso.
Para essa postagem, criei um projeto testcrud conforme a figura:
E inseri as dependências no pom.xml (literalmente CTRL C e V do que postei). Para o nosso exemplo, precisamos criar uma estrutura conforme a figura:
A classe UsersController tem o seguinte conteúdo:
Fazendo uma análise rápida, receberemos na construtora da nossa controller, por injeção de dependência, o UserDao e o Result. Para tanto, como veremos a frente, a classe UserDao será marcada com @Component (mais detalhes aqui), mas para o Result não será necessário. Iremos utilizar os seguintes métodos HTTP para a realização do CRUD: POST, GET e PUT (detalhes aqui). As mensagens parametrizadas com o método result.include() serão acessadas através do JSTL nas views.
A classe User tem o seguinte conteúdo:
Para entendimento das anotações utilizadas, sugiro esse tutorial. Lembrando rapidamente um conceito básico, não coloquei @Column nos atributos pois para essa postagem não coloquei um nível de detalhamento maior para cada coluna como, por exemplo, uma restrição. Omitindo essa anotações o Hibernate já entenderá que os atributos são colunas, contudo a única coluna obrigatória que eu tenho que sinalizar é o que representa o atributo identificador.
A classe UserDao tem o seguinte conteúdo:
Essa classe recebe, por injeção de dependência, uma Session do Hibernate, ele encapsula uma conexão para nos comunicarmos com o banco de dados por meio desse objeto para, então, podermos fazer o que queremos (CRUD). Para entender o uso do Criteria API sugiro essa postagem e essa também.
Legal! Como visto no nosso UsersController, precisaremos disponibilizar algumas JSPs por causa dos métodos públicos (tire dúvidas aqui). Para o nosso caso, criaremos o list.jsp e view.jsp. Olhe a estrutura na figura:
O arquivo list.jsp tem o seguinte contéudo:
No nosso UsersController temos um método anotado com @Path("/"), ele retorna uma lista de usuários do banco. Para ler o conteúdo da lista de usuários usaremos o JSTL junto com Expression Language. O dois primeiros hiperlinks dentro do forEach referenciam a view.jsp (com o detalhemento do usuário e sua respectiva edição) e o terceiro sua exclusão. Dependendo da tarefa, apresentaremos uma mensagem (linha 31 à 35). O formulário de cadastro é bem básico, a ação do form encaminha para um método do UsersController e temos um input com o name user.name para que o VRaptor possa instanciar a classe User e, através do método setName() dessa classe, preencher o atributo do objeto.
O arquivo view.jsp tem o seguinte conteúdo:
Esse JSP apenas mostra o nome do usuário e apresenta a possibilidade de alterar o nome dele. Repare que tem um input com o name _method e o value put para podermos utilizar a anotação @Put do VRaptor.
Bom, já temos o básico do básico para realizar o CRUD. Vamos agorar criar o banco de dados e a tabela User:
Já fiz a inserção de dois registros só para efeito de teste para a listagem. Observação: poderíamos ter criado a tabela automaticamente pelo Hibernate conforme mostrado nesse tutorial.
Por fim, só falta o hibernate.cfg.xml. Coloque dentro da source folder src/main/resources e deixe da seguinte maneira:
Pronto, agora é só testar:
Aqlbras!
Como pré-requisito precisamos de um projeto Maven (caso tenha dúvida de como criar um, sugiro ler isso) com as seguintes dependências no pom.xml:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | < dependency > < groupid >br.com.caelum.vraptor</ groupid > < artifactid >vraptor-hibernate</ artifactid > < version >1.0.0</ version > < scope >compile</ scope > </ dependency > < dependency > < groupid >org.hibernate</ groupid > < artifactid >hibernate-core</ artifactid > < version >3.6.6.Final</ version > < scope >compile</ scope > < optional >true</ optional > </ dependency > < dependency > < groupid >mysql</ groupid > < artifactid >mysql-connector-java</ artifactid > < version >5.1.24</ version > </ dependency > < dependency > < groupid >javax.servlet</ groupid > < artifactid >jstl</ artifactid > < version >1.2</ version > < scope >compile</ scope > </ dependency > |
Na atual versão do VRaptor (3.5.0) o suporte ao Hibernate e ao JPA foram migrados para projetos externos, nesse tutorial usaremos o hibernate.cfg.xml, por isso utilizaremos só vraptor-hibernate. Caso quiséssemos usar o persistence.xml, teríamos que colocar uma dependência do vraptor-jpa. Um outro ponto importante é que poderíamos usar o Hibernate 4 pois já existe um suporte do VRaptor para isso.
Para essa postagem, criei um projeto testcrud conforme a figura:
E inseri as dependências no pom.xml (literalmente CTRL C e V do que postei). Para o nosso exemplo, precisamos criar uma estrutura conforme a figura:
A classe UsersController tem o seguinte conteúdo:
Fazendo uma análise rápida, receberemos na construtora da nossa controller, por injeção de dependência, o UserDao e o Result. Para tanto, como veremos a frente, a classe UserDao será marcada com @Component (mais detalhes aqui), mas para o Result não será necessário. Iremos utilizar os seguintes métodos HTTP para a realização do CRUD: POST, GET e PUT (detalhes aqui). As mensagens parametrizadas com o método result.include() serão acessadas através do JSTL nas views.
A classe User tem o seguinte conteúdo:
Para entendimento das anotações utilizadas, sugiro esse tutorial. Lembrando rapidamente um conceito básico, não coloquei @Column nos atributos pois para essa postagem não coloquei um nível de detalhamento maior para cada coluna como, por exemplo, uma restrição. Omitindo essa anotações o Hibernate já entenderá que os atributos são colunas, contudo a única coluna obrigatória que eu tenho que sinalizar é o que representa o atributo identificador.
A classe UserDao tem o seguinte conteúdo:
Essa classe recebe, por injeção de dependência, uma Session do Hibernate, ele encapsula uma conexão para nos comunicarmos com o banco de dados por meio desse objeto para, então, podermos fazer o que queremos (CRUD). Para entender o uso do Criteria API sugiro essa postagem e essa também.
Legal! Como visto no nosso UsersController, precisaremos disponibilizar algumas JSPs por causa dos métodos públicos (tire dúvidas aqui). Para o nosso caso, criaremos o list.jsp e view.jsp. Olhe a estrutura na figura:
O arquivo list.jsp tem o seguinte contéudo:
No nosso UsersController temos um método anotado com @Path("/"), ele retorna uma lista de usuários do banco. Para ler o conteúdo da lista de usuários usaremos o JSTL junto com Expression Language. O dois primeiros hiperlinks dentro do forEach referenciam a view.jsp (com o detalhemento do usuário e sua respectiva edição) e o terceiro sua exclusão. Dependendo da tarefa, apresentaremos uma mensagem (linha 31 à 35). O formulário de cadastro é bem básico, a ação do form encaminha para um método do UsersController e temos um input com o name user.name para que o VRaptor possa instanciar a classe User e, através do método setName() dessa classe, preencher o atributo do objeto.
O arquivo view.jsp tem o seguinte conteúdo:
Esse JSP apenas mostra o nome do usuário e apresenta a possibilidade de alterar o nome dele. Repare que tem um input com o name _method e o value put para podermos utilizar a anotação @Put do VRaptor.
Bom, já temos o básico do básico para realizar o CRUD. Vamos agorar criar o banco de dados e a tabela User:
Já fiz a inserção de dois registros só para efeito de teste para a listagem. Observação: poderíamos ter criado a tabela automaticamente pelo Hibernate conforme mostrado nesse tutorial.
Por fim, só falta o hibernate.cfg.xml. Coloque dentro da source folder src/main/resources e deixe da seguinte maneira:
Pronto, agora é só testar:
Aqlbras!
Show, Valeu pelas dicas !!
ResponderExcluirMuito bom !!!
ResponderExcluircomo uso o banco do postgresql em seu exemplo?
ResponderExcluirSó alterar o hibernate.cfg.xml e a dependência do driver do banco de dados, em vez de usar do MySQL, conforme nesse tutorial, altere para um do PostgreSQL:
Excluirhttp://mvnrepository.com/artifact/postgresql/postgresql/9.1-901.jdbc4
Aqlbras!
Cara, eu segui seu tutorial completo, usei até os mesmos nomes de variáveis, tudo igual, porém, não deu certo. O programa não tem 1 erro, sequer 1 warning, mas na hora que eu coloco pra rodar ele mostra a página de "Hello World" padrão, como se o vraptor não estivesse funcionando. Qual o problema? Fiz algo errado? '-' fiz exatamente igual. :|
ResponderExcluirRbpessoa, se não tem erro e nem warning, é por que o log não subiu corretamente. O JAR log4j está no classpath assim como o log4j.xml? Configure ele para lançar no contexto ROOT logs no nível INFO ou DEBUG.
ExcluirO Hello World é do arquivo index.html contido na raiz do seu projeto web, delete-o pois é desnecessário.
Aqlbras!