[SEAM + JSF] Dúvida :: Como funciona o Scope.SESSION e a passagem de variáveis.

525 views
Skip to first unread message

Romildo Paiter

unread,
Feb 25, 2011, 2:38:43 PM2/25/11
to Grupo Java SF
Ola pessoa, estou desenvolvendo minha primeira aplicação em JBOSS Seam + JSF & Rich Faces.

Só que estou com uma dúvida como funciona as passagens de variáveis. Bom vou explicar como estou desenvolvendo minha aplicação.

Bom dentro dela após logado. Eu acesso a listagem das minhas revendas que tem o seu crud.

_ _ _ _ _ _ _ _                          _ _ _ _ _ _ _ _ _ _                         _ _ _ _ _ _ _ _ _ _ _ _ _
|                    |                         |                            |                      |                                   |
|   Revenda    |   ------------------>  |      Funcionários   | ------------------> | Cadastro Funcionario   |
|_ _ _ _ _ _ _ |                         |_ _ _ _ _ _ _ _ _ _ |                       | _ _ _ _ _ _ _ _ _ _ _ _ |
Lista                                       Lista func. da Revenda                   Novo Funcionário da Revenda
revendaAction                         funcionarioAction                          
funcionarioAction.
 listaFuncionario(revenda)

Então é o seguinte, na minha aplicação eu tenho um link na linha da revenda que chama a lista de funcionários passando o item(revenda), após clicar nele aparece a lista de funcionários com suas opções, e também aparece o nome da empresa que foi enviada. Mas quando chamo a pagina de cadastroFuncionario.xhtml, o conteudo de funcionarioAction.revenda.nomeFantasia esta null, como tivesse chamando um novo componente, não sei ao certo.

Eu gostaria de fazer essa passagem do objeto da revenda dentro da sessão. Eu resolvi colocando um link direto na listagem da revenda para o cadastro do Funcionário.

Se alguem puder passar essa dica.. Obrigado desde já..

Valeu pessoal

[]`s

Romildo Jozué Paiter
Bacharelando Sistema da Informação

Bruno Maomeh

unread,
Feb 25, 2011, 2:53:20 PM2/25/11
to jav...@googlegroups.com
esse é o melhor link que eu já vi sobre comunicação entre beans no jsf..
http://balusc.blogspot.com/2006/06/communication-in-jsf.html

--
Você recebeu esta mensagem por que é membro do Javasf
http://groups.google.com/group/javasf
 
Conheça também o Java Brazil: http://groups.google.com/group/thejavabrazil



--
Bruno Maomeh
   http://brunomaomeh.wordpress.com

David Faulstich

unread,
Feb 25, 2011, 4:29:05 PM2/25/11
to jav...@googlegroups.com, Romildo Paiter
Veja o exemplo com datamodel e datalist que vem com o Seam. Pode facilmente utilizar um sfsb (statefull session bean) marcando @Begin e @End.

Outro jeito de vc fazer isto é configurando na page.xml os parâmetros que vc quer que exista no próximo request. Assim vc permite a vida dos valores entre os requests. Se você gerar os cruds com o Seam Gen verá estes exemplos de parâmetros.

Aconselho você a estudar todos os exemplos que vem com a distribuição do seam que vc ficará craque.






Em 25 de fevereiro de 2011 16:38, Romildo Paiter <romild...@gmail.com> escreveu:

--

Flavio Cysne

unread,
Mar 1, 2011, 9:09:18 AM3/1/11
to jav...@googlegroups.com
Romildo,

    o JBoss Seam tem um conceito de escopo diferenciado chamado de "conversação" (ScopeType.CONVERSATION). Para repassar objetos entre os beans, você pode declará-los no escopo de conversação e definir no bean inicial um atributo que será adicionado ao escopo, usando a anotação @Out(name = "nomeDaVariavel", required = false). Nos outros beans você recupera o valor adicionado ao escopo de conversação usando a anotação @In(value = "#{nomeDaVariavel}", required = false). Caso os beans tenham escopos diferentes você deve declarar explicitamente na anotação @In o escopo do qual deseja recuperar a variável. Seria algo como:

#RevendaBean.java

@Name("revendaAction")
@Scope(ScopeType.CONVERSATION)
public class RevendaBean {

    @Out(name="revendaSelecionada", required=false)
    private Revenda revendaSelecionada;

    // get e set de revendaSelecionada

    public String listarFuncionarios() {
        return "listarFuncionario"; // regra de navegação no pages.xml ou no revendas.pages.xml
    }

    // outros métodos

}

#FuncionarioBean.java

@Name("funcionarioAction")
@Scope(ScopeType.CONVERSATION)
public class FuncionarioBean {

    @In(value="#{revendaSelecionada}", required=false)
    private Revenda revendaAtual;

    private Funcionario funcionario;

    // get e set de revendaAtual e funcionario

    public String novoFuncionario() {
        funcionario = new Funcionario();
        funcionario.setRevenda(revendaAtual);
        return "novoFuncionario"; // regra de navegação no pages.xml ou no funcionarios.pages.xml
    }

    // outros métodos

}


    Lembrando que no link ou botão na tela de revendas precisa usar o <f:setPropertyActionListener target="#{revendaSelecionada}" value="#{revendaDatatableVar}" /> para que o valor da variável seja "setado" antes de redirecionar p/ a lista de funcionarios da revenda.

Espero ter ajudado.
Flávio Cysne

Em 25 de fevereiro de 2011 16:38, Romildo Paiter <romild...@gmail.com> escreveu:

--

Romildo Paiter

unread,
Mar 1, 2011, 10:25:29 AM3/1/11
to jav...@googlegroups.com
Ola, Flavio Cysne.....

Muito obrigado por sua explicação. Você me fez entender um conceito de @Out, outjeção que eu estava penando.

Estou desenvolvendo minha primeira aplicação em Seam e estou aprendendo na raça. Tenho vários ebooks em inglês que pesquiso quando surge alguma dúvida.

Mas aproveitando esse momento você tem ou conhece algum material bom sobre autenticação e regras de segurança com o seam. Encontrei algumas coisas na net, eu até ja tenho algo implementado, mas tava querendo mais informações de como fazer essas autenticações.

Pois em meu sistema, eu vou ter a autenticação de contas de Funcionários de empresas que irão utilizar os serviços e a autenticação dos visitantes que irão consultar o que as empresas irão disponibilizar.

Então são duas autenticações diferentes. E para eu entender como vou fazer isso. To querendo ler um pouco mais de material.

Obrigado.

att.
Romildo Jozué Paiter
--
[]`s

