Seam Framework
Básico
Cleverson Sacramento
[email protected]
\\ZYCNOTE\Seam\
Agenda
• Ambiente
• Introdução
• Componentes Contextuais
• Mapeamento Objeto-Relacional
• Seam Application Framework
Objetivo
• Conhecer o básico do SEAM
• Overview quase completo
• Desmistificar o SEAM
Ambiente
C:\lab-01
eclipse-3.4
jboss-4.2.3.GA
jboss-seam-2.1.0.SP1
squirrel-sql-2.6.8
workspace
reference
lab01
Ambiente
Iniciar  Executar
cmd<ENTER>
cd
\lab<TAB>\jbo<TAB><TAB><ENTER>
c:\lab-01\jboss-seam-2.1.0.SP1>_
seam
setup<ENTER>
Ambiente
• seam-gen
Criador automatizado de projetos Seam
<ENTER><ENTER><ENTER><ENTER>
<ENTER><ENTER><ENTER><ENTER>
<ENTER><ENTER>...
Ambiente
• seam-gen
01.
02.
03.
04.
05.
06.
07.
08.
09.
10.
11.
Enter your Java project workspace
Enter your JBoss home directory
Enter the project name
Do you want to use ICEfaces instead of RichFaces
Select a RichFaces skin
Is this project deployed as an EAR
Enter the Java package name for your session beans
Enter the Java package name for your entity beans
Enter the Java package name for your test cases
What kind of database are you using?
Enter the Hibernate dialect for your database
Ambiente
• seam-gen
12.
13.
14.
15.
16.
17.
18.
19.
20.
Enter the filesystem path to the JDBC driver jar
Enter JDBC driver class for your database
Enter the JDBC URL for your database
Enter database username
Enter database password
Enter the database schema name
Enter the database catalog name
Are you working with tables that already exist in the
database?
Do you want to drop and recreate the database
tables and data in import.sql each time you deploy?
Ambiente
• seam-gen
BUILD SUCCESSFUL
Total time: X minutes Y second
c:\lab-01\jboss-seam-2.1.0.SP1>_
seam
create-project<ENTER>
Introdução
• Conceito
Tradução de seam: costura
Costura diversas tecnologias:
JSP + JSF + RichFaces + Facelets +
EJB + JPA + Hibernate + WS + ...
Componentes Contextuais
• Componentes
Componentes Seam
Classes do Seam
Classes suas
Tipos primitivos do Seam
Tipos primitivos seus
Componentes Contextuais
• Componentes
Componentes Seam
seam
X
@Name
(“a”)
“a”
@Name
(“b”)
“b”
@Entity
(“c”)
“d”
@Name
(“d”)
aplicação
Componentes Contextuais
• Componentes
O Seam invoca o construtor, você não!
seam
A
new
X
X
“b”
B
aplicação
A
seam
new
B
aplicação
Componentes Contextuais
• Componentes
Ciclo de vida
alguém invoca o componente “a”
se o componente “a” não existir então
se existir fábrica para “a” então
invoca a fábrica e recebe uma instância de “a”
senão
invoca o construtor padrão da classe de “a”
fim se
guarda a instância de “a” criada
injeta na instância tudo que for necessário
executa o método anotado com @Create, caso exista
fim se
entrega a instância do componente “a” para quem pediu
Componentes Contextuais
• Componentes
Anotações
@Name rotula uma classe como um componente
@Factory define uma fábrica para um componente
@Create define o método do componente que será
invocado imediatamente após a sua criação
@AutoCreate indica que o componente será criado
assim que for chamado, sem a necessidade de tornar
explícito com o create=true
@In injeta na classe um componente
@Out ejeta para o Seam um novo componente
Componentes Contextuais
• Componentes
Prática
1.
2.
3.
4.
5.
Criar uma classe UsuarioAction e rotulá-la como um
componente;
Criar uma classe UsuarioService e rotulá-la como um
componente;
Criar o método boolean autenticar(String login, String
senha) em UsuarioService;
Criar um método String autenticar() em UsuarioAction,
que invoque o Service passando valores fixos;
Invoque o método autenticar() do componente da classe
UsuarioAction;
ex: no home.xhtml faça assim:
<s:button value="autenticar" action="#{usuarioAction.autenticar}" />
Componentes Contextuais
• Contexto
Stateless context
Event (or request) context
Page context
Conversation context
Session context
Business process context
Application context
Componentes Contextuais
• Contexto
Stateless: não guarda estado
Stateful: guarda estado. Todos os outros contextos
guardam contexto, mas por quanto tempo?
Componentes Contextuais
• Contexto
Anotações
@Begin inicia um novo contexto de conversação
flushMode = FlushModeType.MANUAL
@End finaliza o contexto de conversação
TAG
<begin-conversation />
flush-mode="MANUAL“
<end-conversation />
Componentes Contextuais
• Contexto
Finalizando conversações:
• Marks a method as ending a conversation, if the
method returns a non-null outcome without
throwing an exception. (…)
• A null outcome never ends the conversation.
• If the method is of type void, the conversation
always ends.
Componentes Contextuais
• Contexto
Finalizando conversações:
@End
public String test1() { return “” };
@End
public void test2() {};
public void test3() {};
@End
public String test4() {
throw new RuntimeException(“pam!”); return “oi”;
};
Componentes Contextuais
• Contexto
Prática
1.
2.
Crie duas páginas: passo1.xhtml e passo2.xhtml;
Crie as seguintes propriedades na classe UsuarioAction:
1.
2.
3.
4.
3.
4.
5.
6.
String login; String senha;
String email;
Date nascimento;
boolean ativo;
Em passo1.xhtml crie dois campos do tipo texto para
guardar informações de nome e email. Crie um botão
próximo que faz link com passo2.xhtml;
Em passo2.xhtml crie dois campos para guardar as
informações de nascimento e ativo. Crie um botão anterior
que faz link com passo1.xhtml;
Crie um botão finalizar em passo2.xhtml que finaliza a
conversação;
Acesse passo1.xhtml pela barra de endereços do browser;
Mapeamento Objeto Relacional
• Configuração
*-ds.xml
Configuração do banco de dados
persistence.xml
Configuração do JPA (Hibernate 3)
components.xml
Configuração do Seam
import.sql
Script de carga inicial
Mapeamento Objeto Relacional
• Configuração
entityManager
components.xml
factory
@In (“entityManager”)
persistence.xml
UsuarioDAO
jndi
*-ds.xml
Mapeamento Objeto Relacional
• Entidade
É um DTO
(Data Transfer Object) que será persistido.
Usuario
1
*
Telefone
0 ..
1
Tipo
*
Mapeamento Objeto Relacional
• Entidade
Anotações
@Entity indica que uma classe é uma entidade
@Id define o campo ID da entidade
@GeneratedValue gera valores automaticamente
@NotNull define o atributo como obrigatório
@Length define o tamanho do campo
Mapeamento Objeto Relacional
• Entidade
Prática
1.
Crie a classe Usuario e coloque os seguintes atributos:
1.
2.
3.
4.
5.
6.
2.
3.
4.
5.
6.
Long id;
String login;
String senha;
String email;
Date nascimento;
boolean ativo;
Crie uma propriedade Usuario instance na classe
UsuarioAction;
Remova os demais atributos da classe UsuarioAction;
Faça o exercício anterior funcionar com esta nova estrutura;
Persista a entidade ao clicar em Finalizar;
Insira 5 usuários no script de carga inicial;
Seam Application Framework
• Introdução
Abstrações que o Seam traz
1. Query Objects
2. Home Objects
3. Controller Objects
Seam Application Framework
• Query Objects
Utilizado para telas de listagem;
Utiliza recursos do JSF, tais como
DataModel e DataModelSelection;
Pode-se incluir restrições às consultas;
Pode-se incluir ordenação às consultas;
Seam Application Framework
• Query Objects
Utilizado para telas de listagem;
Utiliza recursos do JSF, tais como
DataModel e DataModelSelection;
Pode-se incluir restrições às consultas;
Pode-se incluir ordenação às consultas;
Pode ser feito via XML ou herdando a classe
EntityQuery;
Mapeamento Objeto Relacional
• Query Objects
Prática
1.
2.
3.
4.
5.
Crie o componente UsuarioQuery, que lista todos os
usuários;
Crie a view listUsuarios.xhtml, use o <h:dataTable /> ou
o <rich:dataTable />;
Crie o botão remover, para cada elemento da lista, que exclui
o elemento. Use o <h:commandButton /> invocando o
método #{usuarioQuery.remover} exatamente desta
forma: sem parâmetros e sem parênteses;
Crie a view editUsuarios.xhtml e deixe-a vazia;
Crie um link em listUsuarios.xhtml, para cada elemento da
lista, que invoca a view “/editUsuarios.xhtml” passando
como parâmetro o ID da entidade.
Seam Application Framework
• Home Objects
Utilizado para telas CRUD: Create, Read,
Update e Delete;
Espera um parâmetro ID;
Persiste uma entidade;
Geralmente faz uso dos validators
Seam Application Framework
• [OFF-TOPIC] Validators
Executa validações de propriedades
Não serve somente para Entity
Seam Application Framework
• [OFF-TOPIC] Validators
Anotações
@Length valida o tamanho do campo.
@Pest a data está no passado?
@Future a data está no futuro?
@Email verifica se é um e-mail válido.
@Digits verifica se é somente dígito.
Mapeamento Objeto Relacional
• Home Objects
Prática
1.
2.
3.
Crie o componente UsuarioHome;
Modifique a view editUsuario.xhtml para utilizar o helper
UsuarioHome;
Utilize validadores;
Seam Application Framework
• Controller Objects
É um componente Seam para a camada de
apresentação, ou seja, é um Action;
Disponibiliza métodos para acessar o
FacesMessages e o Log;
Só isso!
Mapeamento Objeto Relacional
• Controller Objects
Prática
1.
2.
3.
4.
5.
Modifique a classe UsuarioAction, fazendo-a herdar de
Controller;
Faça que ela se comporte de forma idêntica ao
UsuarioHome;
Retire a anotação @Name do UsuarioHome;
Anote UsuarioAction com @Name ("usuarioHome");
Teste novamente seu CRUD e faça-o funcionar!
Fim
Download

seam