[RESOLVIDO]PageContext em ManagedBean

18 respostas
Kura

Galera,
Como pego um PageContext dentro de um managed bean?
Precisei pegar o response e consegui com:

FacesContext fc = FacesContext.getCurrentInstance(); HttpServletResponse resp=(HttpServletResponse)fc.getExternalContext().getResponse();

Mas não estou sabendo pegar o PageContext pra poder dar um getOut();
Alguem sabe me dizer como posso fazer?

18 Respostas

Hebert_Coelho

E vc quer fazer o getOut para…

Kura

Estou fazendo tentando criar um arquivo zip com os arquivos selecionados pelo usuário.
Usei o que estava sendo explicado num tutorial aqui mesmo no guj, para que eu pudesse criar um zip e fazer um download pelo browser.
Isso está funcionando tranquilo. Em cada row de uma tabela, tem um link que chama um jsp que faz esse processo para o arquivo que foi selecionado.
Agora eu adicionei um checkbox em cada registro pra ter a opção de formar um zip com vários arquivos selecionados, mas não quero fazer por jsp.
Eu estava tentando reproduzir e estava dando certo, mas deu um problema que tinha dado no jsp também.
No jsp eu consegui resolver adicionando um out.clear();

Não sei se fui muito claro… o.O

Hebert_Coelho

Foi sim.

O seu problema e está em pegar os dados, gerar os arquivos ou gerar o zip?

Kura

Olha...
Na hora de gerar o zip da o seguinte erro:

java.lang.IllegalStateException: getOutputStream() has already been called for this response

Para gerar o zip, eu estou fazendo mais ou menos o mesmo que está nesse artigo:
http://www.guj.com.br/articles/181

No jsp, quando deu esse problema, eu usei o out.clear(); e resolveu.

código do jsp:

response.setContentType("application/octet-stream");  
            response.setHeader("Content-Disposition",  
                    "attachment; filename=chamadas.zip");  
  
            Zipper zip = new Zipper();  
            out.clear();  
            zip.criarZip(response.getOutputStream(), arquivos);  
  
            response.getOutputStream().flush();

Para essa funcionalidade de gerar um zip para todas as linhas selecionadas, estou tentando fazer o mesmo, mas sem usar jsp.
Segue o código do método que está no ManagedBean:

public void geraZipSelecionadas(){
        FacesContext fc = FacesContext.getCurrentInstance();
        HttpServletResponse resp=(HttpServletResponse)fc.getExternalContext().getResponse();

        List<Chamada> chamadasSelecionadas = montaListaSelecionadas();
        resp.setContentType("application/octet-stream");
        resp.setHeader("Content-Disposition",
                "attachment; filename=ligacoesSelecionadas.zip");

        Zipper zip = new Zipper();
        try {
            zip.criarZip(resp.getOutputStream(), buscaArquivosSelecionados(chamadasSelecionadas));
            resp.getOutputStream().flush();
        } catch (IOException e) {
            e.printStackTrace();
        }
}

Como deu o mesmo erro, eu estava pensando em colocar um out.clear(); antes do resp.getOutputStream().flush(); pra ver se resolvia.

Hebert_Coelho

Dá uma olhada aqui: http://www.coderanch.com/t/482034/JSF/java/download-zip-file

Kura

Muito obrigado, Hebert.
Vou tentar entender e aplicar o meu caso nesse código! =)

Kura

Rapaz, deixa eu perturbar mais um pouco.
Certamente eu não vou conseguir aplicar esse código hoje, mas eu fiquei vendo aqui e fiquei em dúvida…
Estou vendo que nesse código eu pego um arquivo existente e baixo.
Mas na verdade eu quero gerar um zip com vários arquivos e depois baixar.

Entendi errado ou consigo fazer isso com o código desse link que vc passou?

Só pra constar: Eu poderia simplesmente entender e ficar futucando, o que seria o melhor, claro, mas eu estou preocupado pq estou há muito tempo tentando resolver essa situação e estou com um prazo não muito bom pra entregar esse projeto (é pro trabalho mesmo) =///

Abraços

Hebert_Coelho

Uai mano, se for para fazer DL depois, salva o arquivo em um lugar e manda o link para o usuário.

É isso? O.o

Kura

Cara… eu já pensei em fazer isso mil vezes, mas sabe como é usuário, né? ¬¬
lol

Mas tá tranquilo, cara.
Muito obrigado por toda atenção! =D

Kura

VELHO!
Funcionou! =~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Depois de muito futucar, ficou assim:

