Duvidas com Jasper Report + Servlet + Flex

Boa noite pessoal.

Mudei o tópico p/ este forum pois no de frameworks não obtive nem ao menos uma resposta.

Preciso de uma ajuda para configurar uma servlet no meu projeto, estou senguindo um tutorial da net no blog do Jandersonfc http://www.jandersonfc.com/tutorial-java-flex-ireport-na-pratica-10/ onde ele ensina trabalhar com uma aplicação java + Flex e ireport.

Desculpem sou iniciante então tenho muitas duvidas em relação a arquitetura de servlets e ireport.

Minhas duvidas são, como posso adicionar novos parâmetros nesta servlet.
preciso passar parâmetros de pesquisa como filtros por nome e também por intervalos de data.

Também preciso chamar vários relatórios aqui só coloquei 3 de teste eu consigo chamar eles na minha aplicação Flex, todos só funcionado o parâmetro (where) posso usar esta mesma servlet para vários relatórios com filtros diferentes ou preciso criar uma servlet para cada relatório?

Esta servlet trabalha com beans e um JRBeanCollectionDataSource recebendo (dados).

Trabalhando com beans estes filtros eu tenho que configurar na minha camada de persistência no caso estou usando Hibernate para o crud das minhas entidades?

pelo o que eu entendi do funcionamento desta servlet ela recebe este (where) como um select de todos os campos da minha tabela, gostaria agora de adicionar novos parâmetros nesta servlet como um filtro findByName e um findByDataRange informando um intervalo de tempo para filtrar.

segue o codigo da servlet abaixo e um trecho da minha classe de serviço que contem o método (where).

[code]@SuppressWarnings(“serial”)
public class ServletReport extends HttpServlet {

private ServletContext sc;

private FactoryService factoryService = new FactoryService();

public void init(ServletConfig config) throws ServletException{
	super.init(config);
	
	sc = config.getServletContext();
	
	WebApplicationContext webApplicationContext = WebApplicationContextUtils
			.getWebApplicationContext(sc);
	
	AutowireCapableBeanFactory autowireCapableBeanFactory = webApplicationContext
			.getAutowireCapableBeanFactory();
			
	autowireCapableBeanFactory.configureBean(factoryService, "FactoryService");
}

@SuppressWarnings("unchecked")
protected void service(HttpServletRequest request,
		HttpServletResponse response) throws ServletException, IOException{
	
	List<?> dados = new ArrayList();
	File reportFile = null;
	HashMap parameters = new HashMap();
	
	String acao = request.getParameter("acao");
	String where = request.getParameter("where");
	
	if (acao.equals("usuario")){
		dados = factoryService.usuarioService.filterReport(where);
		reportFile = new File(sc.getRealPath("WEB-INF/reports/Rel_Usuario.jasper"));
	}
	
	if (acao.equals("alarmes")){
		dados = factoryService.alarmeService.filterReport(where);
		reportFile = new File(sc.getRealPath("WEB-INF/reports/Rel_Alarmes.jasper"));
	}
	
	if (acao.equals("temperaturas")){
		dados = factoryService.temperaturaService.filterReport(where);
		reportFile = new File(sc.getRealPath("WEB-INF/reports/Rel_Temperaturas.jasper"));
	}
	
	byte[] bytes = null;
	
	JRDataSource jrds = new
	JRBeanCollectionDataSource(dados);
	
	try{
		bytes = JasperRunManager.runReportToPdf(reportFile.getPath(),
				parameters, jrds);
	} catch (JRException e){
		e.printStackTrace();
	}
	
	if (bytes != null && bytes.length > 0){
		response.setContentType("application/pdf");
		response.setContentLength(bytes.length);
		ServletOutputStream outputStream = response
				.getOutputStream();
		outputStream.write(bytes, 0, bytes.length);
		outputStream.flush();
		outputStream.close();
	}
}

}
[/code]

Na minha camada de negocio tenho estes métodos:

        public List<Usuario> findByName(String nome){
		return usuarioRepository.findByName(nome);
	}
	
	public List<Usuario> filterReport(String where){
		return usuarioRepository.filterReport(where);
	}

Apreciaria muito uma ajuda com meu problema estou dependendo muito do funcionamento desta servlet para o funcionamento do meu projeto.

Obrigado.

Se você for usar o próprio Browser para abrir seu relatório através da servlet você pode chama-la assim no flex depois de configurar sua servlet

[code]var urlReq:URLRequest = new URLRequest(“seuRelatorio”); //mandar url da servlet para o contrutor
//para enviar parametro juntos use isso lembrando que só serão convertidos para String
var param:URLVariables = new URLVariables();
param.id = 15; //manda o parametro chamado id com o valor 15
param.titulo = “Testando Relatorio”; //manda o parametro chamado titulo com o valor “Testando Relatorio”

urlReq.data = param; //adicionar parametros
urlReq.method = “POST”; //usar metodo POST para chamar a servlet
navigateToURL(urlReq, “_blank”); //abrir servlet em uma nova página que depois irá criar o relatório[/code]

Caso você espera uma resposta da sua servlet você terá que usar a classe HTTPService

Não sei se é exatamente isso a sua dúvida mas qualquer coisa avisa ai!

Cara, JRBeanCollectionDataSource não precisam estar sendo controladores pelo Hibernate, é simplemente uma collection, vinda do Hibernate ou não.

Com relaçãp a por um servlet para cada relatório, não acho interessante. Eu colocaria um único servlet para receber qualquer pedido por relatório, sabendo qual relatório está sendo pedido, eu o geraria no business e retornaria, pronto.

[quote=Ivan Alves]Se você for usar o próprio Browser para abrir seu relatório através da servlet você pode chama-la assim no flex depois de configurar sua servlet

[code]var urlReq:URLRequest = new URLRequest(“seuRelatorio”); //mandar url da servlet para o contrutor
//para enviar parametro juntos use isso lembrando que só serão convertidos para String
var param:URLVariables = new URLVariables();
param.id = 15; //manda o parametro chamado id com o valor 15
param.titulo = “Testando Relatorio”; //manda o parametro chamado titulo com o valor “Testando Relatorio”

urlReq.data = param; //adicionar parametros
urlReq.method = “POST”; //usar metodo POST para chamar a servlet
navigateToURL(urlReq, “_blank”); //abrir servlet em uma nova página que depois irá criar o relatório[/code]

Caso você espera uma resposta da sua servlet você terá que usar a classe HTTPService

Não sei se é exatamente isso a sua dúvida mas qualquer coisa avisa ai!
[/quote]

É bem isso mesmo Ivan já consegui melhorar um pouco a questão dos métodos, já consigo filtrar por nome e imprimir em PDF, tenho algumas duvidas ainda esta parte de relatórios é complicada pra alguém que nunca fez uma implementação destas.

Outra duvida que tenho é com a questão dos parâmetros na Servlet, eu queria concatenar um retorno tipo eu fiz uma pesquisa por nome, mas também preciso passar um parâmetro de intervalo de data. A minha duvida é onde eu passo isso, posso filtrar por nome no meu método java e passar os parâmetros de intervalo de data dentro do relatório ou tem alguma maneira de fazer isso diretamente no método java.

Não sei se fui claro na explicação, mas preciso imprimir um relatório que retorne uma pesquisar por nome e intervalo de datas.

Obrigado pela ajuda