[Resolvido/contribuição] Relatorio em Aplicação Web

Pessoal cheguei na parte do relatórios em minha primeira aplicação Web, e estou apanhando tenho duvidas como:
Qual pasta correta devo colocar os arquivos de relatorios compilados ??
Qual o caminho correto para chama-los ??
Devo chama-lo por um Servelts ??
A imagem abaixo demonsta a extrutura do projeto, qual é a pasta correta para se colocar os arquivos de relatorios ?


projeto em jboss seam.

isso é bem relativo,pq depende do tipo de relatorio, vc pode gerar ela para uma pasta /admin/report pq sao reports que só adm pode ter acesso, uma vez que vc terá regras de segurança de acesso na sua app, se colocar na raiz da webcontent,todos podem ter acesso, imagine o diretor da empresa gerar um relatorio, onde tem la o lucro da empresa, o salario dos presidentes etc. e isso ficasse disponivel para todos que soubesse o path. complicado ne?

Preciso de ajuda, coloque os arquivos de relatorios na pasta WebContent/relatorios
mas da erro de que o arquivo nao foi encontrado

não estou conseguindo passar o caminho certo

Pessoa ai vai uma solução para quem está começando com relatórios em Aplicações web Igual a mim.
Sempre fiz relatórios em aplicações Desktop, sem problemas.
Agora comecei a desenvolver em JEE.
Muitos problemas com relatóios, varias soluções testadas, pesquisas em livros, google e fórum.
Depois de uma semana finalmente consegui exibir relatorio em PDF através do navegador.
Ai vai o código para quem está precisando.

[code]package servlets;

import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.HashMap;

import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperRunManager;
import classes.ConnectionJDBC;

public class ComprovanteVenda extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException, SQLException, ClassNotFoundException {
try{

		   ServletOutputStream servletOutuputStream  = response.getOutputStream();
		   String caminho = "/relatorio/ReVendaRapida.jasper";// caminho dentro do WebContent
		   InputStream reportStream = getServletConfig().getServletContext().getResourceAsStream(caminho);
		   
		   new ConnectionJDBC();
		     Connection conn = ConnectionJDBC.getconexao();//Conexão 
		     
		     Long codigo = Long.parseLong(request.getParameter("codigo"));//código ou Pk do objeto vinda por requisição
		     HashMap<String, Long> parameterMap = new HashMap<String, Long>();
		     parameterMap.put("PAR_PEDIDO",codigo);//parametros
		     
		     JasperRunManager.runReportToPdfStream(reportStream, servletOutuputStream, parameterMap, conn);//exporta para o browser em PDF
		     response.setContentType("application/pdf");
		     servletOutuputStream.flush();
		     servletOutuputStream.close();
		     conn.close();
		     
	   }catch(JRException e){  
		     StringWriter stringWriter = new  StringWriter();
		     PrintWriter printWriter = new PrintWriter(stringWriter);
		     e.printStackTrace(printWriter);
		     response.setContentType("text/plain");
		     response.getOutputStream().print(stringWriter.toString());
	   }catch(Exception e){
		   e.printStackTrace();
	   }          
}	
public ComprovanteVenda() {
    super();     
}

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	try {
		processRequest(request, response);
	} catch (Exception e) {			
		e.printStackTrace();			 
	}			
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	try {
		processRequest(request, response);
	} catch (Exception e) {			
		e.printStackTrace();
	}		
}

}
[/code]