Escolar Documentos
Profissional Documentos
Cultura Documentos
Introduo ao Seam
Seam simplifica Java EE: Seam fornece um conjunto de atalhos e simplificaes do framework padro Java EE, tornando fcil e eficaz o uso de componentes web e de negcios Java EE.
Application Components
JSF
JSP/
Servlets
JAX-WS
EJB3/JPA
...
JNDI
RMI
JAXP
JDBC
...
Alm das APIs e dos diversos componentes descritos na figura 1-1, Java EE tambm
fornece servios de deployment, servio de segurana em tempo de execuo, e outros
que voc precisa para criar aplicaes eficazes. E Java EE fornece um conjunto de
melhorias em relao ao framework predecessor, o J2EE, por exemplo:
As anotaes do Java 5.0 esto integradas por toda a API no Java EE,
oferecendo a voc a opo de utilizar as anotaes tanto como informao
externa para deployment no formato XML ou embutidas no cdigo.
O Java Server Faces (JSF) 1.2, o Java API para XML baseados em Web Services
(JAX-WS) 2.0, as APIs Enterprise JavaBeans (EJB) 3.0 oferecem modelos de
programao mais fceis em relao ao predecessor J2EE, permitindo a voc
implementar boa parte dos componentes web, web service e de negcios
usando simples JavaBeans.
EJB 3.0 elimina a necessidade por muitas das interfaces e outros artefatos
exigidos na maioria dos casos, pelas verses anteriores do EJB .
Mesmo com as melhorias apresentadas pelo Java EE, o time do JBOSS Seam
visualizou espao para simplificar as coisas ainda mais. A Figura 1-2 descreve o
framework Seam entre duas camadas, a camada do cdigo de sua aplicao e a camada
do framework Java EE.
Application Components
Seam Framework
Conversao
jBPM
Regras JBoss
Modelo de Componente
JSP/
Servlets
JSF
EJB3/JPA
JAX-WS
...
JNDI
RMI
JDBC
JAXP
...
conectar o bean com o nome do managed bean JSF atravs do arquivo facesconfig.xml.
O modelo de componente do Seam tambm suporta uma viso mais abrangente de
dependncia por injeo, chamada de bijeo. A dependncia por injeo padro
envolve uma nica inicializao da referncia do bean dentro do componente,
geralmente feito por um tipo de container ou outro servio runtime. A bijeo no Seam
estende este conceito para suportar o seguinte:
dados. Esta opo dar ao usurio um formulrio de entrada de dados que apresenta
os atributos necessrios, e durante a submisso de um novo dispositivo, o mesmo ser
armazenado no banco de dados e atualizado na lista de dispositivos que sero
apresentados novamente.
Podemos representar o desenho da soluo neste ponto com um diagrama de
fluxo de pgina e um diagrama de banco relacional. O fluxo de pgina para a primeira
interao do Catlogo de Dispositivos apresentado na Figura 1-3 e a estrutura do
banco de dados na Figura 1-4:
Salvar
Adicionar
Dispositivo
Lista de
Dispositivos
Formulrio
de Entrada
Char(3)
Desc
Varchar(100)
Agora tudo o que temos que fazer construir. Como referncia, vamos primeiro ver
como o Catlogo de Dispositivos no framework Vanilla Java EE.
@Entity
@Table(name=GADGET)
public class GadgetBean implements Serializable {
private String mDescription = ;
private String mType = ;
public GadgetBean() { }
@Id
@Column(name=DESCR)
public String getDescription() {
return mDescription;
}
public void setDescription(String desc) {
mDescription = desc;
}
@Id
@Column(name=TYPE)
public String getType() {
return mType;
}
public void setType(String t) {
mType = t;
}
}
Dica Prtica
Esta sesso EJB usa o padro EJB 3.0 e chamadas Java Persistence API (JPA) para
implementar as funes exigidas. Ns as marcamos como session bean sem estado
usando a anotao @Stateless do EJB 3.0 na declarao da classe. Tambm usamos
</h:column>
<h:column>
<f:facet name=header>
<h:outputText value=Description />
</f:facet>
<h:outputText value=#{g.description} />
</h:column>
</h:dataTable>
<h:form>
<! Link to add a new gadget >
<h:commandLink action=addGadget>
<h:outputText value=Add a new gadget />
</h:commandLink>
</h:form>
</f:view>
</body>
</html>
A ao addGadget deve nos trazer a segunda pgina no nosso fluxo, a pgina com
o formulrio de entrada de dispositivos. A pgina JSF que implementa isto, a
addGadget.jsp, apresentada na Listagem 1-4.
Listagem 1-4 Pgina JSF de entrada de dispositivos.
<%@ taglib uri=http://java.sun.com/jsf/html prefix=h%>
<%@ taglib uri=http://java.sun.com/jsf/core prefix=f%>
<html>
<head>
<title>Add a Gadget</title>
</head>
<body>
<f:view>
<h:form>
<table border=0">
<tr>
<td>Description:</td>
<td>
<h:inputText value=#{gadget.description}
required=true />
</td>
</tr>
<tr>
<td>Type:</td>
<td>
<h:selectOneMenu value=#{gadget.type}
required=true>
<f:selectItems value=#{gadgetAdmin.gadgetTypes} />
10
</h:selectOneMenu>
</td>
</tr>
</table>
<h:commandButton type=submit value=Create
action=#{gadgetAdmin.newGadget} />
</h:form>
</f:view>
</body>
</html>
Mas o que voc descobrir que isto no ir funcionar, pelo menos no do jeito
que voc esperava. Em JSF, espera-se que os managed beans sejam simples JavaBeans,
e eles sero tratados assim em runtime pelo container JSF. Quando o bean gadget ou
gadgetAdmin, so criados e usados em tempo de execuo, para estes beans o container
JSF no segue as regras dos componentes EJB. Ele no ir, por exemplo, usar o
container EJB para obter uma instncia do GadgetAdminBean, como deveria para
qualquer bean de sesso. Ao contrrio, ele tentar construir instncias do
GadgetAdminBean diretamente, fora do container EJB e de todos os seus servios. E