O que ganho usando Jboss Seam?
Autor: Samuel Vinícius | Publicado: 2013-02-07T15:49:00-08:00

Texto direcionado a usuários do JSF 1.2 tratando do uso do Jboss Seam 2.x.




Para quem não conhece, o Seam é um&nbsp;framework destinado ao desenvolvimento WEB criado pelo mesmo criador do Hibernate, Gavin King, e que tem como um de seus principais objetivos facilitar a integração entre&nbsp;JSF e EJB3.

Muitos são os ganhos obtidos pelo uso do Seam, dentre estes irei me ater aos seguintes:

Menos XMLs
Requisições por GET
Facilidade na utilização de ComboBox
Injeção de Dependências via anotações
Facilidade no envio de e-mails
Agendamento de tarefas
URL user friendly
Suporte a transações
Integração com Groovy, Hibernate, Spring, entre outros






Para não estender muito, neste post irei falar dos três primeiros. Falarei dos demais em posts futuros.

1. Menos XMLs
O Seam diminui a utilização de XML em vários aspectos, como por exemplo:

1.1. Navegação
Usando apenas o JSF 1.2, a navegação entre páginas deve ser definida via XML, no arquivo&nbsp;faces-config.xml, e usada por meio de um método no Managed Bean que retorne um String de saída configurada no faces-config.xml. Conforme o exemplo abaixo:

faces-config.xml:
&lt;navegation-rule&gt;
&nbsp; &lt;from-view-id&gt;/person/people.xhtml&lt;/from-view-id&gt; 
&nbsp; &lt;navegation-case&gt; 
&nbsp; &nbsp; &lt;from-outcome&gt;edit&lt;/from-outcome&gt; 
&nbsp; &nbsp; &lt;to-view-id&gt;/person/edit.xhtml&lt;/to-view-id&gt; 
&nbsp; &lt;/navegation-case&gt; 
&lt;/navegation-rule&gt;


Managed Bean:
public String editPeople() {
&nbsp; return "edit";
}


Com o Seam, isso pode ser feito de forma mais simples, apenas retornando o nome da página no&nbsp;método do Managed Bean.

public String editPeople() {
&nbsp;&nbsp; return "/person/edit.xhtml";
}


1.2 Registro de Managed Beans

Para que cada Managed Bean seja utilizado nas views do JSF é necessário que este esteja registrado no faces-config.xml, como mostrado abaixo:

&lt;?xml version="1.0" encoding="UTF-8"?&gt;
  &lt;faces-config version="1.2" xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xi="http://www.w3.org/2001/XInclude"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="htt      p://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_1_2.xsd"&gt;

  &lt;managed-bean&gt;
    &lt;managed-bean-name&gt;people&lt;/managed-bean-name&gt;
    &lt;managed-bean-class&gt;br.com.People&lt;/managed-bean-class&gt;
    &lt;managed-bean-scope&gt;request&lt;/managed-bean-scope&gt;
  &lt;/managed-bean&gt;

&lt;/faces-config&gt;


Com o Seam, basta que o bean seja declarado como um componente do Seam, por meio da anotação @Name. Deste modo, o bean passar a ser gerenciado pelo Seam. Ou seja, além de ser um Managed Bean, também é um Seam Component.

@Name("people")
public class&nbsp;People {
&nbsp; //...
}

 
2.&nbsp;Requisições por GET

 O JSF 1.2 não lida bem com parâmetros GET. Não que seja impossível "capturar" tais parâmetros, mas é trabalhoso e não natural. Veja o seguinte exemplo que apresenta uma forma recuperar o parâmetro "id" passado por GET no bean:

String id = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("id")); &nbsp; 



O Seam facilita muito esse trabalho fazendo "bind" dos parâmetros GET por meio da anotação&nbsp;@RequestParameter:

@RequestParameter
private Long id = null;



3. Facilidade na utilização de ComboBox

   Imagine a seguinte situação: você pretende apresentar ao usuário um ComboBox com as regiões do Brasil onde cada região possui um id e um nome. Para você, é importante saber o id da região escolhida pelo usuário. Para o usuário, é importante escolher a região pelo nome, não pelo id.
Para resolver isso no JSF é necessário criar um mapa que contenha os nomes e os ids semelhante a esse:

public class MostraRegioes {

&nbsp; public Map&lt;String, Regioes&gt; getRegioes(){
&nbsp; &nbsp; Map&lt;String, Regioes&gt; regioes = new HashMap&lt;String, Regioes&gt;();
&nbsp; &nbsp; for(Regioes r : Regioes.values()) {
&nbsp; &nbsp; &nbsp; regioes.put(r.getNome(), 1);
&nbsp; &nbsp; }
&nbsp; &nbsp; return regioes;
&nbsp; }

}



E usá-lo da seguinte forma:

&lt;h:selectOneMenu&gt;
&nbsp; &lt;f:selectItems value="#{MostraRegioes.regioes}"/&gt;
&lt;/h:selectOneMenu&gt;


O que não é produtivo quando temos um sistema com muitos combos. Pois teríamos que fazer um método &nbsp;(convertendo de lista ou Array para um mapa ou List&lt;SelectItems&gt;) &nbsp;para cada combo. Felizmente o Seam ajuda nisso com o componente &lt;s:selectItems /&gt; que faz binding com uma lista/array comum. Veja:

&lt;h:selectOneMenu&gt;
&nbsp; &lt;s:selectItems value="#{MostraRegioes.regioes}"
&nbsp; &nbsp; var="regiao" label=#{regiao.nome}"/&gt;
&lt;/h:selectOneMenu&gt;



http://www.guj.com.br/java/220439-qual-a-diferenca-do-jsf12-para-jsf20
http://www.guj.com.br/java/266058-com-o-jee-6-o-que-justifica-o-uso-do-jboss-seam
http://www.guj.com.br/java/250717-jsf---parametros-via-get-resolvido