VRaptor2 - ScopeType.FLASH não funciona

20 respostas
renatosilva

Estou tentando usar o ScopeType.FLASH mas não está funcionando, a JSP não enxerga o parâmetro. Já tentei remover o getter, e também colocar a anotação nele, mas simplesmente não funciona :frowning:

@Component("produto")
public class ProdutoLogic {
    
    ProdutoDAO dao = new ProdutoDAO();

    @Out(scope=ScopeType.FLASH)
    Produto produto;
    
    public void recupera(Produto produto) {
        this.produto = dao.recupera(produto.getId());
    }
    
    public Produto getProduto() {
        return produto;
    }

}

20 Respostas

leandronsp

como vc está chamando ele na JSP? posta ae o codigo se puder

renatosilva

É so mudar pra session que funciona! Estou usando EL na JSP.

G

Se não me engano você precisa colocar o @In também, senão quando redirecionar ele não injeta de novo o parametro.

renatosilva

Não de acordo com a documentação.

Mas enfim, o @In e @Out ficariam onde exatamente? Tentei de alguns jeitos e nenhum deles funcionou.

Será possível que ninguém passou por este problema? :frowning:

G

renatosilva:
Não de acordo com a documentação.

Mas enfim, o @In e @Out ficariam onde exatamente? Tentei de alguns jeitos e nenhum deles funcionou.