Romildo Jozué Paiter
Bacharelando Ciências da Computação
MCSA: Microsoft Certified
Desenvolvimento de Sistemas e Rede de Computadores.
Fone: (65) 9601-5503
Acesse: www.paiterecervantes.com.br

Flavio Cysne

unread,
Mar 1, 2011, 11:32:05 AM3/1/11
to jav...@googlegroups.com
Romildo,

    a própria documentação do JBoss Seam já traz explicações disso e, se não me engano, existe uma aplicação de exemplo disponível para download no site do JBoss Seam. Não vou mentir, nesta parte de autenticação eu sou meio perdido. Tente um dos livros no link abaixo.

http://www.google.com.br/search?tbm=bks&tbo=1&q=jboss+seam&oq=jboss+seam

Atecniosamente,
Flávio Cysne.

David Faulstich

unread,
Mar 16, 2011, 1:20:14 PM3/16/11
to jav...@googlegroups.com
A segurança com o SEAM é super simples. Abaixo o bean de exemplo que eu utilizo em meu projeto:


package br.com.infosolo.snrd.controle.seguranca;

import java.util.HashSet;
import java.util.Set;

import javax.ejb.Stateless;

import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Logger;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Out;
import org.jboss.seam.bpm.Actor;
import org.jboss.seam.log.Log;
import org.jboss.seam.security.Credentials;
import org.jboss.seam.security.Identity;

import br.com.infosolo.snrd.dominio.entidades.Estado;
import br.com.infosolo.snrd.dominio.entidades.Grupo;
import br.com.infosolo.snrd.dominio.entidades.Unidade;
import br.com.infosolo.snrd.dominio.entidades.Usuario;
import br.com.infosolo.snrd.negocio.ejb.UsuarioNegocioLocal;
import br.com.infosolo.snrd.seam.util.ConstantesSNRD;

@Name("autenticador")
@Stateless
public class Autenticador implements AutenticadorLocal {
    @Logger private Log log;

    @In
    Identity identity;
   
    @In
    Credentials credentials;
   
    @In
    @Out(scope=ScopeType.SESSION)
    Actor actor;
   
    @In (create=true)
    UsuarioNegocioLocal usuarioNegocio;
   
    @Out(required=false, scope=ScopeType.SESSION)
    Usuario usuarioLogado;
   
    @Out(required=false, scope=ScopeType.SESSION)
    Set<Estado> estadosUsuarioLogado;
   
