[RESOLVIDO]PageContext em ManagedBean

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?

E vc quer fazer o getOut para…

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

Foi sim.

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

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:

[code]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();[/code]

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:

[code]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();
    }

}[/code]

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

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

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

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

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

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

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

[code]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();
    }  

} [/code]

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.

[quote=Kura]VELHO!
Funcionou! =~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Depois de muito futucar, ficou assim:

[code]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();
    }  

} [/code]

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.[/quote]\o/

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

Parabéns. [=

Obrigado! =D

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

[quote=Kura]Obrigado! =D

Só por curiosidade… vc sabe o porquê de ter funcionado com commandLink e não com commandButton? o.O[/quote]Como você esta usando o commandButton e o commandLink?

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ô

[quote=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ô[/quote]Coloque ajax=“false” no primeiro, e teste.

1 curtida

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! =~~

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.

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.