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?
JSF + ireports
6 Respostas
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();
}
}
}
funcao do ManagedBean
public String consulta() throws ServletException {
Servlet1 s = new Servlet1();
s.init();
return "blabla";
}
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;
}
/**
* 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;
}
/**
* Devolve um relatório PDF na response.
*/
public void pdfReport() {
JRExporter exporter = null;
exporter = new JRPdfExporter();
JasperPrint jasperPrint = getJasperPrint();
fillReport(PDF_MIME, exporter, jasperPrint);
}
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");
}
<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>
poxa, obrigada pela atenção, obrigada mesmo…outra coisa, nao entendi aonde coloca esse ultimo código quer vc colocou…
no build.xml do seu projeto
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?