    @Out(required=false, scope=ScopeType.SESSION)
    Set<Unidade> unidadesUsuarioLogado;
    /**
     * Método utilizado para Autenticar o usuário.
     * @return boolean
     */
    public boolean autenticar() {
        log.info("Autenticando {0}", credentials.getUsername());
        String login = credentials.getUsername();
        String senha = credentials.getPassword();
        Usuario usuario = new Usuario();
        usuario.setLogin(login);
        usuario.setSenha(senha);
        //actor = Actor.instance() ;
        actor.setId(login);
        usuarioLogado = usuarioNegocio.retornarUsuarioPorLoginSenha(usuario); // método que verifica se existe usuario com a senha informada.
        if(usuarioLogado!=null){
            Set<Grupo> grupos = usuarioLogado.getGrupos();
            Set<Unidade> unidades = usuarioLogado.getUnidades();
            estadosUsuarioLogado = new HashSet<Estado>();
            unidadesUsuarioLogado = unidades;
            for(Unidade unidade : unidades) {
                log.info("Role adicionada: {0}", unidade.getDescricao());
                identity.addRole(unidade.getDescricao());
                Set<Estado> estadosUnidade = unidade.getEstados();
                estadosUsuarioLogado.addAll(estadosUnidade);
            }  
            for(Grupo grupo : grupos) {
                log.info("Role adicionada: {0}", grupo.getDescricao());
                identity.addRole(grupo.getDescricao());
            }
            definirActorsIdUsuario();
            return true;
        }
        log.info("Usuário não possui acesso ao sistema: {0}", credentials.getUsername());
        return false;
    }
    /**
     * Define as filas de trabalho do usuário.
     */
    private void definirActorsIdUsuario() {
        long grupoRegistradorOficial = Long.parseLong(ConstantesSNRD.IDENTIFICADOR_GRUPO_REGISTRADOR_OFICIAL);
        long grupoAdministrador = Long.parseLong(ConstantesSNRD.IDENTIFICADOR_GRUPO_ADMINISTRADOR);
        for(Grupo grupo : usuarioLogado.getGrupos()) {
            if(grupo.getIdGrupo()==grupoRegistradorOficial){ // fila de registrador independe da unidade.
                String actorId = ConstantesSNRD.IDENTIFICADOR_GRUPO + grupo.getIdGrupo();
                actor.getGroupActorIds().add(actorId);
                log.info("Actor ID para Grupo {0}: {1}", grupo.getDescricao(),actorId);
            }else if(grupo.getIdGrupo()==grupoAdministrador){ // administrador enxerga fila de assinador / registrador.
                String actorId = ConstantesSNRD.IDENTIFICADOR_GRUPO + ConstantesSNRD.IDENTIFICADOR_GRUPO_REGISTRADOR_OFICIAL;
                actor.getGroupActorIds().add(actorId);
                log.info("Actor ID para Grupo {0}: {1}", grupo.getDescricao(),actorId);
            } else {
                for(Unidade unidade: usuarioLogado.getUnidades()){// Demais filas do usuário dependem da unidade.
                    String actorId = ConstantesSNRD.IDENTIFICADOR_GRUPO + grupo.getIdGrupo() +
                                     ConstantesSNRD.IDENTIFICADOR_UNIDADE + unidade.getIdUnidade();
                    log.info("Actor ID para Grupo {0}, unidade {1}: {2}", grupo.getDescricao(),unidade.getDescricao(), actorId);
                    actor.getGroupActorIds().add(actorId);
                }
            }
        }
    }
}


--------

Lembrando de que como utilizo JBPM a parte onde existe actorID é para carregar as filas de trabalho que o usuário logado tem direito.

Para testar se o usuário tem acesso (testar a role do usuário) é através do código abaixo:

<?xml version="1.0" encoding="UTF-8"?>
<page xmlns="http://jboss.com/products/seam/pages"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://jboss.com/products/seam/pages http://jboss.com/products/seam/pages-2.2.xsd">

   <restrict>#{s:hasRole('Administradores')}</restrict>


</page>


Lembrando que para proteger componentes do SEAM podemos utilizar @Restrict e para renderizar ou não campos na tela com richfaces podemos utilizar rendered com a mesma sintaxe.

Se você criar um Seam Project utilizando o JBOSSTOOLS ele já gera o esqueleto desta classe e ficará bem mais fácil de entender.




Em 1 de março de 2011 12:25, Romildo Paiter <romild...@gmail.com> escreveu:
Reply all
Reply to author
Forward
0 new messages