JSF + ireports

6 respostas
C

alguem tem exemplo/tutorial como ireports pelo JSf
quando eu crio um servlet e direciono o link direto pro relatorio, funciona
mas por exemplo, se eu quero fazer o jsf interagir com o servlet, fazer uma action do bean chamar o servlet, ele nao considera, porque ele so interage com extensoes jsps…e agora?

6 Respostas

C
import javax.servlet.*;
import javax.servlet.http.*;

import javax.servlet.*;
import javax.servlet.http.*;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperManager;
import net.sf.jasperreports.engine.JasperPrint;
import com.lowagie.text.Document;

public class Servlet1 extends HttpServlet {
    private static final String CONTENT_TYPE = "text/html; charset=windows-1252";
    public static Connection con;
    public void init(ServletConfig config) throws ServletException {
        super.init(config);
    }

    public void service(HttpServletRequest request, 
                        HttpServletResponse response) throws ServletException, 
                                                             IOException {
        response.setContentType(CONTENT_TYPE);
        //  res.setContentType(CONTENT_TYPE);
        //    PrintWriter out = res.getWriter();
        conexao(); // Faz a conexão
        // Na variavel pathJasper ficara o caminho do diretório para
        // os relatórios compilados (.jasper)
        String pathJasper = getServletContext().getRealPath(
        "/WEB-INF/")
        + "/";
        // A variavel path armazena o caminho real para o contexto
        // isso é util pois o seu web container pode estar instalado em lugares diferentes
        String path = getServletContext().getRealPath("/");
        // Parametros do relatorio
        Map parametros = new HashMap();
        // O único parametro que devemos passar é o PathRelAutores
        // é o caminho pro RelAutores.jasper (que foi subtituido pelo
        // valor fixo ?D:/iReport-0.4.0/RelAutores.jasper?)
        try{
            
            parametros.put("PARAM1","40293174000104");   
            JasperPrint impressao = JasperFillManager.fillReport(pathJasper
            + "relatorio4.jasper", parametros,con);
            // Grava o relatório em disco em pdf
            JasperManager.printReportToPdfFile(impressao, path
            + "/RelatorioLivros.pdf");
            // Redireciona para o pdf gerado
            response.sendRedirect("RelatorioLivros.pdf");

             
        }
      
        catch (Exception e) {
           response.getWriter().println("Erro ao gerar o relatório: " + e);
           }
        
        
    }
    
public void conexao() {
    
        try {  
         Class.forName("oracle.jdbc.driver.OracleDriver");
         con= DriverManager.getConnection("jdbc:oracle:thin:@10.10.10.30:8831:dsvapp01", "admgcl","admgcl");
        }
        catch (Exception e) {
          System.err.println("Problemas apresentados na operacao de conexao");  
          e.printStackTrace();  
        }  
    }
}
C

funcao do ManagedBean

public String  consulta() throws ServletException {
       Servlet1 s = new Servlet1();
       s.init();
       return "blabla";
        
     }
marcos.junqueira

Chame este método para imprimir o relarório a partir da action do jsf, sugiro montar uma classe com esses métodos.

/**
     * A partir do to tipo do relatório, do Exporter e do JasperPrint devolver o 
     * OutputStream do relatório no OutPutStream da Response.
     * @param tipo MIME TYPE do relatório. Será utilizado para configurar o MIME TYPE da Response.
     * @param exporter Exporter específico para cada tipo de relatório.
     * @param jasperPrint JasperPrint que irá gerar o relatório.
     */
    private void fillReport(String tipo, JRExporter exporter,
                             JasperPrint jasperPrint) {

        ExternalContext econtext = facesContext.getExternalContext();

        HttpServletResponse response = (HttpServletResponse) econtext.getResponse();
        response.setContentType(tipo);
        try {

            exporter.setParameter(JRExporterParameter.JASPER_PRINT,
                    jasperPrint);

            exporter.setParameter(JRExporterParameter.OUTPUT_STREAM,
                    response.getOutputStream());

            exporter.exportReport();

        } catch (RuntimeException ex) {
            ex.printStackTrace();
        } catch (JRException ex) {
            ex.printStackTrace();
        } catch (IOException ex) {
            ex.printStackTrace();
        }

        // Tell JavaServer Faces that no output is required
        facesContext.responseComplete();
    }

Aqui vc consegue o jasper print para imprimir seu relatório. Nesse caso eu estou compilando os jrxml em tempo de compilação e colocando os .jasper no WEB-INF

