Mais velozes e mais furiosos: Desenvolvimento Web 2.0 e JEE com JBoss Seam João Paulo Viragine Solutions Architect [email protected] Motivação • O JSF merece uma segunda chance? • O EJB foi realmente aperfeiçoado? • Vale a pena continuar com Java ou é melhor partir para Ruby on Rails? Motivação (continuação) • Com o JBoss Seam, podemos responder SIM a todas essas questões. Qual framework devo utilizar? • Em um mundo abarrotado de frameworks, como escolher um? • Temos tantos frameworks disponíveis para a plataforma Java: alguns já consolidados, outros prometendo. A decisão torna-se agonizante! • A decisão pelo melhor framework: Qual framework devo utilizar? (continuação) • Logo que tomamos a decisão, surge um novo framework prometendo “acabar” com os antecessores. • Vemo-nos no “Paradoxo da Escolha”: Ficamos pensando que o melhor framework é aquele que ainda não utilizamos u Como conseqüência, gastamos mais tempo procurando pelo framework perfeito, do que realmente desenvolvendo aplicações • Estamos sempre procurando por um framework que seja: Novo e ao mesmo tempo familiar Leve, mas poderoso Qual framework devo utilizar? (continuação) • Precisamos de um framework que integre a vasta gama de tecnologias/frameworks da plataforma Java, em um modelo unificado de desenvolvimento: O JBoss Seam é esse framework JSF e EJB 3.0 • Não serão abordadas as deficiência do JSF e do EJB 3.0 Existe material específico sobre esse tema • Aproveitarei o tempo pra falar do JBoss Seam O que é o JBoss Seam? • Definição da palavra: Seam = emenda • Seam não é um acrônimo (SEAM): Stop Enterprise Application Masochism Software for Enterprise Application Masterpieces • Informações gerais: Criado por Gavin King (criador do Hibernate) Versão 1.0 Beta 1 em 18/09/2005 Versão 1.0.0.GA lançada em 12/06/2006 Versão atual de produção: 2.0.2.GA em 15/05/2008 Comunidade extremamente ativa: www.seamframework.org • Mais de 1.000 usuários registrados no primeiro mês • Atualmente, quase 3.000 usuários registrados O que é o JBoss Seam? (continuação) • Definições: JBoss Seam - Next generation enterprise Java development (do site do JBoss Seam) Um framework leve para Java EE 5.0 O JBoss Seam é um framework para a plataforma Java EE que facilita o desenvolvimento de aplicações web e finalmente cumpre a promessa de uma arquitetura unificada de componentes O JBoss Seam resolve os problemas da plataforma Java EE unindo conceitos inovadores a padrões existentes (JSF/JPA/EJB 3.0) O que é o JBoss Seam? (continuação) • O JBoss Seam NÃO é apenas mais um “simples framework de integração” competindo em um mercado abarrotado de opções • O JBoss Seam NÃO é uma reposta ao Spring framework: Resposta/alternativa ao R Ruby on Rails • O JBoss Seam possui todos os “músculos/força” do Java EE, mas com uma aparência elegante • “Serviços Enterprise” para as massas Características e Benefícios • Integração entre JSF e EJB 3.0 Integração não definida na especificação da plataforma Java EE 5.0: • “Mundos separados” O JBoss Seam faz todo o “trabalho sujo” de integração entre JSF e EJB 3.0, deixando o desenvolvedor concentrado no domínio de negócios O JBoss Seam foi feito para o JSF: • Além do JSF, o JBoss Seam permite outras tecnologias para a camada de apresentação: Wicket, Tapestry, GWT e Flex (GraniteDS e BlazeDS) Características e Benefícios (continuação) • Além de não depender do JSF para a camada de apresentação, o JBoss Seam funciona com ou sem EJB 3.0 • Tipos de componentes Seam: JavaBeans EJB 3.0: • Stateless Session Beans • Stateful Session Beans • Entity Beans • Message-Driven Beans Virtualmente, qualquer classe Java pode se tornar um componente Seam @Name: • Características e Benefícios (continuação) • Modelo unificado de componentes: Não há distinção entre componentes da camada de apresentação e componentes da camada de negócios: • Ex: EntityBean trafega diretamente da camada de apresentação para a camada de negócios/persistência e vice-versa: Características e Benefícios (continuação) • Modelo unificado de componentes (continuação): O modelo de componentes do JBoss Seam permite a utilização direta de POJOs como “backing beans” para as páginas JSF: • Nada de cadastrar classes no faces-config.xml: Elimina camadas/artefatos “desnecessários”: VO/DTO, DAO, Service Locator, OpenSessionInView, etc VOCÊ monta a arquitetura da sua aplicação, define as camadas e como elas vão interagir Características e Benefícios (continuação) • Integração com AJAX Suporte “out of the box” para frameworks open source baseados em JSF: • Adiciona suporte AJAX sem a necessidade de codificação de JavaScript pelo desenvolvedor • ICEfaces • JBoss RichFaces: Possui uma camada de JavaScript remoto: • Acesso aos componentes Seam direto do JavaScript: Integração com: Dojo GWT Características e Benefícios (continuação) • Gerenciamento de estado e demarcação de contexto de maneira declarativa Ciclo de vida dos componentes é gerenciado pelo JBoss Seam Sem chamadas explícitas ao HttpSession • Uso exagerado do HttpSession = Memory leak • @Scope(value=ScopeType.SESSION): • Estende os contextos definidos pela especificação de Servlets: request (event), page, session e application com dois novos contextos: Conversation Business process Características e Benefícios (continuação) • Conversation Conceito chave no JBoss Seam A conversação representa uma “unidade de trabalho” do ponto de vista do usuário: • Geralmente associada a um Caso de Uso Um usuário pode ter várias conversações ao mesmo tempo: • Normalmente em múltiplas janelas do browser Facilita a construção de “wizards” Facilita o uso de AJAX • Facilita ainda mais o uso do JPA: • Evita a famigerada LIE (LazyInitializationException) Business process Contexto Stateful (Banco de Dados) O usuário pode continuar a interação com o sistema mais tarde Características e Benefícios (continuação) • Integração com Business Process Management (BPM) Traz o BPM para o mundo das aplicações web Business Process Management (BPM) transparente através do Java Business Process Management (jBPM) • Interação de longa duração (vários dias) Pode envolver interação de vários usuários (associação de tarefas) Criação e controle do processo baseados em anotações: Características e Benefícios (continuação) • O JBoss Seam suporta o conceito de Inversão de Controle (IoC) ou Injeção de Dependências (DI), mas vai além • A injeção de dependências funciona bem no modelo de arquitetura stateless, mas, em uma arquitetura stateful, precisamos que a injeção de dependências seja bidirecional: • Bijeção (Injeção + Ejeção): Estende o modelo de IoC: • Dinâmica • Contextual • Bidirecional A bijeção ocorre: • Antes e depois das chamadas aos métodos Características e Benefícios (continuação) • Injection: Componente é recuperado de um contexto (ou criado, dependendo da configuração) e injetado em outro componente: Outjection: Um componente “ejeta/coloca” outro componente em um contexto: Características e Benefícios (continuação) • Navegação: A aplicação não conhece nada sobre a navegação, mas a navegação conhece o estado da aplicação: • Métodos “retornam void” e não um “outcome” ou a própria página de transição: • A navegação conhece o estado da aplicação e toma decisões: Características e Benefícios (continuação) • Navegação (continuação) Stateful: Fluxo de navegação entre páginas (pageflow) definido via jBPM Process Definition Language (jPDL) Utilizado quando temos um fluxo de navegação “restrito”: Características e Benefícios (continuação) • Navegação (continuação) Stateful (continuação) Editor gráfico para o diagrama do fluxo de páginas através do JBoss Developer Studio/JBoss Tools: Características e Benefícios (continuação) • Navegação (continuação) Stateless Definida através da navegação do JSF (facesconfig.xml) ou JBoss Seam (pages.xml) O fluxo de navegação via pages.xml é muito mais poderoso que o fluxo de navegação do JSF: Acesso ao estado da aplicação, mecanismo de eventos e etc Utilizado quando temos um fluxo de navegação “livre”: Características e Benefícios (continuação) • Segurança: Abstrai a utilização do JAAS Integração com o JBoss Rules Pode ser aplicada a: • Páginas (pages.xml): • Fragmentos de páginas: • Métodos: • Entidades Características e Benefícios (continuação) • Gerenciamento de “workspace” e janelas do browser: O usuário pode utilizar várias abas Ou, o usuário pode utilizar várias conversações em uma única aba Exemplo: HotelBooking • Uso intensivo de anotações: Configuração por exceção (“no XML hell”) As anotações do JEE/EJB 3.0 são utilizadas e ampliadas com as anotações do JBoss Seam Eliminação das declarações dos “JSF Managed Beans”, “Converters” e “Validators” no faces-config.xml Características e Benefícios (continuação) • Validação Onde colocar as regras de validação? • Na camada de apresentação? Sim, precisamos informar os erros de validação para o usuário Mas, também temos de garantir as regras/restrições na camada de persistência: Podemos esquecer de colocar a validação em uma página Clientes que utilizem as classes de domínio podem fazer um “bypass” da validação (Ex. Aplicação Desktop, WebServices) “Bad design”: Regras de validação fazem parte do objeto de domínio (Persistent Domain Objects Pattern vs Anemic Domain Model) • Melhor opção: colocar a validação nas classes de domínio e reaproveitá-las na camada de apresentação com a utilização de AJAX Características e Benefícios (continuação) • Validação (continuação) Hibernate Validator: • Vários validadores pré-definidos: Max, Min, Length, Range, Size, Email, Future, Past, Pattern, Email, CreditCard, etc • Fácil customização (Ex: @CPF, @StrongPassword) • Funciona com qualquer implementação de JPA: Se utilizado com o Hibernate, gera a DDL com todas as restrições definidas • Esforço de padronização da especificação Bean Validation (JSR 303) • Validação na classe de domínio: Características e Benefícios (continuação) • Validação (continuação) – Integração Integração do JSF/Facelets com o Hibernate Validator: • O JBoss Seam leva a validação definida no objeto de domínio para a camada de apresentação: Seam JSF Controls: <s:validate/>, <s:validateAll> ● Lê a anotação (meta-informação) definida e a utiliza como validador no JSF <s:decorate/> ● “Decora” o campo quando há algum erro de validação Características e Benefícios (continuação) • Fácil utilização de testes unitários e de integração: Como são POJOs, os componentes Seam são facilmente testáveis Podemos testar toda a aplicação, independente da interação do usuário: • Simula todo o ciclo de vida do JSF Frameworks de testes: • TestNG e JUnit Os testes podem rodar dentro da própria IDE, o JBoss Seam faz o deploy dos componentes EJB via JBoss Embedded Características e Benefícios (resumo) • Um framework completo para o desenvolvimento web O JBoss Seam endereça e integra questões como: • Persistência • Concorrência • Gerenciamento de estados • Segurança • Email • Geração de PDF e gráficos • Workflow • Web Services • Cache de fragmentos de páginas • Captcha • BPM • AJAX • etc Seam Application Framework • Um framework dentro do próprio framework • Um conjunto de classes que facilitam a construção de componentes: CRUD (EntityHome) Pesquisas em entidades (EntityQuery) Controladores JSF (EntityController) • Duas maneiras de criação: Via código Java: Via declaração XML (components.xml): Utilização: seam-gen • Maneira simples de começar utilizar o JBoss Seam: Gera todo o projeto e as configurações necessárias: • Nada de se preocupar com configurações, xml, bibliotecas, etc • Gerador de aplicações no estilo Ruby on Rails: Linha de comando (ant): • seam new-project, seam new-action, seam new-form, seam generate-entities, seam generate-ui, etc Integrado com IDE (JBoss Developer Studio/JBoss Tools) • CRUD: Baseado no Seam Application Framework Geração a partir de entidades existentes (top down) Ou, por engenharia reversa da base de dados (botton up): • Identifica relacionamentos complexos Gera a interface gráfica coerente com o modelo de dados seam-gen (continuação) • Aplicação gerada com suporte a: Templates Facelets, RichFaces, AJAX, CSS EJB 3.0/JPA Segurança Internacionalização Classes de teste com TestNG • Gera projeto compatível com: ant Eclipse NetBeans • Fácil modificação do código gerado: Código próximo ao criado manualmente JBoss Developer Studio (JBDS)/JBoss Tools • Maneira ainda mais simples (que o seam-gen) de começar utilizar o JBoss Seam: “Front-end para o seam-gen” Toda criação do projeto Seam é baseada em “wizards” • Baseado no Eclipse 3.3 (Europa) e WTP 2.0 • Ambiente de desenvolvimento totalmente integrado • Suporte especial ao JBoss Seam: Editor gráfico para os arquivos de configuração “Content Assist” para Unified Expression Language (EL) e Facelets: • Reconhece os componentes Seam JBDS/Tools (continuação) • Editor visual de páginas • Paleta de componentes (JSF, RichFaces/Ajax4jsf, JBoss Seam) • Ferramentas para o Hibernate: Mostra a SQL gerada pela HQL/JPAQL • Ferramentas para o JBoss jBPM (editor visual) • Ferramentas para Spring • Ferramentas para Struts • Adaptador otimizado para JBoss Application Server (JBoss Server View) JBDS/Tools (continuação) • Exclusivo no JBDS (subscrição): Download único: • Não precisa fazer integração com o Eclipse Certifica tanto a ferramenta quanto os componentes do “runtime” JBoss Enterprise Application Platform (JBoss EAP): • Utilize em desenvolvimento a mesma versão que utilizará em produção Red Hat Enterprise Linux (RHEL 5) Acesso ao RHN “Stack” completo para desenvolvimento • Rotular o JBoss Seam como um “framework web” é “desmerecê-lo”: O JBoss Seam é muito mais que um framework web tradicional Pode ser melhor descrito como um “stack” completo para desenvolvimento • O JBoss Seam inclui: O próprio framework Bibliotecas de terceiros Build script (baseado no ant) Gerador de projetos (seam-gen) Integração com IDEs Classes de testes O JBoss Embedded Integração com outras tecnologias Mais de 25 exemplos Desvendando o mito do "vendor lock-in" • Puro FUD (Medo, Incerteza e Dúvida) • O JBoss Seam é open source (assim como todos os outros projetos JBoss) e é licenciado sobre LGPL • Você NÃO é obrigado a utilizar o JBoss Application Server: O JBoss Seam é compativel com os maiores servidores de aplicações do mercado, como: BEA Weblogic, IBM Websphere, Oracle OAS, SUN Glassfish Roda inclusive no Apache Tomcat Se o suporte a EJB 3.0 não estiver disponível, podemos utilizar o suporte do JBoss Seam para o gerenciamento de transações (JPA ou Hibernate): • Alternativamente, podemos executar o Tomcat com o JBoss Embedded para um suporte a EJB 3.0 Desvendando o mito do "vendor lock-in" • Escolhendo o JBoss Seam, NÃO estamos presos a uma tecnologia JBoss: Base/implementação de referência para a especificação de Web Beans (JSR 299) Uma vez que a especificação de Web Beans (JSR 299) estiver pronta, qualquer fornecedor pode prover sua própria implementação • Devemos considerar a escolha do JBoss Seam baseados em méritos técnicos Web Beans (JSR 299) • O propósito da JSR 299 é unificar o modelo de componentes do JSF (managed bean component model) com o modelo de componentes do EJB 3.0, resultando em um modelo simplificado para o desenvolvimento de aplicações para web na plataforma Java EE 6.0: Profundamente influenciada pelo JBoss Seam e Google Guice. (além de influências do Oracle ADF e Apache Shale) • Padronização do modelo de programação do JBoss Seam na plataforma Java EE 6.0 Lider da especificação: • Gavin King - Red Hat Middleware LLC Expert Group: • Apache Software Foundation • Google Inc • Oracle • Red Hat Middleware LLC • Sun Microsystems Inc • Outras empresas e pessoas Conclusão • O JBoss Seam não é tímido ao resolver os problemas da plataforma Java EE, particularmente aqueles com o JSF • O JBoss Seam promove o uso de arquiteturas simples, encorajando os desenvolvedores a removerem camadas desnecessárias e a utilizarem componentes contextuais • O JBoss Seam elimina a complexidade e torna comprovadas tecnologias mais simples e acessíveis as já Conclusão (continuação) • Em um mundo inundado de frameworks, o JBoss Seam é um “unframework” Não força um modelo de programação: • Desenvolvedor não precisa esquecer tudo o que sabe Em vez disso, o JBoss Seam unifica as APIs padrões da plataforma Java, tornando-as mais acessíveis, funcionais e atrativas Conclusão (continuação) • E ainda provê novas funcionalidades na forma de extensões e integração de bibliotecas de terceiros, como: • Bijeção • Conversations • BPM (jBPM) • Pageflows • Suporte integrado a ORM • RESTful URLs e “page actions” • JavaScript remoto • JBoss EL • iText PDF • JfreeChart • Validadores • Conversores Conclusão (continuação) • • • • • • • • • • Gerenciamento de eventos (event-driven applications, observer/observable pattern) Interceptors Spring JBoss Rules Groovy Internacionalização (i18n) e Temas File upload Email Cache de fragmentos de página Captcha Conclusão (continuação) • • • • • • Hot deploy Gerenciamento de exceções (pages.xml) Gerenciamento de workspace Mecanismos de log e mensagens (@Logger, @FacesMessages) Debug (debug.seam)permite inspecionar qualquer componente Seam diretamente do browser) Integração com o JBoss Portal (JBoss Portlet Bridge - JSR 301) Conclusão (continuação) • O JBoss Seam salvou o Java EE • Java EE antes/depois do JBoss Seam Livros e Treinamentos • Livros sobre o JBoss Seam: JBoss Seam: Simplicity and Power Beyond Java EE Seam Framework: Experience the Evolution of Java EE (Outubro de 2008) Beginning JBoss Seam: From Novice to Professional Practical JBoss Seam Web 2.0 Projects JBoss SEAM (Alemão) Seam in Action (Agosto de 2008) • Treinamento Oficial de JBoss Seam: JB170 – Introduction to JBoss Seam: • 24 horas Palavras Finais • “Seam is the most exciting technology that has landed in Java's turf since its inception and the reasons why you should make Seam your framework of choice” - Dan Allen • O sacrifício não é um pré-requisito para criar aplicações de sucesso • Pare de pesquisar! Comece a desenvolver sua aplicação! Exemplo (@Name, @In, CRUD) Exemplo (@DataModel, @Factory) Mais velozes e mais furiosos: Desenvolvimento Web 2.0 e JEE com JBoss Seam João Paulo Viragine Solutions Architect [email protected]