Será possível que ninguém passou por este problema? :(

Renato, conforme a documentação você precisa do @In para inject e @Out para outject. Enfim, você precisa que o parametro seja “jogado para fora”, então você precisa do Out. Porém após o redirect você tenta ler de novo, então precisa do @In para que os dados sejam devolvidos a você na classe.

@In @Out(scope=ScopeType.FLASH) Produto produto;

renatosilva

A documentação não cita o @In como necessário para o escopo FLASH. Além disso, no fórum um usuário removeu o @In para fazer funcionar. Mesmo assim, já havia tentando isso que você postou, mas não funciona. Só pra constar aqui estão os arquivos:

ProdutoLogic:

package br.com.caelum.logic;
import java.util.List;

import org.vraptor.annotations.Component;
import org.vraptor.annotations.In;
import org.vraptor.annotations.Out;
import org.vraptor.scope.ScopeType;

import br.com.caelum.hibernate.Produto;
import br.com.caelum.hibernate.ProdutoDAO;

@Component("produto")
public class ProdutoLogic {
    
    private ProdutoDAO dao = new ProdutoDAO();
    private List<Produto> produtos;
    
    @In(scope=ScopeType.FLASH, create=true)  
    @Out(scope=ScopeType.FLASH)
    private Produto produto;
    
    public void adiciona(Produto produto) {
        dao.adiciona(produto);
    }
    
    public void atualiza(Produto produto) {
        dao.atualiza(produto);
    }
    
    public void remove(Produto produto) {
        dao.remove(produto);
    }
    
    public void recupera(Produto produto) {
        this.produto = dao.recupera(produto.getId());
    }
    
    public void lista() {
        this.produtos = dao.lista();
    }
        
    public Produto getProduto() {
        return produto;
    }

    public List<Produto> getProdutos() {
        return produtos;
    }

}

altera.jsp:

<html>
<body>
    <form action="produto.atualiza.logic">
        <input type="hidden" name="produto.id" value="${produto.id}">
        Nome: <input name="produto.nome" value="${produto.nome}"/><br/>
        Descricao: <input name="produto.descricao" value="${produto.descricao}"/><br/>
        Preco: <input name="produto.preco" value="${produto.preco}"/><br/>
        <input type="submit" value="Enviar"/>
    </form>
</body>
</html>

views.properites:

produto.adiciona.ok = redirect:produto.lista.logic
produto.atualiza.ok = redirect:produto.lista.logic
produto.remove.ok = redirect:produto.lista.logic
produto.recupera.ok = redirect:altera.jsp
Lagaffe

Eu sugiro o seguinte (não sou expert):

crie um método na classe ProdutoLogic:

public void altera() {
}

altere seu jsp para altera.ok.jsp

altere a referencia do altera no views.properties

elimine os In e Out, eu raramente precisei usar (praticamente só o session). Na sua aplicação não me parece necessário.

Outra sugestão: tente começar diretamente com o VRaptor3, é muito mais simples.

renatosilva

Socorro!

G

renatosilva, eu esgotei minhas chances de ajudar. Nunca usei flash-scope.

Duas sugestões: você migrar para vraptor3, que está muito bom, caso foi possível; ou acionar algum dos desenvolvedores, pois pode ser um bug ainda não descoberto.

renatosilva

Atualizei pro 2.6.0 e nada… Parece bug mesmo.

Lavieri

se vc irar os redirect do views funciona…

produto.adiciona.ok = redirect:produto.lista.logic

produto.atualiza.ok = redirect:produto.lista.logic

produto.remove.ok = redirect:produto.lista.logic

produto.recupera.ok = redirect:altera.jsp

mude para

produto.adiciona.ok = produto.lista.logic

produto.atualiza.ok = produto.lista.logic

produto.remove.ok = produto.lista.logic

produto.recupera.ok = altera.jsp

renatosilva

Lavieri, o escopo FLASH é justamente para uso com redirects :slight_smile:

G

Pior de tudo que fiz uns testes com uma aplicação antiga que tenho aqui com o vraptor2.6 e parece ser um bug mesmo. No meu caso mesmo seguindo a doc deu o mesmo erro que o seu, ou seja, o atributo se perde no redirect.

Você pode atualizar para o v3?

renatosilva

Na verdade estou apenas treinando. Tem um projeto vindo que talvez eu use, se for o caso vou partir para a 3 direto. Mas po, seria bom consertar os bugs na série 2 também né :slight_smile:

O que eu acho mais estranho é o relato no fórum do VRaptor de maio de 2008, dizendo que conseguiu fazer funcionar. Será que era a versão 1? Tirando isso, dá a entender que ninguém usa esse FLASH :stuck_out_tongue:

Lavieri

acho que vc não entendeu a minha colocação, falei que o que buga é esse redirect do view....

por exemplo, para demosttrar que o flash funciona, veja o exemplo abaixo...

Primeira página: index.jsp
&lt;body&gt;
	&lt;form action="teste.enviar.logic"&gt;
		&lt;input type="text" name="teste"&gt;
	&lt;/form&gt;
&lt;/body&gt;
Primeira logica: Teste
import org.vraptor.annotations.Component;
import org.vraptor.annotations.Out;
import org.vraptor.annotations.Parameter;
import org.vraptor.scope.ScopeType;

@Component("teste")
public class Teste {
	@Parameter
	private String teste;
	
	@Out(scope=ScopeType.FLASH)
	private String enviaTeste;
	
	public String getEnviaTeste() {
		return enviaTeste;
	}
	
	public void enviar() {
		enviaTeste = "enviado \"" +teste + "\""; 
	}
}

Como vc pode ver, estou recebendo o parametro na variável "teste" e exportando via FLASH na variável "enviaTeste"

Segnda página: enviar.ok.jsp
&lt;body&gt;
	O Texto recebido foi:
	<br>FLASH = ${enviaTeste}
	<br>agora vamos a proxima página: <a >segundoTeste.receber.logic</a>
&lt;/body&gt;

Se tudo ocorrer bem, e ocorre, o texto tem que aparecer la na segunda lógica, desde que eu a receba por flash.

Segunda logica: SegundoTeste
import org.vraptor.annotations.Component;
import org.vraptor.annotations.In;
import org.vraptor.annotations.Out;
import org.vraptor.scope.ScopeType;

@Component("segundoTeste")
public class SegundoTeste {
	@In(scope=ScopeType.FLASH,required=false)
	@Out(scope=ScopeType.REQUEST)
	private String enviaTeste;
	
	public String getEnviaTeste() {
		return enviaTeste;
	}
	
	public void receber() {	}
}

Arqui é simples, eu estou recebendo pelo scopo FLASH, e estou exportando pelo scopo REQUEST

terceira página:
&lt;body&gt;
	Vamos ver o que recebemos: 
	<br>FLASH / REQUEST = ${enviaTeste}
	<br>Se tentarmos denovo com scopo REQUEST, não receberemos o valor de "enviaTeste"
	<br>teste clicando aqui =&gt;  <a >segundoTeste.receber.logic</a>
&lt;/body&gt;

Bom quando chegamos aqui a primeira vez, ENVIA TESTE ainda existe, pois veio via escopo flash, quando clicamos no link pela segunda vez, a msg some, pois exportamos ela pelo RESQUEST, o que não sustenta ate a segunda pagina.

espero que veja como funciona o flash, e que realmente o scopo funciona e é util...

vou colocar aqui as telas em sequencia...

Enviado dados,
[img]http://img21.imageshack.us/img21/8994/pagina1vn.jpg[/img]

Recendo dados, e colocando ele no flash
[img]http://img5.imageshack.us/img5/8929/pagina2c.jpg[/img]

Indo para outra pagina, com outro logica (sem enviar nada via post ou get), e retirando o valor do FLASH, e o locando agora em request
[img]http://img7.imageshack.us/img7/6080/pagina3jp.jpg[/img]

e finalmente, acessando a mesma pagina, so que agora sem o objeto no FLASH não exibindo nada
[img]http://img5.imageshack.us/img5/8733/pagina4v.jpg[/img]

renatosilva

Lavieri:
se vc irar os redirect do views funciona…

produto.adiciona.ok = redirect:produto.lista.logic

produto.atualiza.ok = redirect:produto.lista.logic

produto.remove.ok = redirect:produto.lista.logic

produto.recupera.ok = redirect:altera.jsp

mude para

produto.adiciona.ok = produto.lista.logic

produto.atualiza.ok = produto.lista.logic

produto.remove.ok = produto.lista.logic

produto.recupera.ok = altera.jsp

Sua colocação foi bem clara: remover o redirect que ia funcionar. Não só não vai funcionar, como também não tem sentido.

Sobre esse outro post mais novo, desculpa mas tá bem difícil de entender. Poderia abordar o exemplo fornecido? Você já leu isso? Sua versão é a 2.6?

Lavieri

Sua colocação foi bem clara: remover o redirect que ia funcionar. Não só não vai funcionar, como também não tem sentido.

Sobre esse outro post mais novo, desculpa mas tá bem difícil de entender. Poderia abordar o exemplo fornecido? Você já leu isso? Sua versão é a 2.6?

Quando falei que não entendeu, é pq vc entende que o uso do FLASH é apenas para redirect, o que não é o único caso do uso, no exemplo acima te mostrei outra forma de uso, que funciona.

O escopo do flash não é só para uso em redirect, é para por exemplo, usar form em steps, sem ter que ficar escrevendo campos hidden entre as paginas, é para enviar uma mensagem de resultado par aoutra pagina, entre outras coisas, inclusive o redirect, porem o redirect do view ta apresentando esso problema ai o.O

Não tinha lido, o exemplo é bem para o que vc esta usando… hehehe… mas eu me deparei com o mesmo problema que vc ao tentar usar o redirect: no view…

Sim a versão é a 2.6

O meu exemplo retrata uma situação de FLASH sobrevivendo por mais de uma requisição… ele não so vai para a página seguinte como vai para outra logica onde não estava originalmente…

O que fiz foi demostrar que é possivel usar o flash, para manter a veriável viva por um escopo de duas requisições…

No meu exemplo, eu primeiro envio o parametro para uma logica… esta logica pega o parametro concatena outras coisas e coloca em um escopo flash, então renderiza a pagina, e mostra a variável… nesta pagina há um link para outra página, de outra logica, que vai tentar resgatar o valor da variável, sem haver qualquer post, apenas utilizando scopo de FLASH… ao clicar no link da pra ver que o valor ainda pode ser resgatado…

O redirect não é a unica funcionalidade do FLASH e realmente eu me deparei com esse problema no redirect também, só estou relatando que provavelmente o problema é no redirect do views, pois quando faço redirect manual nas minhas pagina não encontro esse problema…

G

Lavieri, mesmo usando há algum tempo o vraptor, só com seu post comecei a entender bem o flash. Confesso que tinha me passado despercebido como ele realmente funcional. Talvez até mesmo porque ainda não precisei.

Abraços,

renatosilva

Ok Lavieri, agora tá mais claro o que você quis dizer :slight_smile:

Fica a informação pros desenvolvedores então, ou pra quem tiver tempo e vontade de fixar. Garcia-jj, acho que o FLASH nada mais é do que colocar na session e remover após a requisição seguinte. Até tentei rapidamente acessar a session pra remover manualmente, mas não consegui. Além disso acho que eu ia ter que fazer isso no JSP, não ia ficar legal.

Lavieri
renatosilva:
Ok Lavieri, agora tá mais claro o que você quis dizer :)
Lavieri:
eu me deparei com esse problema no redirect também, só estou relatando que provavelmente o problema é no redirect do views, pois quando faço redirect manual nas minhas pagina não encontro esse problema...

Fica a informação pros desenvolvedores então, ou pra quem tiver tempo e vontade de fixar. Garcia-jj, acho que o FLASH nada mais é do que colocar na session e remover após a requisição seguinte. Até tentei rapidamente acessar a session pra remover manualmente, mas não consegui. Além disso acho que eu ia ter que fazer isso no JSP, não ia ficar legal.

pra remover manualmente ??

@Component("teste")
public class TesteLogic {

   @In
   HttpSession session;

   @In(scope=ScopeType.SESSION)
   @Out(scope=ScopeType.REQUEST)
   Produto produto;


   public void teste() {
       session.removeAttribute("produto");
   }
}

Não testei mas deve funcionar, ... agora usa na view um .... produto.adicionar.ok = redirect:teste.teste.logic

Neste meu exemplo, ele deve injetar na logica a Session, e deve injetar o valor de "produto" que esta no escopo de sessão.... só então ele executa o metodo da logica, que nesse exemplo se chama teste.... ai ele remove da sessão o produto... e quando a logica for ser renderizada, ela exporta o valor de produto no escopo de request, e vc consegue ver na pagina.... testa ai

Criado 19 de setembro de 2009
Ultima resposta 8 de out. de 2009
Respostas 20
Participantes 5