SlideShare une entreprise Scribd logo
1  sur  91
JBoss Seam Introdução
O que é Jboss Seam? Segundo a definição da Palavra:      Seam = Emenda Seam não é um acrônimo (SEAM):     Stop Enterprise Application Masochism     Software for Enterprise Application Masterpieces
O que é Jboss Seam? 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
O que é Jboss Seam? Versão atual de produção: 2.1.2.GA Comunidade extremamente ativa: www.seamframework.org Mais de 1.000 usuários registrados no primeiro mês Atualmente, mais de 5.000 usuários registrados
O que é Jboss Seam? De acordo com o site oficial : Seam é um framework para Java Enterprise (JavaEE) Seam não é simplesmente outro framework de Integração Não é também uma resposta ao Spring Framework.
O que é Jboss Seam? Componente unificado: Managed Beans (EJB3) Extensão dos contextos Java Servlet, com a adição do escopo “Conversation” Gerenciamento do PersistenceContext Não faz distinção entre os componentes da camada de apresentação e camada de negócios:business logic components Você cria sua arquitetura e define suas camadas
O que é Jboss Seam?  Integração entre  JSF e EJB 3.0  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) Além de não depender do JSF para a camada de Apresentação, o JBoss Seam funciona com ou sem EJB 3.0
O que é Jboss Seam? Tipos de componentes Seam: JavaBeans EJB 3.0: Stateless Session Beans Stateful Session Beans Entity Beans Message-Driven Beans
O que é Jboss Seam? Virtualmente, qualquer classe Java pode se tornar um componente Seam @Name (“meuComponente”) public class meuComponente { ... ... }
O que é Jboss Seam? Modelo unificado de componentes: Não há distinção entre componentes da camada de apresentação e componentes da camada de negócios: Não se faz necessário o uso de DTO/VO <h:form>     <h:inputText value="#{user.name}“ />     <h:inputText value="#{user.telefone}" /> </h:form> @Entity @Name(“user”) public class User {     private String name;     private String telefone;
O que é Jboss Seam? 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:  <managed-bean>   <managed-bean-name>cadastro</managed-bean-name>   <managed-bean-class>demo.Cadastro</managed-bean-class>   <managed-bean-scope>session</managed-bean-scope>  </managed-bean>
O que é Jboss Seam? Elimina camadas/artefatos “desnecessários”: VO/DTO, DAO, Service Locator, OpenSessionInView... VOCÊ monta a arquitetura da sua aplicação, define as camadas e como elas vão interagir
O que é Jboss Seam? 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: <h:inputText value="#{user.name}" required="true">     <f:validateLength maximum="30" minimum="3"/>     <rich:ajaxValidator/>     </h:inputText><br/>
O que é Jboss Seam? Possui uma camada de JavaScript remoto: • Acesso aos componentes Seam direto do JavaScript: Integração com: Dojo GWT var meuComp = Seam.Component.newInstance(“meuComp”); meuComp.setXXX(Valor);
O que é Jboss Seam? Estende os contextos definidos pela especificação de Servlets: request (event), page, session e application com dois novos contextos: Conversation Business process
O que é Jboss Seam? 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
O que é Jboss Seam? Conversation (continuação) 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
O que é Jboss Seam? 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:
O que é Jboss Seam? 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
O que é Jboss Seam? Injection: Componente é recuperado de um contexto (ou criado, 	dependendo da configuração) e injetado em outro 	componente: @In private User user;
Jboss Seam? Outjection: Um componente “ejeta/coloca” outro componente em um contexto: @Out  Usuario user; Para criar um componente podemos usar @Factory private void pesquisar() { .... }
Configuração do Seam Seam servlet e listener Servlet que processa todas requisições Seam  	File: /WEB-INF/web.xml <servlet>   <servlet-name>Faces Servlet</servlet-name>   <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>   <load-on-startup>1</load-on-startup> </servlet> < servlet-mapping>  <servlet-name>Faces Servlet</servlet-name>  <url-pattern>*.seam</url-pattern> </servlet-mapping>
Configuração do Seam Listener, responsável por “startar” o seam e destruir as sessões e contexto de aplicação <listener> <listener-class>org.jboss.seam.servlet.SeamListener</listener-class> </listener>
Configuração Arquivos requeridos de configuração: /WEB-INF/faces.config configuração especifica JSF /WEB-INF/components.xml configuração do Seam colocado em META-INF
Configuração /WEB-INF/pages.xml Navegação do Seam É opcional, mas recomendado seam.properties Configurações do Seam, geralmente vazio. Deve ser colocado em todo lugar que tiver algum componente Seam (@Name)
Configuração Configuração Facelets  WEB-INF/faces-config.xml <application> <view-handler>com.sun.facelets.FaceletViewHandler</view-handler> </application> WEB-INF/web.xml <context-param> 	<param-name>javax.faces.DEFAULT_SUFFIX</param-name> 	<param-value>.xhtml</param-value> </context-param>
Configuração Seam Filter Requerido para controle de erro, progagação de conversação  WEB-INF/web.xml <filter> 	<filter-name>Seam Filter</filter-name> 	<filter-class>org.jboss.seam.servlet.SeamFilter</filter-class> 	</filter> 	<filter-mapping> 	<filter-name>Seam Filter</filter-name> 	<url-pattern>/pattern>/*</url-pattern> </filter-mapping>
Configuração Filtro de tratamento de Erros Erros podem ser mapeados para uma página própria para erros File: /WEB-INF/pages.xml <exception class="org.jboss.seam.framework.EntityNotFoundException"> 	<redirect view-id="/error.xhtml"> 	<message>Not found</message> </redirect>
Exercício 1  Vamos criar nossa primeira aplicação em Jboss Seam ;-)  Cadastro de usuários: igual a versão feita em JSF
Resultado do Exercício 1
Continuando... 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
Validação 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) •   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
Validaçã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
Validação Hibernate Validator: Esforço de padronização da especificação Bean Validator Validation (JSR 303) Validação na classe de domínio:
Validaçã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>
Validação 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
Validação (Decorate) <ui:composition xmlns="http://www.w3.org/1999/xhtml"                xmlns:ui="http://java.sun.com/jsf/facelets"                xmlns:h="http://java.sun.com/jsf/html"                xmlns:f="http://java.sun.com/jsf/core"                xmlns:s="http://jboss.com/products/seam/taglib">                     <div>            <s:label styleClass="#{invalid?'error':''}">            <ui:insert name="label"/>            <s:span styleClass="required" rendered="#{required}">*</s:span>        </s:label>                <span class="#{invalid?'error':''}">            <h:graphicImage value="/img/error.gif" rendered="#{invalid}"/>            <s:validateAll>                <ui:insert/>            </s:validateAll>        </span>        <s:message styleClass="error"/>       </div>    </ui:composition>
Validação (Decorate) Para usar, basta colocar informar o decorate como um template <s:decorate template="edit.xhtml">        <ui:define name="label">Country:</ui:define>        <h:inputText value="#{location.country}" required="true"/ </s:decorate>
Exercício 2 Usando validação na tela criada anteriormente <s:decorate id="d1" template="layout/edit.xhtml"> 	<ui:define name="label">Nome:</ui:define> 	<h:inputText id="username" value="#{pessoa.nome}" required="true" requiredMessage="Campo Obrigatório"/> </s:decorate>
Validação (Ajax) Usando validação com ajax <s:decorate id="d1" template="layout/edit.xhtml">                      <ui:define name="label">Nome:</ui:define>     <h:inputText id="username" value="#{pessoa.nome}" required="true“>            <a4j:support event="onblur" reRender="d1"/> </h:inputText> </s:decorate>
Exercício 3 Inserir validação no sistema, fazer testes com validações,testar também o <rich:beanValidator /> Obs: Usando o rich:beanValidator não se faz necessário o uso do <s:validate>, <s:decorate> <h:inputText id="telefone" value="#{pessoa.telefone}" required="true" requiredMessage="Obrigatrio"> <rich:beanValidator summary=“Telefone Inválido" /> </h:inputText> <rich:message for="telefone"/>
Tabelas de Dados Para facilitar ainda mais, o Seam possui a anotação: “DataModel” @DataModel List<Pessoa> pessoas; Pode ser usado com: List, Map, Set ou Object[], assim como o JSF DataModel
Exercício 4 Trocar o @Out por @Datamodel
Tabelas de Dados Obtendo valores selecionados em uma tabela @DataModelSelection Pessoa pessoaSelecionada
Exercício 5	 Usar o DataModelSelection para obter o objeto selecionado Criar um método para apagar esse objeto
Navegação Stateful navigation Pageflow é definido fora dos componentes Valores de retorno das actions são avaliados Navegação clássica: método da action que decide para onde ir Pageflow é definido para uma simples conversação
Navegação <page view-id="/cadastro.xhtml" >       <begin-conversation join="true"/>       <navigation>         <rule if-outcome="lista">           <redirect view-id="/cadastroPessoa.xhtml"/>         </rule>        </navigation> </page> public String salvar() {                       public String salvar() { ....                                                          .... return "lista";                                      return “/cadastroPessoa.xhtml"; }                                                             }
Navegação <page view-id="/cadastroPessoa.xhtml"> 	<navigation from-action="#{cadastroPessoaAction.apagar()}">       <redirect view-id="/sucesso.xhtml"/>     </navigation> </page>
Navegação <page view-id="/cadastroPessoa.xhtml"> 	<navigation from-action="#{cadastroPessoaAction.apagar()}"> 		<rule if-outcome="success"> 		   <redirect view-id="/sucesso.xhtml"/> 		</rule>      </navigation> </page> <page view-id="/cadastro.xhtml" > 	<action execute="#{cadastroPessoaAction.listar()}"/> </page> <page view-id="/cadastro.xhtml" > 	<action if=“#{condicao}” execute="#{cadastroPessoaAction.listar()}"/> </page>
Navegação <page view-id=“*/login.xhtml"> <navigation from-action="#{identity.login}"> <rule if="#{identity.loggedIn}">          <redirect view-id="/home.xhtml"/>       </rule> </navigation> </page> <page view-id=“*/login.xhtml“    login-required="true”> 	 ..... </page>
Navegação <pages> 	<page view-id="/search.xhtml"> <param name="searchPattern" value="#{searchService.searchPattern}"/> 	</page> ... </pages> Metodo é executado antes da página ser renderizada. <page view-id="/entry.xhtml" action="#{entryAction.loadBlogEntry(blogEntry.id)}"> 	<param name="blogEntryId" value="#{blogEntry.id}” validator="#{Validator}" required="true"/> </page>
Navegação Pode-se também obter o parâmetro na própria Action implementando um RequestParameter @RequestParameter private Long entryId; public void findEntry() { 	blogentry = em.find(Blogentry.class, entryId); }
Exercício 6 Fazer um exercício de navegação usando o pages.xml Criar 3 páginas e navegar entre elas usando o pages.xml Usar chamada de metodo direto no pages.xml
Contextos Seam Stateless Event context Page context Session Business Application
Contextos Seam Stateless: Mesmo conceito do Stateless do EJB criado justamente para integração com este tipo de EJB. Event context: Como o nome mesmo diz os objetos registrados neste contexto apenas vão estar disponíveis durante a execução de um determinado evento. Page context: Contexto já conhecido por todos que trabalham com aplicações web, está associado ao processo de renderização, carregamento, carregamento de uma página.
Contextos Seam Conversation context: É um dos contextos que diferencia o Seam de qualquer outro framework existente no mercado, com este contexto podemos criar unidades de conversação e registrar nestas unidade todos os objetos e serviços que a aplicação vai necessitar usar quando a mesma estiver sendo executada sobre este contexto.  Neste contexto mesmo outras instâncias da aplicação sendo acessadas em janelas diferentes não terão acesso aos artefatos registrados no contexto da outra, ou seja, a cada nova instância da aplicação em uma nova janela se caracteriza como uma instância independente assim uma não terá acesso as informações da outra mesmo sendo executadas na mesma instância do browser.
Contextos Seam Session context: Este também é muito conhecido por todos que trabalham com aplicações  Em resumo este contexto inicia quando acessamos a primeira tela da aplicação e só será destruído quando fecharmos nosso browser ou fazermos um logoff implementado pela aplicação.
Contextos Seam Application context: E por último o também já conhecido contexto de aplicação, tudo que registrarmos neste contexto fica disponível para todos que acessarem a mesma aplicação, ou seja, devemos registrar neste contexto somente serviços que serão acessados por todos e que são imutáveis pois este contexto só é atualizado no startup do servidor web.
Contextos Seam Business process context: Mais um contexto novo criado pelo Seam, este foi criado especialmente para trabalharmos com fluxos de trabalho (workflow), ele garante para nós que qualquer objeto ou serviço registrado neste contexto vai estar disponível até o fim do fluxo.  O mesmo fica disponível para múltiplas interações e múltiplos usuários e seu estado é persistente, ou seja, se eu fechar a aplicação e no dia seguinte entrar novamente, os objetos registrados no fluxo em questão estarão ali com as informações deixadas pela última vez.
Contextos Seam Contexto Padrão: Depende do tipo do componente: Stateless Session Beans? Default em contexto Stateless  Entities Default em contexto Conversation
Contextos Seam  Message-Driven Beans? Padrão sem contexto  Stateful Session Beans? Padrão em contexto de Conversação JavaBeans? Padrão em contexto de evento
Contextos Seam Iniciando e Encerrando uma Conversação Anotação @Begin public void checkoutShoppingCart(){ // ... @End public void confirmCheckout(){
Contextos Seam Navegação (pages.xml) <page view-id="/messageList.jsp" action="#{conversation.begin}"/> Ou <page view-id="/messageList.jsp"> <begin-conversation /> <page> <page view-id="/home.jsp"> <end-conversation/> <page>
Contextos Seam Em um link JSF <h:commandLink action="main" value="Select Hotel"> <s:conversationPropagation type="begin"/> </h:commandLink> <h:commandLink action="main" value="Exit"> <s:conversationPropagation type="end"/> </h:commandLink> Em um Link Seam s:link <s:link view="/checkout.xhtml" propagation="begin"/> <s:link view="/confirm.xhtml" propagation="end"/>
Contextos Seam Propagando a conversação Propaga por padrão Pode ser finalizada <s:link view="/main.xhtml" propagation="none"/> <h:commandLink action="main" value="Exit"> <f:param name="conversationPropagation" value="none"/> </h:commandLink> <h:commandLink action="main" value="Exit"> <s:conversationPropagation type="none"/> </h:commandLink>
Exercícios 7 Abrir e fechar conversação Trocar contextos
Eventos Tipos de Eventos  Page action  – ocorre antes que a página é carregada Pode ser definido para uma determinada página WEB-INF/pages.xml <pages> 	<page view-id="/hello.jsp" action="#{helloWorld.sayHello}"/> </pages>
Eventos Pode-se usar  “wildcard” para várias páginas WEB-INF/pages.xml <pages> <page view-id="/hello/*" action="#{helloWorld.sayHello}"/> </pages>
Eventos Pode-se também passar parâmetros WEB-INF/pages.xml <pages> 	<page view-id="/hello.jsp" action="#{helloWorld.sayHello}"> <param name="firstName" value="#{person.firstName}"/> 		<param name="lastName" value="#{person.lastName}"/> 	</page> </pages>
Eventos Pode-se também lançar um evento em uma Action @Name("helloWorld") public class HelloWorld { 	public void sayHello() { 		FacesMessages.instance().add("Hello World!"); Events.instance().raiseEvent("hello"); 	} }
Eventos Pode-se também lançar um evento em uma Action @Name("helloWorld") public class HelloWorld { @RaiseEvent("hello") 	public void sayHello() { 		FacesMessages.instance().add("Hello World!"); 	} }
Eventos Capturando os eventos @Name("helloListener") public class HelloListener { @Observer("hello") 	public void sayHelloBack() { 		FacesMessages.instance().add("Hello to you too!"); 	} }
Exercício 8 Lançar e capturar eventos
Exceções O desenvolvedor determina como tratar uma exceção Via anotação Declarativamente em um arquivo XML Seam  aplica todas regras de rollback das exceções EJB para os componentes JavaBeans Seam da um rollback em qualquer transação ativa quando ocorre uma exceção
Exceções Capturando exceções usando Annotações @Redirect(viewId="/failure.xhtml", end=true) @ApplicationException(rollback=true) public class UnrecoverableApplicationException extends RuntimeException { ... }
Exceções Capturando exceções usando XML pages.xml <pages> <exception class="javax.persistence.EntityNotFoundException"> 		<http-error error-code="404"/> 	</exception> 	<exception class="javax.persistence.PersistenceException"> 	<end-conversation/> <redirect view-id="/error.xhtml"> 	<message>Database access failed</message> 	</redirect> </exception>
Exceções Capturando exceções usando XML pages.xml <exception> 	<end-conversation/> 	<redirect view-id="/error.xhtml"> 	<message>Aconteceu um Erro ;-(</message> 	</redirect> </exception>
Exceções Usando EL nas Exceções Exceções são adicionadas no contexto de conversação 	org.jboss.seam.handledException  <pages> 	<exception class="org.jboss.seam.security.AuthorizationException"> 	<end-conversation/> 	<redirect view-id="/error.xhtml"> 	<message severity="WARN">#{handledException.message}</message> 	</redirect> 	</exception> </pages>
Exercício 9 Vamos lancar e capturar algumas exception Lançar Runtime e Exception para ver a diferença Criar uma tela de erro customizada Obs: não esquecer de desabilitar : debug (component.xml) facelets.DEVELOPMENT (web.xml)
Segurança O Seam Security API fornece uma multiplicidade de funções relacionadas com segurança para seu aplicativo, abrangendo áreas como:  Autenticação - permite os usuários autenticar em qualquer fornecedor de segurança. (LDAP, JAAS..) Identity Management - uma API para gerenciar uma aplicação Seam, usuários e papéis em tempo de execução.
Segurança Autorização - um framework extremamente abrangente, baseado em regras de permissões Permission Management - um conjunto de componentes Seam para permitir uma fácil gestão da aplicação da política de segurança. CAPTCHA - para ajudar na prevenção de um software automatizado / scripts abusar seu sistema.
Autenticação A autenticação fornecida pelo Seam é construída utilizando o JAAS (Java autenticação e autorização de serviço), e como tal, fornecer uma robusta e altamente configurável API para manipulação de autenticação do usuário.  No entanto, para exigências menos complexas de autenticação, o Seam oferece um método mais simplificado de autenticação que esconde a complexidade do JAAS.
Autenticação O método de autenticação simplificada fornecido pelo Seam utiliza um built-in JAAS login módulo:SeamLoginModule, que delega a autenticação para um de seus próprios componentes Seam.  Este módulo de login já está configurado dentro Seam como parte de uma aplicação padrão e, como tal, não requer qualquer configuração adicional arquivos. Configurar esta forma simplificada de autenticação exige a configuração no arquivo: components.xml: 	<security:identity authenticate-method="#{authenticator.authenticate}"/>
Autenticação Escrevendo uma tela de Autenticação: <div>    <h:outputLabel for="name" value="Username"/>    <h:inputText id="name" value="#{credentials.username}"/></div><div>    <h:outputLabel for="password" value="Password"/>    <h:inputSecret id="password" value="#{credentials.password}"/></div><div>    <h:commandButton value="Login" action="#{identity.login}"/> </div>
Autenticação Escrevendo um método de Autenticação: @Name("authenticator")  public class Authenticator { @In EntityManager entityManager;  @In Credentials credentials;  @In Identity identity; public boolean authenticate() {       try {          User user = (User) entityManager.createQuery(             "from User where username = :username and password = :password")             .setParameter("username", credentials.getUsername())             .setParameter("password", credentials.getPassword())             .getSingleResult();          if (user.getRoles() != null) {             for (UserRole mr : user.getRoles())                identity.addRole(mr.getName());          }          return true;       }       catch (NoResultException ex) {          return false;       }    } }
Autenticação Tratando possíveis exceções: <pages>   ...    <exception class="org.jboss.seam.security.NotLoggedInException">        <redirect view-id="/login.xhtml">            <message>You must be logged in to perform this action</message>        </redirect>    </exception>    <exception class="org.jboss.seam.security.AuthorizationException">        <end-conversation/>        <redirect view-id="/security_error.xhtml">            <message>You do not have the necessary security privileges to perform this action.</message>        </redirect>    </exception> </pages>
Autenticação Redirecionando os usuários após o login component.xml <event type="org.jboss.seam.notLoggedIn"> 	<action expression="#{redirect.captureCurrentView}"/> </event> <event type="org.jboss.seam.postAuthenticate"> 	<action expression="#{redirect.returnToCapturedView}"/> </event>     ... </pages>
Autenticação Você pode redirecionar o usuário sem autenticidade para uma página de login quando ele tentar acessar uma determinada página <pages login-view-id="/login.xhtml">    <page view-id="/members/*" login-required="true"/>  	    <page view-id="/cadatro.xhtml" login-required="true"/> </pages>
Autorização Há uma série de mecanismos de autorização fornecida pelo Seam Security API para garantir o acesso aos componentes, métodos, e nas páginas.  Componentes: @Restrict("#{s:hasRole('admin')}")  public void delete() {  Páginas: <h:form class="loginForm" rendered="#{not identity.loggedIn}"> <page view-id="/reports.xhtml“><restrict>#{s:hasRole('admin')}</restrict></page> <h:outputLink action="#{reports.salvar}" rendered="#{s:hasRole('manager')}">Salvar 	</h:outputLink>
Exercício 10 Vamos implementar a segurança na aplicação Criar 2 perfis e alternar o acesso a botões e páginas
Obrigado ;-)

Contenu connexe

Tendances

Reinventar a roda a cada novo framework js, vale a pena?
Reinventar a roda a cada novo framework js, vale a pena?Reinventar a roda a cada novo framework js, vale a pena?
Reinventar a roda a cada novo framework js, vale a pena?Fernanda Bernardo
 
Anatomia do JSF, JavaServer Faces
Anatomia do JSF, JavaServer FacesAnatomia do JSF, JavaServer Faces
Anatomia do JSF, JavaServer FacesRafael Ponte
 
JavaServer Faces Produtividade em Desenvolvimento
JavaServer Faces Produtividade em DesenvolvimentoJavaServer Faces Produtividade em Desenvolvimento
JavaServer Faces Produtividade em DesenvolvimentoEduardo Bregaida
 
Palestra Demoiselle V1.x no 11 FISL
Palestra Demoiselle V1.x no 11 FISL Palestra Demoiselle V1.x no 11 FISL
Palestra Demoiselle V1.x no 11 FISL Emerson Saito
 
JSF 2.0 e ScrumToys
JSF 2.0 e ScrumToysJSF 2.0 e ScrumToys
JSF 2.0 e ScrumToysDr. Spock
 
Introdução ao JavaServer Faces
Introdução ao JavaServer FacesIntrodução ao JavaServer Faces
Introdução ao JavaServer FacesWillian Watanabe
 
Desenvolvimento de Aplicações com Zend Framework e Yahoo! User Interface
Desenvolvimento de Aplicações com Zend Framework e Yahoo! User InterfaceDesenvolvimento de Aplicações com Zend Framework e Yahoo! User Interface
Desenvolvimento de Aplicações com Zend Framework e Yahoo! User InterfaceDomingos Teruel
 
Demoiselle - Arquitetura
Demoiselle - ArquiteturaDemoiselle - Arquitetura
Demoiselle - ArquiteturaSerge Rehem
 
JavaServer Faces - Desenvolvendo aplicações web com produtividade
JavaServer Faces - Desenvolvendo aplicações web com produtividadeJavaServer Faces - Desenvolvendo aplicações web com produtividade
JavaServer Faces - Desenvolvendo aplicações web com produtividadeRafael Ponte
 
JSF 2 e Primefaces - 4º Encontro Mensal do Gojava
JSF 2 e Primefaces - 4º Encontro Mensal do GojavaJSF 2 e Primefaces - 4º Encontro Mensal do Gojava
JSF 2 e Primefaces - 4º Encontro Mensal do GojavaFrederico Maia Arantes
 
CDI -Contextos e Dependências
CDI -Contextos e DependênciasCDI -Contextos e Dependências
CDI -Contextos e DependênciasWende Mendes
 
Introdução a CDI e como utilizá-la em aplicações reais
Introdução a CDI e como utilizá-la em aplicações reaisIntrodução a CDI e como utilizá-la em aplicações reais
Introdução a CDI e como utilizá-la em aplicações reaisMichel Graciano
 
JSF2 ScrumToys SestInfo 2010
JSF2 ScrumToys SestInfo 2010JSF2 ScrumToys SestInfo 2010
JSF2 ScrumToys SestInfo 2010Eder Magalhães
 
PHP FrameWARks - Zend Framework
PHP FrameWARks - Zend FrameworkPHP FrameWARks - Zend Framework
PHP FrameWARks - Zend FrameworkMarcio Albuquerque
 
Spring: uma introdução prática
Spring: uma introdução práticaSpring: uma introdução prática
Spring: uma introdução práticaJosé Barros
 
JBoss Portlet Bridge
JBoss Portlet BridgeJBoss Portlet Bridge
JBoss Portlet Bridgerafaelliu
 

Tendances (20)

Reinventar a roda a cada novo framework js, vale a pena?
Reinventar a roda a cada novo framework js, vale a pena?Reinventar a roda a cada novo framework js, vale a pena?
Reinventar a roda a cada novo framework js, vale a pena?
 
Anatomia do JSF, JavaServer Faces
Anatomia do JSF, JavaServer FacesAnatomia do JSF, JavaServer Faces
Anatomia do JSF, JavaServer Faces
 
JavaServer Faces Produtividade em Desenvolvimento
JavaServer Faces Produtividade em DesenvolvimentoJavaServer Faces Produtividade em Desenvolvimento
JavaServer Faces Produtividade em Desenvolvimento
 
Palestra Demoiselle V1.x no 11 FISL
Palestra Demoiselle V1.x no 11 FISL Palestra Demoiselle V1.x no 11 FISL
Palestra Demoiselle V1.x no 11 FISL
 
Java Web Fácil com VRaptor
Java Web Fácil com VRaptorJava Web Fácil com VRaptor
Java Web Fácil com VRaptor
 
JSF 2.0 e ScrumToys
JSF 2.0 e ScrumToysJSF 2.0 e ScrumToys
JSF 2.0 e ScrumToys
 
Introdução ao JavaServer Faces
Introdução ao JavaServer FacesIntrodução ao JavaServer Faces
Introdução ao JavaServer Faces
 
JSF - JavaServer Faces
JSF - JavaServer FacesJSF - JavaServer Faces
JSF - JavaServer Faces
 
Desenvolvimento de Aplicações com Zend Framework e Yahoo! User Interface
Desenvolvimento de Aplicações com Zend Framework e Yahoo! User InterfaceDesenvolvimento de Aplicações com Zend Framework e Yahoo! User Interface
Desenvolvimento de Aplicações com Zend Framework e Yahoo! User Interface
 
Demoiselle - Arquitetura
Demoiselle - ArquiteturaDemoiselle - Arquitetura
Demoiselle - Arquitetura
 
JavaServer Faces - Desenvolvendo aplicações web com produtividade
JavaServer Faces - Desenvolvendo aplicações web com produtividadeJavaServer Faces - Desenvolvendo aplicações web com produtividade
JavaServer Faces - Desenvolvendo aplicações web com produtividade
 
JSF 2 e Primefaces - 4º Encontro Mensal do Gojava
JSF 2 e Primefaces - 4º Encontro Mensal do GojavaJSF 2 e Primefaces - 4º Encontro Mensal do Gojava
JSF 2 e Primefaces - 4º Encontro Mensal do Gojava
 
CDI -Contextos e Dependências
CDI -Contextos e DependênciasCDI -Contextos e Dependências
CDI -Contextos e Dependências
 
Introdução a CDI e como utilizá-la em aplicações reais
Introdução a CDI e como utilizá-la em aplicações reaisIntrodução a CDI e como utilizá-la em aplicações reais
Introdução a CDI e como utilizá-la em aplicações reais
 
JSF2 ScrumToys SestInfo 2010
JSF2 ScrumToys SestInfo 2010JSF2 ScrumToys SestInfo 2010
JSF2 ScrumToys SestInfo 2010
 
PHP FrameWARks - Zend Framework
PHP FrameWARks - Zend FrameworkPHP FrameWARks - Zend Framework
PHP FrameWARks - Zend Framework
 
Spring: uma introdução prática
Spring: uma introdução práticaSpring: uma introdução prática
Spring: uma introdução prática
 
JBoss Portlet Bridge
JBoss Portlet BridgeJBoss Portlet Bridge
JBoss Portlet Bridge
 
JavaFX 1.2
JavaFX 1.2JavaFX 1.2
JavaFX 1.2
 
Java: Por onde começar nos dias de hoje?
Java: Por onde começar nos dias de hoje?Java: Por onde começar nos dias de hoje?
Java: Por onde começar nos dias de hoje?
 

Similaire à J boss seam

Similaire à J boss seam (20)

JBoss5 @ FISL
JBoss5 @ FISLJBoss5 @ FISL
JBoss5 @ FISL
 
Tutorial JBoss Seam
Tutorial JBoss Seam Tutorial JBoss Seam
Tutorial JBoss Seam
 
Curso jsf
Curso jsfCurso jsf
Curso jsf
 
Produtividade com JavaServer Faces
Produtividade com JavaServer FacesProdutividade com JavaServer Faces
Produtividade com JavaServer Faces
 
Sistema S2DG e Tecnologias Web
Sistema S2DG e Tecnologias WebSistema S2DG e Tecnologias Web
Sistema S2DG e Tecnologias Web
 
Jboss Seam
Jboss SeamJboss Seam
Jboss Seam
 
JSF & REST
JSF & RESTJSF & REST
JSF & REST
 
JSF e outras tecnologias Java Web - IMES.java
JSF e outras tecnologias Java Web - IMES.javaJSF e outras tecnologias Java Web - IMES.java
JSF e outras tecnologias Java Web - IMES.java
 
Enterprise Java Beans
Enterprise Java BeansEnterprise Java Beans
Enterprise Java Beans
 
Maratona JBoss 2010 - JBoss-ESB
Maratona JBoss 2010 - JBoss-ESBMaratona JBoss 2010 - JBoss-ESB
Maratona JBoss 2010 - JBoss-ESB
 
J2EE Na Vida Real
J2EE Na Vida RealJ2EE Na Vida Real
J2EE Na Vida Real
 
EJB
EJBEJB
EJB
 
GUJavaSC - Mini-curso Java EE
GUJavaSC - Mini-curso Java EEGUJavaSC - Mini-curso Java EE
GUJavaSC - Mini-curso Java EE
 
Serra StarTec 2013 - Java EE
Serra StarTec 2013 - Java EESerra StarTec 2013 - Java EE
Serra StarTec 2013 - Java EE
 
Jboss tutorial
Jboss tutorialJboss tutorial
Jboss tutorial
 
Workshop05
Workshop05Workshop05
Workshop05
 
BDD JBehave
BDD JBehaveBDD JBehave
BDD JBehave
 
EJB 3.1
EJB 3.1EJB 3.1
EJB 3.1
 
Os 10 maus hábitos dos desenvolvedores JSF
Os 10 maus hábitos dos desenvolvedores JSFOs 10 maus hábitos dos desenvolvedores JSF
Os 10 maus hábitos dos desenvolvedores JSF
 
Java CDI: Usando Java CDI em projetos Jakarta EE ou Microprofile
Java CDI: Usando Java CDI em projetos Jakarta EE ou MicroprofileJava CDI: Usando Java CDI em projetos Jakarta EE ou Microprofile
Java CDI: Usando Java CDI em projetos Jakarta EE ou Microprofile
 

Plus de jornaljava

Por dentro da nuvem
Por dentro da nuvemPor dentro da nuvem
Por dentro da nuvemjornaljava
 
Jornal java por dentro da nuvem
Jornal java por dentro da nuvemJornal java por dentro da nuvem
Jornal java por dentro da nuvemjornaljava
 
Banco de Dados NoSql - JornalJava
Banco de Dados NoSql - JornalJavaBanco de Dados NoSql - JornalJava
Banco de Dados NoSql - JornalJavajornaljava
 
Criando um simples portlet com jboss portal
Criando um simples portlet com jboss portalCriando um simples portlet com jboss portal
Criando um simples portlet com jboss portaljornaljava
 

Plus de jornaljava (7)

Por dentro da nuvem
Por dentro da nuvemPor dentro da nuvem
Por dentro da nuvem
 
Jornal java por dentro da nuvem
Jornal java por dentro da nuvemJornal java por dentro da nuvem
Jornal java por dentro da nuvem
 
Banco de Dados NoSql - JornalJava
Banco de Dados NoSql - JornalJavaBanco de Dados NoSql - JornalJava
Banco de Dados NoSql - JornalJava
 
Criando um simples portlet com jboss portal
Criando um simples portlet com jboss portalCriando um simples portlet com jboss portal
Criando um simples portlet com jboss portal
 
Jpa
JpaJpa
Jpa
 
Facelets
FaceletsFacelets
Facelets
 
Rich faces
Rich facesRich faces
Rich faces
 

J boss seam

  • 2. O que é Jboss Seam? Segundo a definição da Palavra: Seam = Emenda Seam não é um acrônimo (SEAM): Stop Enterprise Application Masochism Software for Enterprise Application Masterpieces
  • 3. O que é Jboss Seam? 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
  • 4. O que é Jboss Seam? Versão atual de produção: 2.1.2.GA Comunidade extremamente ativa: www.seamframework.org Mais de 1.000 usuários registrados no primeiro mês Atualmente, mais de 5.000 usuários registrados
  • 5. O que é Jboss Seam? De acordo com o site oficial : Seam é um framework para Java Enterprise (JavaEE) Seam não é simplesmente outro framework de Integração Não é também uma resposta ao Spring Framework.
  • 6. O que é Jboss Seam? Componente unificado: Managed Beans (EJB3) Extensão dos contextos Java Servlet, com a adição do escopo “Conversation” Gerenciamento do PersistenceContext Não faz distinção entre os componentes da camada de apresentação e camada de negócios:business logic components Você cria sua arquitetura e define suas camadas
  • 7. O que é Jboss Seam?  Integração entre  JSF e EJB 3.0 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) Além de não depender do JSF para a camada de Apresentação, o JBoss Seam funciona com ou sem EJB 3.0
  • 8. O que é Jboss Seam? Tipos de componentes Seam: JavaBeans EJB 3.0: Stateless Session Beans Stateful Session Beans Entity Beans Message-Driven Beans
  • 9. O que é Jboss Seam? Virtualmente, qualquer classe Java pode se tornar um componente Seam @Name (“meuComponente”) public class meuComponente { ... ... }
  • 10. O que é Jboss Seam? Modelo unificado de componentes: Não há distinção entre componentes da camada de apresentação e componentes da camada de negócios: Não se faz necessário o uso de DTO/VO <h:form> <h:inputText value="#{user.name}“ /> <h:inputText value="#{user.telefone}" /> </h:form> @Entity @Name(“user”) public class User { private String name; private String telefone;
  • 11. O que é Jboss Seam? 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: <managed-bean> <managed-bean-name>cadastro</managed-bean-name> <managed-bean-class>demo.Cadastro</managed-bean-class> <managed-bean-scope>session</managed-bean-scope> </managed-bean>
  • 12. O que é Jboss Seam? Elimina camadas/artefatos “desnecessários”: VO/DTO, DAO, Service Locator, OpenSessionInView... VOCÊ monta a arquitetura da sua aplicação, define as camadas e como elas vão interagir
  • 13. O que é Jboss Seam? 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: <h:inputText value="#{user.name}" required="true"> <f:validateLength maximum="30" minimum="3"/> <rich:ajaxValidator/> </h:inputText><br/>
  • 14. O que é Jboss Seam? Possui uma camada de JavaScript remoto: • Acesso aos componentes Seam direto do JavaScript: Integração com: Dojo GWT var meuComp = Seam.Component.newInstance(“meuComp”); meuComp.setXXX(Valor);
  • 15. O que é Jboss Seam? Estende os contextos definidos pela especificação de Servlets: request (event), page, session e application com dois novos contextos: Conversation Business process
  • 16. O que é Jboss Seam? 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
  • 17. O que é Jboss Seam? Conversation (continuação) 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
  • 18. O que é Jboss Seam? 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:
  • 19. O que é Jboss Seam? 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
  • 20. O que é Jboss Seam? Injection: Componente é recuperado de um contexto (ou criado, dependendo da configuração) e injetado em outro componente: @In private User user;
  • 21. Jboss Seam? Outjection: Um componente “ejeta/coloca” outro componente em um contexto: @Out Usuario user; Para criar um componente podemos usar @Factory private void pesquisar() { .... }
  • 22. Configuração do Seam Seam servlet e listener Servlet que processa todas requisições Seam File: /WEB-INF/web.xml <servlet> <servlet-name>Faces Servlet</servlet-name> <servlet-class>javax.faces.webapp.FacesServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> < servlet-mapping> <servlet-name>Faces Servlet</servlet-name> <url-pattern>*.seam</url-pattern> </servlet-mapping>
  • 23. Configuração do Seam Listener, responsável por “startar” o seam e destruir as sessões e contexto de aplicação <listener> <listener-class>org.jboss.seam.servlet.SeamListener</listener-class> </listener>
  • 24. Configuração Arquivos requeridos de configuração: /WEB-INF/faces.config configuração especifica JSF /WEB-INF/components.xml configuração do Seam colocado em META-INF
  • 25. Configuração /WEB-INF/pages.xml Navegação do Seam É opcional, mas recomendado seam.properties Configurações do Seam, geralmente vazio. Deve ser colocado em todo lugar que tiver algum componente Seam (@Name)
  • 26. Configuração Configuração Facelets WEB-INF/faces-config.xml <application> <view-handler>com.sun.facelets.FaceletViewHandler</view-handler> </application> WEB-INF/web.xml <context-param> <param-name>javax.faces.DEFAULT_SUFFIX</param-name> <param-value>.xhtml</param-value> </context-param>
  • 27. Configuração Seam Filter Requerido para controle de erro, progagação de conversação WEB-INF/web.xml <filter> <filter-name>Seam Filter</filter-name> <filter-class>org.jboss.seam.servlet.SeamFilter</filter-class> </filter> <filter-mapping> <filter-name>Seam Filter</filter-name> <url-pattern>/pattern>/*</url-pattern> </filter-mapping>
  • 28. Configuração Filtro de tratamento de Erros Erros podem ser mapeados para uma página própria para erros File: /WEB-INF/pages.xml <exception class="org.jboss.seam.framework.EntityNotFoundException"> <redirect view-id="/error.xhtml"> <message>Not found</message> </redirect>
  • 29. Exercício 1 Vamos criar nossa primeira aplicação em Jboss Seam ;-) Cadastro de usuários: igual a versão feita em JSF
  • 31. Continuando... 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
  • 32. Validação 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) • 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
  • 33. Validaçã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
  • 34. Validação Hibernate Validator: Esforço de padronização da especificação Bean Validator Validation (JSR 303) Validação na classe de domínio:
  • 35. Validaçã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>
  • 36. Validação 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
  • 37. Validação (Decorate) <ui:composition xmlns="http://www.w3.org/1999/xhtml"                xmlns:ui="http://java.sun.com/jsf/facelets"                xmlns:h="http://java.sun.com/jsf/html"                xmlns:f="http://java.sun.com/jsf/core"                xmlns:s="http://jboss.com/products/seam/taglib">                     <div>            <s:label styleClass="#{invalid?'error':''}">            <ui:insert name="label"/>            <s:span styleClass="required" rendered="#{required}">*</s:span>        </s:label>                <span class="#{invalid?'error':''}">            <h:graphicImage value="/img/error.gif" rendered="#{invalid}"/>            <s:validateAll>                <ui:insert/>            </s:validateAll>        </span>        <s:message styleClass="error"/>       </div>    </ui:composition>
  • 38. Validação (Decorate) Para usar, basta colocar informar o decorate como um template <s:decorate template="edit.xhtml">        <ui:define name="label">Country:</ui:define>        <h:inputText value="#{location.country}" required="true"/ </s:decorate>
  • 39. Exercício 2 Usando validação na tela criada anteriormente <s:decorate id="d1" template="layout/edit.xhtml"> <ui:define name="label">Nome:</ui:define> <h:inputText id="username" value="#{pessoa.nome}" required="true" requiredMessage="Campo Obrigatório"/> </s:decorate>
  • 40. Validação (Ajax) Usando validação com ajax <s:decorate id="d1" template="layout/edit.xhtml"> <ui:define name="label">Nome:</ui:define> <h:inputText id="username" value="#{pessoa.nome}" required="true“> <a4j:support event="onblur" reRender="d1"/> </h:inputText> </s:decorate>
  • 41. Exercício 3 Inserir validação no sistema, fazer testes com validações,testar também o <rich:beanValidator /> Obs: Usando o rich:beanValidator não se faz necessário o uso do <s:validate>, <s:decorate> <h:inputText id="telefone" value="#{pessoa.telefone}" required="true" requiredMessage="Obrigatrio"> <rich:beanValidator summary=“Telefone Inválido" /> </h:inputText> <rich:message for="telefone"/>
  • 42. Tabelas de Dados Para facilitar ainda mais, o Seam possui a anotação: “DataModel” @DataModel List<Pessoa> pessoas; Pode ser usado com: List, Map, Set ou Object[], assim como o JSF DataModel
  • 43. Exercício 4 Trocar o @Out por @Datamodel
  • 44. Tabelas de Dados Obtendo valores selecionados em uma tabela @DataModelSelection Pessoa pessoaSelecionada
  • 45. Exercício 5 Usar o DataModelSelection para obter o objeto selecionado Criar um método para apagar esse objeto
  • 46. Navegação Stateful navigation Pageflow é definido fora dos componentes Valores de retorno das actions são avaliados Navegação clássica: método da action que decide para onde ir Pageflow é definido para uma simples conversação
  • 47. Navegação <page view-id="/cadastro.xhtml" > <begin-conversation join="true"/> <navigation> <rule if-outcome="lista"> <redirect view-id="/cadastroPessoa.xhtml"/> </rule> </navigation> </page> public String salvar() { public String salvar() { .... .... return "lista"; return “/cadastroPessoa.xhtml"; } }
  • 48. Navegação <page view-id="/cadastroPessoa.xhtml"> <navigation from-action="#{cadastroPessoaAction.apagar()}"> <redirect view-id="/sucesso.xhtml"/> </navigation> </page>
  • 49. Navegação <page view-id="/cadastroPessoa.xhtml"> <navigation from-action="#{cadastroPessoaAction.apagar()}"> <rule if-outcome="success"> <redirect view-id="/sucesso.xhtml"/> </rule> </navigation> </page> <page view-id="/cadastro.xhtml" > <action execute="#{cadastroPessoaAction.listar()}"/> </page> <page view-id="/cadastro.xhtml" > <action if=“#{condicao}” execute="#{cadastroPessoaAction.listar()}"/> </page>
  • 50. Navegação <page view-id=“*/login.xhtml"> <navigation from-action="#{identity.login}"> <rule if="#{identity.loggedIn}"> <redirect view-id="/home.xhtml"/> </rule> </navigation> </page> <page view-id=“*/login.xhtml“ login-required="true”> ..... </page>
  • 51. Navegação <pages> <page view-id="/search.xhtml"> <param name="searchPattern" value="#{searchService.searchPattern}"/> </page> ... </pages> Metodo é executado antes da página ser renderizada. <page view-id="/entry.xhtml" action="#{entryAction.loadBlogEntry(blogEntry.id)}"> <param name="blogEntryId" value="#{blogEntry.id}” validator="#{Validator}" required="true"/> </page>
  • 52. Navegação Pode-se também obter o parâmetro na própria Action implementando um RequestParameter @RequestParameter private Long entryId; public void findEntry() { blogentry = em.find(Blogentry.class, entryId); }
  • 53. Exercício 6 Fazer um exercício de navegação usando o pages.xml Criar 3 páginas e navegar entre elas usando o pages.xml Usar chamada de metodo direto no pages.xml
  • 54. Contextos Seam Stateless Event context Page context Session Business Application
  • 55. Contextos Seam Stateless: Mesmo conceito do Stateless do EJB criado justamente para integração com este tipo de EJB. Event context: Como o nome mesmo diz os objetos registrados neste contexto apenas vão estar disponíveis durante a execução de um determinado evento. Page context: Contexto já conhecido por todos que trabalham com aplicações web, está associado ao processo de renderização, carregamento, carregamento de uma página.
  • 56. Contextos Seam Conversation context: É um dos contextos que diferencia o Seam de qualquer outro framework existente no mercado, com este contexto podemos criar unidades de conversação e registrar nestas unidade todos os objetos e serviços que a aplicação vai necessitar usar quando a mesma estiver sendo executada sobre este contexto. Neste contexto mesmo outras instâncias da aplicação sendo acessadas em janelas diferentes não terão acesso aos artefatos registrados no contexto da outra, ou seja, a cada nova instância da aplicação em uma nova janela se caracteriza como uma instância independente assim uma não terá acesso as informações da outra mesmo sendo executadas na mesma instância do browser.
  • 57. Contextos Seam Session context: Este também é muito conhecido por todos que trabalham com aplicações Em resumo este contexto inicia quando acessamos a primeira tela da aplicação e só será destruído quando fecharmos nosso browser ou fazermos um logoff implementado pela aplicação.
  • 58. Contextos Seam Application context: E por último o também já conhecido contexto de aplicação, tudo que registrarmos neste contexto fica disponível para todos que acessarem a mesma aplicação, ou seja, devemos registrar neste contexto somente serviços que serão acessados por todos e que são imutáveis pois este contexto só é atualizado no startup do servidor web.
  • 59. Contextos Seam Business process context: Mais um contexto novo criado pelo Seam, este foi criado especialmente para trabalharmos com fluxos de trabalho (workflow), ele garante para nós que qualquer objeto ou serviço registrado neste contexto vai estar disponível até o fim do fluxo. O mesmo fica disponível para múltiplas interações e múltiplos usuários e seu estado é persistente, ou seja, se eu fechar a aplicação e no dia seguinte entrar novamente, os objetos registrados no fluxo em questão estarão ali com as informações deixadas pela última vez.
  • 60. Contextos Seam Contexto Padrão: Depende do tipo do componente: Stateless Session Beans? Default em contexto Stateless Entities Default em contexto Conversation
  • 61. Contextos Seam Message-Driven Beans? Padrão sem contexto Stateful Session Beans? Padrão em contexto de Conversação JavaBeans? Padrão em contexto de evento
  • 62. Contextos Seam Iniciando e Encerrando uma Conversação Anotação @Begin public void checkoutShoppingCart(){ // ... @End public void confirmCheckout(){
  • 63. Contextos Seam Navegação (pages.xml) <page view-id="/messageList.jsp" action="#{conversation.begin}"/> Ou <page view-id="/messageList.jsp"> <begin-conversation /> <page> <page view-id="/home.jsp"> <end-conversation/> <page>
  • 64. Contextos Seam Em um link JSF <h:commandLink action="main" value="Select Hotel"> <s:conversationPropagation type="begin"/> </h:commandLink> <h:commandLink action="main" value="Exit"> <s:conversationPropagation type="end"/> </h:commandLink> Em um Link Seam s:link <s:link view="/checkout.xhtml" propagation="begin"/> <s:link view="/confirm.xhtml" propagation="end"/>
  • 65. Contextos Seam Propagando a conversação Propaga por padrão Pode ser finalizada <s:link view="/main.xhtml" propagation="none"/> <h:commandLink action="main" value="Exit"> <f:param name="conversationPropagation" value="none"/> </h:commandLink> <h:commandLink action="main" value="Exit"> <s:conversationPropagation type="none"/> </h:commandLink>
  • 66. Exercícios 7 Abrir e fechar conversação Trocar contextos
  • 67. Eventos Tipos de Eventos Page action – ocorre antes que a página é carregada Pode ser definido para uma determinada página WEB-INF/pages.xml <pages> <page view-id="/hello.jsp" action="#{helloWorld.sayHello}"/> </pages>
  • 68. Eventos Pode-se usar “wildcard” para várias páginas WEB-INF/pages.xml <pages> <page view-id="/hello/*" action="#{helloWorld.sayHello}"/> </pages>
  • 69. Eventos Pode-se também passar parâmetros WEB-INF/pages.xml <pages> <page view-id="/hello.jsp" action="#{helloWorld.sayHello}"> <param name="firstName" value="#{person.firstName}"/> <param name="lastName" value="#{person.lastName}"/> </page> </pages>
  • 70. Eventos Pode-se também lançar um evento em uma Action @Name("helloWorld") public class HelloWorld { public void sayHello() { FacesMessages.instance().add("Hello World!"); Events.instance().raiseEvent("hello"); } }
  • 71. Eventos Pode-se também lançar um evento em uma Action @Name("helloWorld") public class HelloWorld { @RaiseEvent("hello") public void sayHello() { FacesMessages.instance().add("Hello World!"); } }
  • 72. Eventos Capturando os eventos @Name("helloListener") public class HelloListener { @Observer("hello") public void sayHelloBack() { FacesMessages.instance().add("Hello to you too!"); } }
  • 73. Exercício 8 Lançar e capturar eventos
  • 74. Exceções O desenvolvedor determina como tratar uma exceção Via anotação Declarativamente em um arquivo XML Seam aplica todas regras de rollback das exceções EJB para os componentes JavaBeans Seam da um rollback em qualquer transação ativa quando ocorre uma exceção
  • 75. Exceções Capturando exceções usando Annotações @Redirect(viewId="/failure.xhtml", end=true) @ApplicationException(rollback=true) public class UnrecoverableApplicationException extends RuntimeException { ... }
  • 76. Exceções Capturando exceções usando XML pages.xml <pages> <exception class="javax.persistence.EntityNotFoundException"> <http-error error-code="404"/> </exception> <exception class="javax.persistence.PersistenceException"> <end-conversation/> <redirect view-id="/error.xhtml"> <message>Database access failed</message> </redirect> </exception>
  • 77. Exceções Capturando exceções usando XML pages.xml <exception> <end-conversation/> <redirect view-id="/error.xhtml"> <message>Aconteceu um Erro ;-(</message> </redirect> </exception>
  • 78. Exceções Usando EL nas Exceções Exceções são adicionadas no contexto de conversação org.jboss.seam.handledException <pages> <exception class="org.jboss.seam.security.AuthorizationException"> <end-conversation/> <redirect view-id="/error.xhtml"> <message severity="WARN">#{handledException.message}</message> </redirect> </exception> </pages>
  • 79. Exercício 9 Vamos lancar e capturar algumas exception Lançar Runtime e Exception para ver a diferença Criar uma tela de erro customizada Obs: não esquecer de desabilitar : debug (component.xml) facelets.DEVELOPMENT (web.xml)
  • 80. Segurança O Seam Security API fornece uma multiplicidade de funções relacionadas com segurança para seu aplicativo, abrangendo áreas como: Autenticação - permite os usuários autenticar em qualquer fornecedor de segurança. (LDAP, JAAS..) Identity Management - uma API para gerenciar uma aplicação Seam, usuários e papéis em tempo de execução.
  • 81. Segurança Autorização - um framework extremamente abrangente, baseado em regras de permissões Permission Management - um conjunto de componentes Seam para permitir uma fácil gestão da aplicação da política de segurança. CAPTCHA - para ajudar na prevenção de um software automatizado / scripts abusar seu sistema.
  • 82. Autenticação A autenticação fornecida pelo Seam é construída utilizando o JAAS (Java autenticação e autorização de serviço), e como tal, fornecer uma robusta e altamente configurável API para manipulação de autenticação do usuário. No entanto, para exigências menos complexas de autenticação, o Seam oferece um método mais simplificado de autenticação que esconde a complexidade do JAAS.
  • 83. Autenticação O método de autenticação simplificada fornecido pelo Seam utiliza um built-in JAAS login módulo:SeamLoginModule, que delega a autenticação para um de seus próprios componentes Seam. Este módulo de login já está configurado dentro Seam como parte de uma aplicação padrão e, como tal, não requer qualquer configuração adicional arquivos. Configurar esta forma simplificada de autenticação exige a configuração no arquivo: components.xml: <security:identity authenticate-method="#{authenticator.authenticate}"/>
  • 84. Autenticação Escrevendo uma tela de Autenticação: <div>    <h:outputLabel for="name" value="Username"/>    <h:inputText id="name" value="#{credentials.username}"/></div><div>    <h:outputLabel for="password" value="Password"/>    <h:inputSecret id="password" value="#{credentials.password}"/></div><div>    <h:commandButton value="Login" action="#{identity.login}"/> </div>
  • 85. Autenticação Escrevendo um método de Autenticação: @Name("authenticator") public class Authenticator { @In EntityManager entityManager; @In Credentials credentials; @In Identity identity; public boolean authenticate() {       try {          User user = (User) entityManager.createQuery(             "from User where username = :username and password = :password")             .setParameter("username", credentials.getUsername())             .setParameter("password", credentials.getPassword())             .getSingleResult();          if (user.getRoles() != null) {             for (UserRole mr : user.getRoles())                identity.addRole(mr.getName());          }          return true;       }       catch (NoResultException ex) {          return false;       }    } }
  • 86. Autenticação Tratando possíveis exceções: <pages>   ...    <exception class="org.jboss.seam.security.NotLoggedInException">        <redirect view-id="/login.xhtml">            <message>You must be logged in to perform this action</message>        </redirect>    </exception>    <exception class="org.jboss.seam.security.AuthorizationException">        <end-conversation/>        <redirect view-id="/security_error.xhtml">            <message>You do not have the necessary security privileges to perform this action.</message>        </redirect>    </exception> </pages>
  • 87. Autenticação Redirecionando os usuários após o login component.xml <event type="org.jboss.seam.notLoggedIn"> <action expression="#{redirect.captureCurrentView}"/> </event> <event type="org.jboss.seam.postAuthenticate"> <action expression="#{redirect.returnToCapturedView}"/> </event>     ... </pages>
  • 88. Autenticação Você pode redirecionar o usuário sem autenticidade para uma página de login quando ele tentar acessar uma determinada página <pages login-view-id="/login.xhtml">    <page view-id="/members/*" login-required="true"/>   <page view-id="/cadatro.xhtml" login-required="true"/> </pages>
  • 89. Autorização Há uma série de mecanismos de autorização fornecida pelo Seam Security API para garantir o acesso aos componentes, métodos, e nas páginas. Componentes: @Restrict("#{s:hasRole('admin')}") public void delete() { Páginas: <h:form class="loginForm" rendered="#{not identity.loggedIn}"> <page view-id="/reports.xhtml“><restrict>#{s:hasRole('admin')}</restrict></page> <h:outputLink action="#{reports.salvar}" rendered="#{s:hasRole('manager')}">Salvar </h:outputLink>
  • 90. Exercício 10 Vamos implementar a segurança na aplicação Criar 2 perfis e alternar o acesso a botões e páginas