FacesContext.getCurrentInstance()

13 respostas
M

Caros amigos estou com um problema eu tenho um método que possui este parametro para eu receber FacesContext.getCurrentInstance() mas se eu fizer com uma pagina jsp normal ele passa null e quando eu uso o modo designer do netbeans ele funciona perfeitamente alguem saberei como resolver este problema…

13 Respostas

L

olha não sei se isso vai funcionar, mas acredito que ele esteja vindo nulo porque a página que você está chamando não está no contexto jsf

ou seja, há diferença entre você chamar index.jsp e index.jsf por exemplo

F

Tive um problema parecido e espero que te ajude…

Eu precisava carregar um popup para que usuário pudesse escolher o local para ser salvo um arquivo.

FacesContext currentInstance = FacesContext.getCurrentInstance(); OutputStream os = getHttpServletResponse(currentInstance).getOutputStream();

Aqui resolveu o NullPointerException

public HttpServletResponse getHttpServletResponse(FacesContext currentInstance) { return ((javax.servlet.http.HttpServletResponse) currentInstance.getExternalContext().getResponse()); }

M

até ai eu sei…
Mas eu gostaria de saber se existe uma solução para este problema… tipo uma configuração…

L

você usa JSF 1.2? ou 1.1?

M

1.1

L

poderia você explicar melhor esse problema?

sinceramente não consegui entender…

M
package web2;

import java.io.File;   
import java.io.FileInputStream;   
import java.io.IOException;   
import java.io.OutputStream;   
import javax.faces.context.ExternalContext;   
import javax.faces.context.FacesContext;   
import javax.servlet.http.HttpServletResponse;   
import javax.swing.JOptionPane;
  
public class Download {   
  
    public static synchronized void downloadFile(String filename, String fileLocation, String mimeType, FacesContext facesContext) {   
  
        ExternalContext context = facesContext.getExternalContext(); // Context   
        String path = fileLocation; // Localizacao do arquivo   
        String fullFileName = path + filename;   
        File file = new File(fullFileName); // Objeto arquivo mesmo :)   
  
        HttpServletResponse response = (HttpServletResponse) context.getResponse();   
        response.setHeader("Content-Disposition", "attachment;filename=\"" + filename + "\""); //aki eu seto o header e o nome q vai aparecer na hr do donwload   
        response.setContentLength((int) file.length()); // O tamanho do arquivo   
        response.setContentType(mimeType); // e obviamente o tipo   
  
        try {   
            FileInputStream in = new FileInputStream(file);   
            OutputStream out = response.getOutputStream();   
  
            byte[] buf = new byte[(int)file.length()];   
            int count;   
            while ((count = in.read(buf)) >= 0) {   
                out.write(buf, 0, count);   
            }
            
            in.close();   
            out.flush();   
            out.close();   
        facesContext.responseComplete();   
        } catch (IOException ex) {   
            JOptionPane.showMessageDialog(null,"Erro no download do arquivo: " + ex.getMessage());   
            ex.printStackTrace();   
        }   
    }   
}

Este método faz o download de um arquivo…
e possui este parametro “FacesContext facesContext” mas se eu fizer com uma pagina jsp normal ele passa null e quando eu uso o modo designer do netbeans ele funciona perfeitamente…

L

o.O

caramba!

bom, deixa eu ver

tu já tentou tirar esse FacesContext do parâmetro e, nessa linha

ExternalContext context = facesContext.getExternalContext();

trocar para

ExternalContext context = FacesContext.getCurrentInstance().getExternalContext();

?

M

Eis o problema ta passando null… no “facesContext”

L

você não entendeu o que eu quis dizer no último post?

TIRA o FacesContext do teu parâmetro e chama ele dentro do método e veja se ainda tá retornando nulo

abraço

M

ele não acha o getExternalContext()

H

Bom dia!!!

Pode fazer o seguinte:

No lugar de passar o FacesContext passa para HttpServletResponse response;

E dei uma melhorada nesse codigo seu porque não iria funcionar para web.

public static synchronized void downloadFile(String filename, String fileLocation, String mimeType, HttpServletResponse response) {   
  
        //ExternalContext context = facesContext.getExternalContext(); // Context   
        String path = fileLocation; // Localizacao do arquivo   
        String fullFileName = path + filename;   
        //File file = new File(fullFileName); // Objeto arquivo mesmo :)   
    URL url=null; 
        URLConnection conn=null;
      //  File file = new File(fullFileName);  // Objeto arquivo mesmo :)   
        
        
       try {
        url=new URL(fullFileName);
        conn=url.openConnection();
           
        response.setHeader("Content-Disposition", "attachment;filename=\"" + filename + "\""); //aki eu seto o header e o nome q vai aparecer na hr do donwload   
        //response.setContentLength((int) file.length()); // O tamanho do arquivo
         response.setContentLength((int) conn.getContentLength()); // O tamanho do arquivo
        response.setContentType(mimeType); // e obviamente o tipo   
  
           
            
            InputStream in = conn.getInputStream();  //new FileInputStream(file);   
            OutputStream out = response.getOutputStream();   
  
            byte[] buf = new byte[(int) conn.getContentLength()];  
            int count;   
            while ((count = in.read(buf)) >= 0) {   
                out.write(buf, 0, count);   
            }
            
            in.close();   
            out.flush();   
            out.close();   
            
    //    facesContext.responseComplete();   
        } catch (IOException ex) {   
            JOptionPane.showMessageDialog(null,"Erro no download do arquivo: " + ex.getMessage());   
            ex.printStackTrace();   
        }   
    }
M

Cara Testei Aqui 100% isso que eu precisava… Valeu…
Agradeço a todos pela ajuda…

Criado 18 de fevereiro de 2008
Ultima resposta 18 de fev. de 2008
Respostas 13
Participantes 4