Java EE 6: A Community Update Reza Rahman Autor, EJB 3 in Action Expert Group Member, Java EE 6 e EJB 3.1 Fundador, Cognicellence Julho de 2008 Globalcode – Open4Education Java EE 6: Expandindo Horizontes >Java EE 5 > Facilidade de uso, annotations, liberdade do XML, expansão da API > EJB 3.0, JPA 1.0, JSF 1.0, JAX-WS 2.0 > A queda dos EJB 2.x Entity Beans > Java EE 6 > Podando: Uma maturidade saudável > Profiles: Um tamanho não serve para tudo > Estensibilidade: Facilitando para soluções não padronizadas > Inovação: Novas APIs, novas features, mais facilidade de uso > WebBeans, JSF 2.0, EJB 3.1, JPA 2.0, Bean Validation, Servlet 3.0, JAXRS > Participação do SpringSource em alguns grupos JSR, incluindo Java EE 6 (JSR 317), do qual Rod Johnson é um membro Globalcode – Open4Education Podando > Um primeiro passo importante no ciclo de vida de um plataforma madura > A meta é “deprecar” APIs que estão obsoletas ou que sofreram substituição > Candidatos à poda: > JAX-RPC: Substituída pela popular API JAX-WS > EJB 2.x Entity Beans CMP: Descartada em favor da JPA > APIs serão consideradas opcionais, e posteriormente removidas > Grandes fornecedores podem escolher manter APIs deprecadas por algum tempo Globalcode – Open4Education Profiles > Sub-conjuntos específicos das APIs Java EE direcionados para ambientes específicos > Cada Profile é completamente integrado, simplesmente funciona, sem customizações, embora integração com recursos adicionais seja possível > Facilita a criação de servidores de aplicação modulares e lightweight compatíveis com Java EE > Apenas um Profile, o “Web Profile” foi inicialmente planejado > Porém, já existe amplo suporte a dois Profiles direcionados para desenvolvimento web, um “minimal” e um “intermediate” > É necessário seu feedback sobre como estes profiles deveriam ser ! Globalcode – Open4Education Profiles Sugeridos API Minimal Profile Intermediate Profile Full Profile Servlet 3.0 JSP 2.2 JSTL 1.2 EL 1.2 JSF 2.0 WebBeans 1.0 EJB 3.1 JPA 2.0 JTA 1.1 JMS 1.1 JavaMail 1.4 JAX-WS 2.2 JAX-RS 1.0 JAXR 1.0 JAXB 2.2 JCA 1.6 Globalcode – Open4Education Extensibility > Se encontra em um estágio muito preliminar > Extensibility e Profiles funcionam integrados > Profiles, particularmente o Web Profile, tornam possível estender a plataforma pela integração de APIs não padronizadas sem um risco sério de perda de compatibilidade, ou de fragmentação > Injeção de dependência transparente e anexação de interceptadores, ajustadas com fornecedores terceiros, podem facilitar a integração de tecnologias não padronizadas sem complicar para os desenvolvedores > Pode ser implementada de forma tão simples quanto acrescentar um JAR e aplicar annotations em classes/interfaces > APIs de provedores de serviços Java EE (SPIs) são um mecanismo de extensão existente, que pode ser impulsionado também > É necessário seu feedback sobre como Java EE Extensibility deveria ser ! Globalcode – Open4Education Exemplo de Java EE Extensibility @Stateless public class PlaceBidBean implements PlaceBid { @SqlMapClientBuilder(configuration=“sql-map-config.xml”) private SqlMapClient sqlMapClient; public void placeBid(Bid bid) { sqlMapClient.insert("insertBid", bid); } } @Local public interface PlaceBid { public void placeBid (Bid bid); } Globalcode – Open4Education Maiores Mudanças na API Java EE 6 > WebBeans 1.0 > Integração JSF/EJB 3/JPA > Java Server Faces (JSF) 2.0 > Facilidade de uso, adoção da tecnologia, novas features > Enterprise Java Beans (EJB) 3.1 > Facilidade de uso, novas features > Java Persistence API (JPA) 2.0 > Novas features > Bean Validation > Definição unificada de constraints de dados por aplicação > Servlet 3.0 > Facilidade de uso, novas features > Java API for RESTful Web Services (JAX-RS) 1.0 > API para desenvolvimento de web services REST, em adição ao suporte a SOAP do JAX-WS Globalcode – Open4Education WebBeans 1.0 (JSR 299) > Unifica modelos de programação JSF, JPA e EJB 3 > desenvolvimento web stateful, contextual > Conversações > Injeção de dependência robusta, type-safe > Melhorias no modelo de interceptadores > Meta-programação por Annotations Globalcode – Open4Education JSF Page com WebBeans <h:form> <table> <tr> <td>Bidder</td> <td><h:inputText value="#{bid.bidder}"/></td> </tr> <tr> <td>Item</td> <td><h:inputText value="#{bid.item}"/></td> </tr> <tr> <td>Bid Amount</td> <td><h:inputText value="#{bid.bidPrice}"/></td> </tr> </table> <h:commandButton type="submit" value="Add Bid" action="#{placeBid.addBid}"/> </h:form> Globalcode – Open4Education JPA Entity WebBeans Component @Entity @Component @Named("bid") @Table(name=“BIDS”) public class Bid { @Id @GeneratedValue @Column(name=“BID_ID”) public Long bidId; public String bidder; public String item; @Column(name=“BID_PRICE”) public Double bidPrice; } Globalcode – Open4Education EJB 3.1 Session Bean WebBeans Component @Stateful @RequestScoped @Component @Named("placeBid") public class PlaceBidBean { @PersistenceContext private EntityManager entityManager; @Current private Bid bid; public void addBid() { entityManager.persist(bid); } } Globalcode – Open4Education Java Server Faces 2.0 (JSR 314) > Componentes customizados simplificados > Ótimo suporte a Facelets > Ótimo suporte a Ajax > Configurações por Annotations > Convenção sobre configuração > faces-config.xml opcional > Estágios de desenvolvimento estilo RAILS_ENV > Resources > Data Validation (JSR 303) > Melhorias de performance > Suporte a REST (JSR 311) > Vários outros Globalcode – Open4Education JSF Project Stages <context-param> <param-name>javax.faces.PROJECT_STAGE</param-name> <param-value>Development</param-value> </context-param> javax.faces.application.ProjectStage • Production • Development • UnitTest • SystemTest • Extension Globalcode – Open4Education JSF Resources Resource path: [/META-INF]/resources/ [localePrefix/][libraryName/][libraryVersion/] resourceName[/resourceVersion] Resource resource = FacesContext.getApplication() .getResourceHandler() .createResource(resourceName[,libraryName]); #{resource['<libraryName>:<resourceName>']} @ResourceDependency(name="style.css",library=“actionbazaar") public class HeaderTabs extends UIComponentBase { ... } Globalcode – Open4Education Enterprise Java Beans 3.1 (JSR 318) > Interfaces opcionais para Session Bean > Singleton Beans com controle de concorrência > Timers declarativos e progrmáticos, estilo Cron > Invocações Assíncronas > Empacotamento WAR simplificado > Suporte Java SE > Nomes Globais JNDI Global JNDI padronizados > EJB Lite Globalcode – Open4Education Timers Declarativos Estilo Cron @Stateless public class NewsLetterGeneratorBean { @Resource private Session mailSession; @Schedule(second="0", minute="0", hour="0", dayOfMonth="1", month="*", year="*") public void generateMonthlyNewsLetter() { ... } } Globalcode – Open4Education Session Bean Assíncrono @Stateless public class OrderBillingBean { ... @Asynchronous public Future<BillingStatus> billOrder(Order order) { try { bill(order); return new AsyncResult<BillingStatus>( BillingStatus.COMPLETE); } catch (BillingException be) { return new AsyncResult<BilllingStatus>( BillingStatus.BILLING_FAILED); } } ... } Globalcode – Open4Education Invocação Cliente Assíncrona @EJB private OrderBillingBean orderBilling; ... Order order = new Order(); ... Future<BillingStatus> future = orderBilling.billOrder(order); ... BillingStatus status = future.get(); ... if (status == BillingStatus.COMPLETE) { notifyBillingSuccess(order); } else if (status == BillingStatus.BILLING_FAILED) { notifyBillingFailure(order); } Globalcode – Open4Education Java Persistence API 2.0 (JSR 317) > Melhorias no mapeamento Objeto-Relacional > Collections, maps e listas ordenadas > Mapeamento one-to-many unidirecional > Tabelas de junção para one-to-one, many-to-one > Criteria API > Bean validation (JSR 303) > Adições na API EntityManager e na API de Query > Locking, loading Entity, clearing Entity, max results, first result > Cache de segundo nível > Mais propriedades e hints padronizados > JDBC, locking, caching Globalcode – Open4Education Mapeando Collections @Entity @Table(name=“USERS”) public class User { @Id @GeneratedValue @Column(name=“USER_ID”) public long userId; public String userName; @Column(name=“BIRTH_DATE”) public Date birthDate; ... @ElementCollection @CollectionTable(name=”ALIASES”) @Column(name=”ALIAS”) public Set<String> aliases; @ElementCollection public Map<String, String> photos; } Globalcode – Open4Education Relacionamento One-to-Many Unidirecional @Entity public class User { @Id @GeneratedValue public long id; public String userName; ... @OneToMany @JoinColumn(name=”USER_ID”) public Set<Phone> phones; } @Entity public class Phone { @Id @GeneratedValue public long id; public String type; public String number; ... } Globalcode – Open4Education Bean Validation (JSR 303) > Especifique constraints apenas uma vez através das camadas de aplicação > Constraint > Restrição em um bean, campo ou propriedade > Not null, between 10 and 45, email válido, etc > Avaliadas automaticamente por um framework > Útil em outras APIs Java SE/Java EE > JSF 2.0 > JPA 2.0 > EJB 3.1 > WebBeans Globalcode – Open4Education JPA Entity with Bean Validation @Entity @Table(name=“BIDS”) public class Bid { @Id @GeneratedValue @Column(name=“BID_ID”) public Long bidId; @NotNull @Length(max=30) public String bidder; @NotNull @Length(max=200) public String item; @Column(name=“BID_PRICE”) @NotNull @Min(value=0.0, message=“price negative”) public Double bidPrice; } Globalcode – Open4Education Servlet 3.0 (JSR 315) > Annotations desde o começo > web.xml opcional > Defaults inteligentes > Fragmentos web.xml modulares em jars > Adição programática de Servlets, Filters and Listeners através do ServletContext > Suporte a processamento assíncrono em Servlets > Suspende e retoma requests Globalcode – Open4Education Exemplo Servlet Annotations @Servlet(name=“PlaceBidServlet” urlMapping={“/bid”, “/place-bid”}) public class PlaceBidServlet { @EJB private PlaceBid placeBid; @GET public void onGet(HttpServletRequest request, HttpServletResponse response) { Bid bid = new Bid(); ... placeBid.placeBid(bid); ... } } Globalcode – Open4Education Adição Programática de Servlet @ServletContextListener public class ActionBazaarListener { public void contextInitialized( ServletContextEvent event) { ServletContext context = event.getServletContext(); context.addServlet( “PlaceBidServlet", “Place bid servlet", “actionBazaar.PlaceBidServlet", null, -1); context.addServletMapping( “PlaceBidServlet", new String[]{"/place-bid"}); } } Globalcode – Open4Education Java API para RESTful Web Services (JSR 311) > Web services via REST, em vez de SOAP > Contrapartida REST do JAX-WS > Liberação da codificação de baixo nível – você pode se focar na lógica central > Annotations desde o começo > Pode se integrar com WebBeans, EJB and JPA Globalcode – Open4Education Session Bean com JAX-RS @Stateless @Path("/webservices") public class PlaceBidBean { @PersistenceContext private EntityManager entityManager; @PUT @Path("/bid/{bidder}") public void placeBid( @PathParam(“bidder") String bidder, @QueryParam(“item") String item, @QueryParam(“bid_price") Double bidPrice) { entityManager.persist( new Bid(bidder, item, bidPrice)); } } Globalcode – Open4Education Resumo > Podando > JAX-RPC, EJB 2.x Entity Beans CMP > Profiles > Minimal e intermediate Web Profiles ? > Extensibility > Injeção de dependência generalizada e anexação de interceptadores ? > SPIs adicionais ? > Inovação > WebBeans, JSF 2.0, EJB 3.1, JPA 2.0, Bean Validation, Servlet 3.0, JAX-RS > Sua ajuda é necessária > Envie comentários para [email protected] ! Globalcode – Open4Education Referências > Profiles in the Java EE 6 Platform, http://weblogs.java.net/blog/robc/archive/2008/02/profiles_in_the_1.html > Java EE 6, http://jcp.org/en/jsr/detail?id=316 > WebBeans, http://jcp.org/en/jsr/detail?id=299 > JSF 2.0, http://jcp.org/en/jsr/detail?id=314 > EJB 3.1, http://jcp.org/en/jsr/detail?id=318 > JPA 2.0, http://jcp.org/en/jsr/detail?id=317 > Bean Validation, http://jcp.org/en/jsr/detail?id=303 > Servlet 3.0, http://jcp.org/en/jsr/detail?id=315 > JAX-RS, http://jcp.org/en/jsr/detail?id=311 Globalcode – Open4Education