/**
     * Obtém um objeto JasperPrint para ser utilizado na configuração do Exporter de relatórios.
     * @return JasperPrint que será utilizado na configuração do Exporter.
     */
    private JasperPrint getJasperPrint() {

        InputStream stream = null;
        Connection conn = null;
        JasperPrint jasperPrint = null;

        try {
            stream = findReport();
            conn = basicDataSource.getConnection();
            ServletContext servletContext = (ServletContext) facesContext.getExternalContext().
                    getContext();
            String path = servletContext.getRealPath(PREFIX);
            params.put("SUBREPORT_DIR", path + File.separator);
            jasperPrint = JasperFillManager.fillReport(stream, params, conn);
        } catch (RuntimeException ex) {
            ex.printStackTrace();
            throw ex;
        } catch (JRException ex) {
            ex.printStackTrace();
            throw new FacesException(ex);
        } catch (SQLException ex) {
            ex.printStackTrace();
            throw new FacesException(ex);
        } finally {
            try {
                if (stream != null) {
                    stream.close();
                }
                if (conn != null) {
                    conn.close();
                }
            } catch (IOException ex) {
                ex.printStackTrace();
            } catch (SQLException ex) {
                ex.printStackTrace();
            }
        }
        return jasperPrint;
    }
Aqui tentamos pegar o relatório pelo nome do arquivo que está no WEB-INF
/**
     * Localiza o arquivo .jasper através do nome do relatório.
     * @return ImputStream contendo o arquivo .jasper
     */
    private InputStream findReport() {
        InputStream retValue = null;
        try {
            ServletContext servletContext = (ServletContext) facesContext.getExternalContext().
                    getContext();
            String realPath = servletContext.getRealPath(PREFIX + nome + SUFFIX);
            File file = new File(nome);
            retValue = new FileInputStream(realPath);

            if (retValue == null) {
                throw new IllegalArgumentException("O relatório de nome '" + nome + "' não foi encontrado.");
            }
        } catch (FileNotFoundException ex) {
            Logger.getLogger(Relatorios.class.getName()).log(Level.SEVERE, null,
                    ex);
        }
        return retValue;
    }
Aqui o método que irá chamar para imprimir um relatorio em PDF
/**
     * Devolve um relatório PDF na response.
     */
    public void pdfReport() {
        JRExporter exporter = null;

        exporter = new JRPdfExporter();

        JasperPrint jasperPrint = getJasperPrint();
        fillReport(PDF_MIME, exporter, jasperPrint);
    }
Aqui o construtor da classe e o init que obtem o contexto do jsf e o do spring caso vc queira pegar o datasource do hibernate que tbm tah configurado no spring.
public Relatorios(String nome, Map params) {
        setNome(nome);
        setParams(params);
        init();
    }

    private void init() {
        facesContext = FacesContext.getCurrentInstance();

        ApplicationContext ctx = FacesContextUtils.getWebApplicationContext(facesContext);

        basicDataSource = (ComboPooledDataSource) ctx.getBean("dataSource");
    }
E finalmente, mas não menos importante, a rotina ant que compila os arquivos .jrxml em .jasper. Lembre-se de mudar o caminho da pasta onde estão os arquivos do jasperreports
<property name="jrc.home"
              value="../lib/jasperreports-2.0.2"/>
    <!-- Define the classpath used for report compilation -->
    <path id="jrc.classpath">
        <fileset dir="${jrc.home}/dist"
                 includes="*.jar"/>
        <fileset dir="${jrc.home}/lib"
                 includes="*.jar"/>
    </path>
    <!-- Define the custom Ant task that compiles report definitions -->
    <taskdef name="jrc"
             classname="net.sf.jasperreports.ant.JRAntCompileTask">
        <classpath refid="jrc.classpath"/>
    </taskdef>
    <!-- Define the target that will compile reports, after Java compiles
         have been completed -->
    <target name="-post-compile"
            description="Compile all Jasper Reports Definitions">
        <jrc srcdir="${src.dir}/br/com/callink/reports"
             destdir="${build.web.dir}/WEB-INF/reports">
            <classpath
                refid="jrc.classpath"/>
            <include
                name="*.jrxml"/>
        </jrc>
    </target>
C

poxa, obrigada pela atenção, obrigada mesmo…outra coisa, nao entendi aonde coloca esse ultimo código quer vc colocou…

peerless

no build.xml do seu projeto

M

Pessoal, estou com um problema usando as mesmas tecnologias citadas, mas ainda não encontrei uma solução.

Estou fazendo mais ou menos a mesma coisa que o marcos está fazendo no método fillReport(). O problema é que após a geração do relatório, após escrever os bytes do PDF no OutputStream, o relatório sai corrompido.

Se eu gravo o relatório em um arquivo no HD, o relatório é gravado com sucesso, mas ao escrever os dados no response p/ enviar ao cliente, o PDF chega corrompido. E isso só ocorre dentro do contexto do JSF, um servlet separado por exemplo, gera normalmente os dados e o PDF é apresentado corretamente.

Alguém já teve um problema parecido?

Criado 6 de março de 2008
Ultima resposta 18 de mar. de 2008
Respostas 6
Participantes 4