public void geraZipSelecionadas(){  
        FacesContext fc = FacesContext.getCurrentInstance();
        HttpServletResponse resp=(HttpServletResponse)fc.getExternalContext().getResponse();

        List<Chamada> chamadasSelecionadas = montaListaSelecionadas();
        resp.setContentType("application/octet-stream");
        resp.setHeader("Content-Disposition",
                "attachment; filename=ligacoesSelecionadas.zip");

        Zipper zip = new Zipper();
        try {
            zip.criarZipSelecionadas(resp.getOutputStream(), buscaArquivosSelecionados(chamadasSelecionadas));

            resp.getOutputStream().flush();
            resp.getOutputStream().close();
            fc.responseComplete();
            fc.renderResponse();

        } catch (IOException e) {
            e.printStackTrace();
        }  
}

Ainda assim não estava funcionando de jeito nenhum.
Mas.. post vai, post vem.. vi que um cara tava tendo o mesmo problema, mas ele estava chamando o método atraves de um h:commandLink, enquanto eu estava usando um p:commandButton.
Fui trocar pro commandLink por pura curiosidade, só pra ver o que era e se ia chamar normalmente o método do managed bean.
Não só chamou como tudo deu certo! =~~

Só pontuando aqui que, além de passar a trabalhar com commandLink, eu adicionei as instruções.

fc.responseComplete();
fc.renderResponse();

Hebert, valeu mesmo a força, cara.

Hebert_Coelho
Kura:
VELHO! Funcionou! =~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Depois de muito futucar, ficou assim:
public void geraZipSelecionadas(){  
        FacesContext fc = FacesContext.getCurrentInstance();
        HttpServletResponse resp=(HttpServletResponse)fc.getExternalContext().getResponse();

        List<Chamada> chamadasSelecionadas = montaListaSelecionadas();
        resp.setContentType("application/octet-stream");
        resp.setHeader("Content-Disposition",
                "attachment; filename=ligacoesSelecionadas.zip");

        Zipper zip = new Zipper();
        try {
            zip.criarZipSelecionadas(resp.getOutputStream(), buscaArquivosSelecionados(chamadasSelecionadas));

            resp.getOutputStream().flush();
            resp.getOutputStream().close();
            fc.responseComplete();
            fc.renderResponse();

        } catch (IOException e) {
            e.printStackTrace();
        }  
}

Ainda assim não estava funcionando de jeito nenhum.
Mas.. post vai, post vem.. vi que um cara tava tendo o mesmo problema, mas ele estava chamando o método atraves de um h:commandLink, enquanto eu estava usando um p:commandButton.
Fui trocar pro commandLink por pura curiosidade, só pra ver o que era e se ia chamar normalmente o método do managed bean.
Não só chamou como tudo deu certo! =~~

Só pontuando aqui que, além de passar a trabalhar com commandLink, eu adicionei as instruções.

fc.responseComplete();
fc.renderResponse();

Hebert, valeu mesmo a força, cara.

\o/

Rapaz, eu fiz nada. C fez todo o trabalho! 8) 8) 8)

Parabéns. [=

Kura

Obrigado! =D

Só por curiosidade… vc sabe o porquê de ter funcionado com commandLink e não com commandButton? o.O

Hebert_Coelho

Kura:
Obrigado! =D

Só por curiosidade… vc sabe o porquê de ter funcionado com commandLink e não com commandButton? o.O

Como você esta usando o commandButton e o commandLink?

Kura

Só muda o componente mesmo o.O

<p:commandButton value="Download Selecionados" type="submit" action="#{audioController.geraZipSelecionadas}"/> <h:commandLink type="submit" value="Download Selecionados" action="#{audioController.geraZipSelecionadas}" />

Nuss que alívio! huahuhahuaha
muito feliz que eu tô

Hebert_Coelho

Kura:
Só muda o componente mesmo o.O

<p:commandButton value="Download Selecionados" type="submit" action="#{audioController.geraZipSelecionadas}"/> <h:commandLink type="submit" value="Download Selecionados" action="#{audioController.geraZipSelecionadas}" />

Nuss que alívio! huahuhahuaha
muito feliz que eu tô

Coloque ajax=“false” no primeiro, e teste.

Kura

OMG!!!
Funcionou! :shock:
Mágica! =x

Não entendi não, cara. uahuahah
Sei nada de web pq só comecei a aprender agora e só comecei a mexer em java (profissionalmente) agora tb. huahuhau

Nem acredito que funcionou! =~~

Hebert_Coelho

Mágica não.

Default do primefaces é ajax que usa actionListener, a definição do seu método é um action. Por isso não chamava.

Aqui mostra a diferença entre action e actionListener: JSF Mini Livro - Dicas, conceitos e boas práticas.

Kura

ahuhauha
eu tava brincando, né?

Mas é isso, cara.
Foi tudo de grande ajuda!
Muito obrigado mesmo!

PS: Li a parte de ajax e vou ler o resto pra aprender um pouco mais sobre JSF.

Criado 11 de dezembro de 2012
Ultima resposta 12 de dez. de 2012
Respostas 18
Participantes 2