Desenvolvimento Web com Java Sérgio Lopes Caelum - http://www.caelum.com.br [email protected] Sérgio Lopes ● ● ● ● ● ● ● Desenvolvedor Java desde 2002 Instrutor de Java pela Caelum Trabalho com Web e Celulares Certificado SCJP Colaborador da Revista Mundo Java Moderador do GUJ Bacharelando na USP A Palestra ● Bancos de Dados com Hibernate – ● Web simplificada com Vraptor – ● adicionar, listar, remover, editar sem SQL! web sem servlets, requests, struts JSP + JSTL + EL – elegância no código html O que vamos fazer? ● ● Algum projeto de cadastro? Sugestões: – – – Contatos Produtos Contas bancárias Banco de Dados ● Geralmente escreve-se muito SQL – – ● é chato e repetitivo é dependente de banco de dados Abordagem relacional dos dados – dor de cabeça quando trabalhamos OO Hibernate ● Framework para persistência de dados – – – ● ● Simples Eficiente Mágico Nunca mais vamos escrever SQL! ORM: Object Relational Mapping – trabalhar orientado a objetos As classes de modelo Classes simples para modelar as entidades do sistema: ● public class Modelo { } As classes de modelo Vamos adicionar alguns atributos e gerar gets e sets: ● public class Modelo { private String atributo; // vários atributos... public String getAtributo() { return this.atributo; } public void setAtributo(String a) { this.atributo = a; } } As classes de modelo Precisamos de um id para chave primária: ● public class Modelo { private Integer id; private String atributo; // vários atributos... // vários gets e sets } As classes de modelo Vamos hibernetar a classe adicionando algumas anotações: ● @Entity public class Modelo { @Id @GeneratedValue private Integer id; private String atributo; // vários atributos... // vários gets e sets } Relacionamentos ● Um segundo modelo, para ter relacionamento: @Entity public class Modelo { @Id @GeneratedValue private Integer id; private String atributo; @ManyToOne private OutroModelo outroModelo; // gets e sets } Relacionamentos ● Um segundo modelo, para ter relacionamento: @Entity public class OutroModelo { @Id @GeneratedValue private Integer id; private String atributo; // gets e sets } As tabelas ● O Hibernate vai gerar as tabelas pra gente! – nunca mais vou escrever SQL // configura o Hibernate AnnotationConfiguration conf = new AnnotationConfiguration(); conf.configure(); // gera as tabelas new SchemaExport(conf).create(true, true); Conectar no Banco de Dados ● ● ● Configuramos o Hibernate Criamos uma fábrica de sessões Abrimos uma sessão // configura o Hibernate AnnotationConfiguration conf = new AnnotationConfiguration(); conf.configure(); // cria sessões SessionFactory factory = conf.buildSessionFactory(); Session session = factory.getSession(); Adicionar no Banco de Dados ● INSERT INTO bla bla bla? Não! Modelo m = new Modelo(); m.setAtributo(“Alguma coisa”); session.save(m); Adicionar com relacionamentos ● INSERT bla bla bla? Não! Modelo m = new Modelo(); m.setAtributo(“Alguma coisa”); OutroModelo o = new OutroModelo(); o.setId(1); m.setOutroModelo(o); session.save(m); Listar o Banco de Dados ● SELECT * FROM bla bla bla? Não! List<Modelo> lista = session.createCriteria(Modelo.class).list(); for (Modelo m : lista) { System.out.println(m.getAtributo() + “, “ + m.getOutroModelo().getAtributo()); } Refatorando um pouco ● Vamos deixar nossa classe de listagem um pouco mais elegante: – – – Configurar o hibernate no construtor Um método para listar Utilizar atributos Refatorando um pouco public class ModeloLogic { private Session session; private List<Modelo> modelos; public ModeloLogic() { AnnotationConfiguration conf = new AnnotationConfiguration(); conf.configure(); SessionFactory factory = conf.buildSessionFactory(); session = factory.getSession(); } public void lista() { modelos = session.createCriteria(Modelo.class).list(); for (Modelo m : modelos) System.out.println(m.getAtributo()); } public static void main(String[] args) { new ModeloLogic().lista(); } } Que tal listarmos na Web? ● ● Tiramos o main e o System.out.println Adicionamos algumas anotações @Component(“modelo”) public class ModeloLogic { private Session session; @Out private List<Modelo> modelos; public ModeloLogic() { AnnotationConfiguration conf = new AnnotationConfiguration(); conf.configure(); SessionFactory factory = conf.buildSessionFactory(); session = factory.getSession(); } public void lista() { modelos = session.createCriteria(Modelo.class).list(); } } Como exibir os dados? ● ● Vamos usar JSP para exibir os dados Usamos JSTL e EL para percorrer a listagem <h2>Listar modelos</h2> <c:forEach items=”${modelos}” var=”modelo”> <li>${modelo.atributo}, ${modelo.outroModelo.atributo}</li> </c:forEach> VRaptor ● ● ● ● Framework para trabalhar com Web Auxilia o desenvovimento Web Desatrelado de Servlets, Request, Response etc Lógica de negócios em classes Java elegantes Adicionar na Web ● Um formulário de cadastro <h2>Adicionar modelos</h2> <form action=”modelo.adiciona.logic” method=”post”> Atributo: <input type=”text” name=”modelo.atributo” /> <input type=”submit”/> </form> Adicionar na Web ● Pegar os dados enviados e adicionar no banco – – atributo para ler os parâmetros método adiciona na ModeloLogic public class ModeloLogic { @Parameter public Modelo modelo = new Modelo(); public void adiciona() { this.session.save(this.modelo); } } Adicionar na Web ● Por último, uma página com uma mensagem de confirmação: – qual nome? modelo/adiciona.ok.jsp <h2>Parabéns!</h2> <b>Seu modelo foi inserido com sucesso!</b> E com relacionamento? ● Mais um campo no nosso form de cadastro: <h2>Adicionar modelos</h2> <form action=”modelo.adiciona.logic” method=”post”> Atributo: <input type=”text” name=”modelo.atributo” /> OutroModelo: <input type=”text” name=”modelo.outroModelo.id” /> <input type=”submit”/> </form> Conclusão ● O Hibernate facilita muito o acesso a banco de dados – ● O VRaptor facilita muito desenvolver as lógicas de negócio – ● http://www.hibernate.org http://www.vraptor.com.br JSP com tags JSTL facilitam muito o design das páginas html Muito Obrigado! [email protected] Material disponível depois em http://blog.caelum.com.br