JPA 2.0 e Servlet 3.0 Elaine Silva Instrutora Globalcode Melissa Villela Instrutora Globalcode 1 Globalcode – Open4Education Agenda > > > > 2 Objetivo JPA 2.0 Servlet 3.0 Conclusões Globalcode – Open4Education Agenda > > > > 3 Objetivo JPA 2.0 Servlet 3.0 Conclusões Globalcode – Open4Education Objetivo > Mostrar os principais avanços das APIs de JPA e Servlet para JavaEE 6 > Obs. Ainda está em fase de definição, então as coisas podem mudar e a boa notícia é que a comunidade tem tempo para sugerir alterações 4 Globalcode – Open4Education Agenda > > > > 5 Objetivo JPA 2.0 Servlet 3.0 Conclusões Globalcode – Open4Education JPA 2.0 > Java Persistence API > API para persistência de objetos Java em bases de dados relacionais usando ORM (Object/Relational Mapping) > JPA 1.0 faz parte da especificação EJB 3.0 (JSR 220) > Especificação concluída em Maio de 2006 > Baseada no uso de POJO, no lugar de EJB Entity > Pode ser usado em aplicacões construídas com JavaSE e JavaEE 6 Globalcode – Open4Education JPA 2.0 > Java Persistence API 2.0 > > > > > Especificação iniciada em Julho de 2007 Draft publicado em Junho de 2008 Agora independente de EJB - JSR 317 22 membros no Expert Group Spec Lider: Linda DeMichiel > Objetivo Solidificar o padrão de persistência 7 Globalcode – Open4Education JPA 2.0 > Alterações planejadas: > Maior flexibilidade para a modelagem e expansão dos recursos de mapeamento de objetos 8 Globalcode – Open4Education JPA 2.0 > Alterações planejadas: > Maior flexibilidade para a modelagem e expansão dos recursos de mapeamento de objetos > Melhoria nas APIs 9 Globalcode – Open4Education JPA 2.0 > Alterações planejadas: > Maior flexibilidade para a modelagem e expansão dos recursos de mapeamento de objetos > Melhoria nas APIs > Adições de recursos na Java Persistence Query Language 10 Globalcode – Open4Education JPA 2.0 > Alterações planejadas: > Maior flexibilidade para a modelagem e expansão dos recursos de mapeamento de objetos > Melhoria nas APIs > Adições de recursos na Java Persistence Query Language > API para Criteria 11 Globalcode – Open4Education JPA 2.0 > Alterações planejadas: > Maior flexibilidade para a modelagem e expansão dos recursos de mapeamento de objetos > Melhoria nas APIs > Adições de recursos na Java Persistence Query Language > API para Criteria > Melhor controle sobre entidades detached 12 Globalcode – Open4Education JPA 2.0 > Alterações planejadas: > Maior flexibilidade para a modelagem e expansão dos recursos de mapeamento de objetos > Melhoria nas APIs > Adições de recursos na Java Persistence Query Language > API para Criteria > Melhor controle sobre entidades detached > Suporte para validação 13 Globalcode – Open4Education JPA 2.0 > Alterações planejadas: > Maior flexibilidade para a modelagem e expansão dos recursos de mapeamento de objetos > Melhoria nas APIs > Adições de recursos na Java Persistence Query Language > API para Criteria > Melhor controle sobre entidades detached > Suporte para validação 14 Globalcode – Open4Education Coleções de tipos básicos > Anotação para representar coleções de tipos básicos > @ElementCollection > Dados são gravados em uma “tabela da coleção” > @CollectionTable > Permite especificar o nome da “tabela de coleção” a ser utilizada 15 Globalcode – Open4Education Coleções de tipos básicos > Na classe Java @Entity @Entity @Table(name=“pessoas”) @Table(name=“pessoas”) public public class class Pessoa Pessoa {{ @Id @Id protected protected long long codigo; codigo; protected protected String String nome; nome; protected protected int int idade; idade; ... ... @ElementCollection @ElementCollection @CollectionTable(name=“apelidos”) @CollectionTable(name=“apelidos”) @Column(name=“apelido”) @Column(name=“apelido”) protected protected Set<String> Set<String> apelidos; apelidos; ... ... }} 16 Globalcode – Open4Education Coleções de tipos básicos > No banco de dados pessoas codigo (pk) nome idade 17 apelidos pessoa_codigo (fk) apelido Globalcode – Open4Education Listas ordenadas > A ordem pode ser persistente ou não > Ordem não persistente @Entity @Entity public public class class Curso Curso {{ ... ... @ManyToMany @ManyToMany @OrderBy(“nome”) @OrderBy(“nome”) List<Estudante> List<Estudante> estudantes; estudantes; ... ... }} 18 Globalcode – Open4Education Listas ordenadas > Ordem persistente (na classe Java) @Entity @Entity @Table(name=“cursos”) @Table(name=“cursos”) public public class class Curso Curso {{ @Id @Id private private long long id; id; ... ... @ManyToMany @ManyToMany @OrderColumn(name=”posicao_espera”) @OrderColumn(name=”posicao_espera”) @JoinTable(name=”espera” @JoinTable(name=”espera” joinColumns=@JoinColumn(name=“curso_id”), joinColumns=@JoinColumn(name=“curso_id”), inverseJoinColumns=@JoinColumn(name=“estudante_id”)) inverseJoinColumns=@JoinColumn(name=“estudante_id”)) List<Estudante> List<Estudante> listaEspera; listaEspera; ... ... }} 19 Globalcode – Open4Education Listas ordenadas > Ordem persistente (no banco de dados) cursos estudantes id (pk) …. id (pk) ….. espera curso_id (fk) estudante_id (fk) posicao_espera 20 Globalcode – Open4Education Classes embeddable > Classes que não representam entidades > Dependem de alguma entidade, mas precisam ter seus dados persistidos > Suporte está sendo melhorado no JPA 2.0 @Embeddable @Embeddable public public class class Endereco Endereco {{ private private String String rua; rua; private private int int numero; numero; private private String String cidade; cidade; private private String String uf; uf; }} 21 Globalcode – Open4Education Classes embeddable > Uso atual de classe embeddable @Entity @Entity @Table(name=“pessoas”) @Table(name=“pessoas”) public public class class Pessoa Pessoa {{ @Id @Id private private long long id; id; private private String String nome; nome; @Embedded @Embedded private private Endereco Endereco endereco; endereco; }} 22 pessoas id (pk) nome rua numero cidade uf Globalcode – Open4Education Classes embeddable > Uso de classe embeddable no JPA 2.0 @Entity @Entity public public class class Pessoa Pessoa {{ @ElementCollection @ElementCollection @AttributeOverride(name=”rua”, @AttributeOverride(name=”rua”, column=@Column(name=”nome_rua”)) column=@Column(name=”nome_rua”)) protected protected Set<Endereco> Set<Endereco> enderecos; enderecos; ... ... }} > Na base de dados pessoa_enderecos pessoas id (pk) nome … 23 pessoa_id (fk) nome_rua numero cidade uf Globalcode – Open4Education Configurações de ORM > OneToMany unidirecional com mapeamento por chave estrangeira > Hibernate já suporta esse modelo de mapeamento > JPA 1.0 suporta apenas tabela de junção 24 Globalcode – Open4Education Configurações de ORM > Nas classes Java @Entity @Entity @Table(name=“objetivos”) @Table(name=“objetivos”) public public class class Objetivo Objetivo {{ @Id @Id private private long long id; id; private private String String titulo; titulo; private private String String texto; texto; ... ... }} 25 @Entity @Entity @Table(name=“cursos”) @Table(name=“cursos”) public public class class Curso Curso {{ @Id @Id private private long long id; id; private private String String nome; nome; ... ... @OneToMany @OneToMany @JoinColumn(name=“curso_id”) @JoinColumn(name=“curso_id”) Set<Objetivo> Set<Objetivo> objetivos; objetivos; }} Globalcode – Open4Education Configurações de ORM > No banco de dados cursos id (pk) nome …. 26 objetivos id (pk) titulo texto curso_id (fk) Globalcode – Open4Education Configurações de ORM > Exclusão automática de objeto órfão para relacionamentos oneToOne e oneToMany @Entity @Entity public public class class Carrinho Carrinho {{ @Id @Id private private long long id; id; ... ... @OneToMany(cascade=PERSIST, @OneToMany(cascade=PERSIST, orphanRemoval=true) orphanRemoval=true) Set<Item> Set<Item> items; items; }} 27 Globalcode – Open4Education Melhoria nas APIs > Interface EntityManager void clear(Object entity) Map getProperties() Set<String> getSupportedProperties() EntityManagerFactory getEntityManagerFactory() 28 Globalcode – Open4Education Melhoria nas APIs > Interface Query Query setMaxResults(int x) Map getNamedParameters() Query setLockMode(LockMode m) Map getHints() Set<String>getSupportedHints() setFirtsResult(int startPosition) 29 Globalcode – Open4Education Melhoria nas APIs > Second-level cache > Recurso de cache para entidades persistentes > Responsabilidade dos providers de JPA > Política de cache, habilitação e configuração de cache > JPA 2.0: API para funcionalidades básicas de Cache boolean contains(Class c, Object primaryKey) void evict(Class c, Object primaryKey) void evict(Class c) void evictAll() 30 Globalcode – Open4Education Em aberto > Características em discussão > > > > Java Persistence Query Language API Criteria Melhor controle sobre entidades detached Suporte à validação > JSR 303 – Bean Validation 31 Globalcode – Open4Education Agenda > > > > 32 Objetivo JPA 2.0 Servlet 3.0 Conclusões Globalcode – Open4Education Servlet 3.0 > Java Servlet 3.0 API – JSR 315 > Especificação iniciada em Junho de 2007 > Cerca de 20 especialistas, entre eles desenvolvedores de containers web e autores de frameworks. > Spec Lider: Rajiv Mordani > Principais objetivos desta JSR: > > > > 33 Pluggability Facilitar o desenvolvimento Suporte a Servlet assíncrono Melhorias nos aspectos de segurança Globalcode – Open4Education Pluggability > Cenário atual ao usar um framework muitas vezes é necessário fazer adaptações no web.xml: > Definir servlets > Definir filtros > Definir listeners > Estas adaptações podem tornar complexo a manutenção do web.xml 34 Globalcode – Open4Education Pluggability > O ideal é que cada framework já tenha suas configurações definidas > No novo cenário JavaEE 6: > Possibilidade de utilização de frameworks e bibliotecas sem configurações adicionais > Modularização do web.xml 35 Globalcode – Open4Education Pluggability > Modularização do web.xml > Cada framework poderá definir seu próprio web.xml e inclui-lo no diretório META-INF do arquivo jar > O Container será responsável por descobrir os fragmentos que estão dentro dos jars vinculados a aplicação > Criação de um novo elemento no web.xml webfragment que contém os sub-elementos servlets, filters and listeners 36 Globalcode – Open4Education Pluggability > Modelo de fragmento do web.xml <web-fragment> <web-fragment> <servlet> <servlet> <servlet-name>welcome</servlet<servlet-name>welcome</servletname> name> <servlet-class> <servlet-class> WelcomeServlet WelcomeServlet </servlet-class> </servlet-class> </servlet> </servlet> <servlet-mapping> <servlet-mapping> <servlet-name>welcome</servlet<servlet-name>welcome</servletname> name> <url-pattern>/Welcome</url<url-pattern>/Welcome</urlpattern> pattern> </servlet-mapping> </servlet-mapping> </web-fragment> </web-fragment> 37 Globalcode – Open4Education Facilitar o desenvolvimento > Permitir que as APIs de Servlet utilizem os novos recursos da linguagem > Uso de anotações > Uso de generics, para diminuir os erros de runtime > Arquivo web.xml opcional 38 Globalcode – Open4Education Facilitar o desenvolvimento > Definição de um servlet utilizando a anotação @Servlet > Precisa especificar o url-mapping > As demais tags são opcionais, por exemplo o nome completamente qualificado da classe > Qualquer método poderá ser usado com as anotações @GET, @PUT, @POST, @DELETE, @HEAD > O web.xml pode ser utilizado para sobrescrever valores anotados 39 Globalcode – Open4Education Facilitar o desenvolvimento > Atualmente Classe Java package package br.com.globalcode.servlets; br.com.globalcode.servlets; import import …… public public class class ServletTradicional ServletTradicional extends extends HttpServlet HttpServlet {{ protected protected void void doGet(HttpServletRequest doGet(HttpServletRequest request, request, HttpServletResponse HttpServletResponse response){...} response){...} }} <servlet> <servlet> <servlet-name>ServletTradicional</servlet-name> <servlet-name>ServletTradicional</servlet-name> <servlet-class> <servlet-class> br.com.globalcode.servlets.ServletTradicional br.com.globalcode.servlets.ServletTradicional </servlet-class> </servlet-class> </servlet> </servlet> <servlet-mapping> <servlet-mapping> <servlet-name>ServletTradicional</servlet-name> <servlet-name>ServletTradicional</servlet-name> <url-pattern>/ServletTradicional</url-pattern> <url-pattern>/ServletTradicional</url-pattern> </servlet-mapping> </servlet-mapping> 40 web.xml Globalcode – Open4Education Facilitar o desenvolvimento > Futuro Classe Java package package br.com.globalcode.servlets; br.com.globalcode.servlets; import import …… @Servlet(urlMapping={“/ServletTradicional”}) @Servlet(urlMapping={“/ServletTradicional”}) public public class class ServletTradicional ServletTradicional {{ @GET @GET public public void void qualquerMetodo( qualquerMetodo( HttpServletRequest HttpServletRequest request, request, HttpServletResponse HttpServletResponse response) response) {{ ... ... }} }} 41 Globalcode – Open4Education Facilitar o desenvolvimento > Atualmente package package br.com.globalcode.filters; br.com.globalcode.filters; import import ... ... public public class class FiltroParaLog FiltroParaLog implements implements Filter Filter {{ public public void void doFilter(ServletRequest doFilter(ServletRequest request, request, ServletResponse ServletResponse response, response, FilterChain FilterChain chain) chain) {{ ... ... }} // // outros outros métodos métodos do do filtro filtro }} Classe Java <filter> <filter> <filter-name>FiltroParaLog</filter-name> <filter-name>FiltroParaLog</filter-name> <filter-class> <filter-class> br.com.globalcode.filters.FiltroParaLog br.com.globalcode.filters.FiltroParaLog </filter-class> </filter-class> </filter> </filter> <filter-mapping> <filter-mapping> <filter-name>FiltroParaLog</filter-name> <filter-name>FiltroParaLog</filter-name> <url-pattern>/FiltroParaLog</url-pattern> <url-pattern>/FiltroParaLog</url-pattern> </filter-mapping> </filter-mapping> 42 web.xml Globalcode – Open4Education Facilitar o desenvolvimento > Futuro Classe Java package package br.com.globalcode.filters; br.com.globalcode.filters; import import ... ... @ServletFilter @ServletFilter @FilterMapping(urlPattern=“/FiltroParaLog”) @FilterMapping(urlPattern=“/FiltroParaLog”) public public class class FiltroParaLog FiltroParaLog {{ public public void void doFilter( doFilter( HTTPServletRequest HTTPServletRequest request, request, HTTPServletResponse HTTPServletResponse response){ response){ ... ... }} }} 43 Globalcode – Open4Education Facilitar o desenvolvimento > Atualmente package package br.com.globalcode.listeners; br.com.globalcode.listeners; import import ... ... public public class class ListenerDeContexto ListenerDeContexto implements implements ServletContextListener ServletContextListener {{ public public void void contextInitialized( contextInitialized( ServletContextEvent ServletContextEvent e) e) {{ ... ... }} // // outros outros métodos métodos do do listener listener }} Classe Java web.xml <listener> <listener> <listener-class> <listener-class> br.com.globalcode.listeners.ListenerDeContexto br.com.globalcode.listeners.ListenerDeContexto </listener-class> </listener-class> </listener> </listener> 44 Globalcode – Open4Education Facilitar o desenvolvimento > Futuro package package br.com.globalcode.listeners; br.com.globalcode.listeners; import import ... ... @ServletContextListener @ServletContextListener public public class class ListenerDeContexto ListenerDeContexto {{ public public void void contextInitialized( contextInitialized( ServletContextEvent ServletContextEvent e) e) {{ ... ... }} // // outros outros métodos métodos do do listener listener }} Classe Java 45 Globalcode – Open4Education Suporte a Servlet assíncrono > Adição de novas APIs para habilitar o desenvolvimento com o estilo de programação Comet > Contar com uma conexão persistente entre o servidor e o cliente > Streaming – o browser abre uma conexão persistente como servidor, e este browser será responsável por interpretar os eventos Comet recebidos do servidor > Long polling - é aberto uma nova requisição a cada evento (ou a cada conjunto de eventos) 46 Globalcode – Open4Education Suporte a Servlet assíncrono > Inclusão de novos métodos em ServletRequest para que as requisições sejam suspensas, renovadas ou tenham um timed-out pré-definido > Criação de ServletRequestListener 47 Globalcode – Open4Education Segurança > Ainda em discussão pelo expert group > Adição de métodos para fazer login e logout em > HTTPServletRequest > HTTPServletRequestWrapper > HTTPSession (logout) 48 Globalcode – Open4Education Em aberto > Características ainda em discussão > > > > 49 File upload Parâmetros de inicialização para o container Definição final dos itens vistos Solicitações do JSF 2.0 Globalcode – Open4Education Agenda > > > > 50 Objetivo JPA 2.0 Servlet 3.0 Conclusões Globalcode – Open4Education Conclusão: JPA 2.0 > Documento atual “Early Draft Review” > Flexibilidade da modelagem, melhoria no mapeamento ORM e nas APIs > Próxima revisão deve ser focada na JPA Query Language > Contribuições são bem-vindas > [email protected] > Implementação de referência > EclipseLink > Será disponibilizada juntamente com o projeto GlassFish V3 51 Globalcode – Open4Education Conclusão: Servlet 3.0 > Documento atual “Early Draft Review” > > > > > Pluggability para os frameworks Facilidade no desenvolvimento Suporte ao estilo de programação Comet Melhorias nos aspectos de segurança (login e logout) Contribuições são bem-vindas > [email protected] > Implementação de referência > Será disponibilizada juntamente com o projeto GlassFish V3 52 Globalcode – Open4Education Perguntas? JPA 2.0 e Servlet 3.0 53 Globalcode – Open4Education