[Resolvido]Flex4+Java servlets+relatorios Ireport

E ai galera!

Meu primeiro topico aqui no forum,preciso da ajuda de voces…to fazendo um dinamic web project em flex4,com back em java e relatorios no ireport,o projeto ja esta pronto
mas estou setando o caminho dos relatorios estaticos,mas como vai ser rodado em servidores nao pode ser assim,ai criei uma classe servlet para obter o caminho da aplicaçao para passar este caminho na hora de gerar o relatorio:

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

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

import net.sf.jasperreports.engine.JRDataSource;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import net.sf.jasperreports.view.JasperViewer;

import src.mv.comparaObjeto.ListaNaoConformidade;
import src.mv.naoConformidades.NaoConformidade;

public class ServletRelatorios extends HttpServlet {

	
	private static final long serialVersionUID = 1L;

	public void doPostRelatorioTabelas(HttpServletRequest req,
			HttpServletResponse res, String pathBanco, String nomeCon,
			ArrayList<NaoConformidade> listNC) {

		String pathJasper = getServletContext().getRealPath(
				"/WEB-INF/classes/JavaSource/src/mv/relatorio/jasper/")
				+ "/";

		String path = getServletContext().getRealPath("/");

		Map<String, String> parametros = new HashMap<String, String>();
		parametros
				.put("SUBREPORT_DIR", pathJasper + "RelatorioTabelas.jasper");
		parametros.put("path", pathBanco);
		parametros.put("nomeCon", nomeCon);

		List<NaoConformidade> listNaoConformidade = listNC;

		JRDataSource dataSource = new JRBeanCollectionDataSource(
				listNaoConformidade);

		try {
			JasperPrint jp = JasperFillManager.fillReport(pathJasper
					+ "RelatorioTabelas.jasper", parametros, dataSource);
			JasperViewer.viewReport(jp, false);
		} catch (JRException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

preciso saber como chamo essa classe e esse metodo no flex4 de um botao para gerar esses relatorios,ja configurei o web.xml mapeando o servlet e tambem o remoting config,alguem pode me ajudar???

Se é uma servlet você pode chamar usando o navigateToUrl que irá chamar essa servlet em uma nova aba/janela do navegador. Esse servlet não precisa estar configurado no remoting-config.xml.

hum,foi o que eu fiz,mas pra mim chama o metodo que esta nesta servlet???

private function geraRelatoriosResult(event:MouseEvent):void {
			
			
				navigateToURL(new URLRequest("JavaFlex/ServletsRelatorio");
					
				
								
				
}

ou eh soh no URlRequest + / nomeDoMetodoDoServlet???

É como se fosse chamar uma URL normal pelo browser: localhost:8080/aplicacao/servlet
No URLRequest voce configura se é POST ou GET

A pouco tempo estava tendo a mesma dúvida com o Flex 3 que acredito que a solução é a mesma então no meu caso eu precisa também passar um parametro para a servlet por isso meu código para chamar a servlet no flex ficou assim:

[code]public function gerarNovoRelatorio(numId:Number):void
{
var urlReq:URLRequest = new URLRequest(“relatorioos”); //no parametro define a url mapeada da sua servlet no meu caso relatorioos
var param:URLVariables = new URLVariables(); //se precisar enviar parametros para a servlet use esse objeto
param.id = numId; //passagem de parametro o parametro enviado terá o nome de id
param.nome = “teste”; //outro parametro

urlReq.data = param; //adiciona os parametros  
urlReq.method = "POST"; //usando método POST  
navigateToURL(urlReq, "_blank"); //chama Servlet em uma nova página  

}[/code]

acredito que irá te ajudar qualquer coisa é só perguntar ai

Perfeito,consegui faze chama a servlet,só que no meu caso eu preciso passar pelo Post um arraycollection que será meu datasource que eu passo para o ireport,o problema é que não achei nenhuma forma de passar outro tipo de dado a nao ser String…Existe uma forma de eu passa um array pelo post para eu setar no JRdatasource???

private function relatorios(event:MouseEvent):void {
				var request:URLRequest = new URLRequest("ServletRelatorios");
				var parametros:URLVariables = new URLVariables();
				parametros.path = "teste";
				parametros.listaNC = listNC; // MEU ARRAYCOLLECTION QUE TENHO Q PASSAR PARA O JRDATASOURCE
				parametros.nomeCon = "teste";
				request.method = "POST";
				request.data = parametros;
				navigateToURL(request,"_blank");
							   
			}

[code]
public void processaRequisicao(HttpServletRequest req,
HttpServletResponse res) {
String pathJasper = getServletContext().getRealPath(
"/WEB-INF/classes/JavaSource/src/mv/relatorio/jasper/")
+ “/”;

	String path = getServletContext().getRealPath("/");

	Map<String, String> parametros = new HashMap<String, String>();
	parametros.put("SUBREPORT_DIR", pathJasper + "RelatorioTabelas.jasper");
	parametros.put("path", req.getParameter("path"));
	parametros.put("nomeCon", req.getParameter("nomeCon"));

	JRDataSource dataSource = new JRBeanCollectionDataSource(req.getParameter("listaNC")); // aki preciso pegar esse array

	try {
		JasperPrint jp = JasperFillManager.fillReport(pathJasper+"RelatorioTabelas.jasper",
				parametros, dataSource);
		JasperViewer.viewReport(jp, false);
	} catch (JRException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
}

Olha dá uma olhada em JSONObject, da uma procurada ai no google, ele funciona da seguinte forma transforma objetos ou array em String e depois os converte.

flw!!

Blz,axo q no meu caso as servlets nao ajudarão muito…hehehehehm,mas valeu pela ajuda a todos :smiley:

Cara não precisa usar servelet
Você pode pegar o caminho relativo da tua aplicação.

[code] /**
* Pega o caminho de um arquivo no programa
* @param classe
* @param resource
* @return
*/
public URL getLocalURL(Class classe, String resource) {

    java.net.URL url = classe.getResource(resource);  
    return url;  
   
 } [/code]

Este método pega o caminho.
Mas vc tem fazer o seguinte, espelhar o pacote onde tem tua relatorio no javaSource vc espelha o com o mesmo nome de pacote, só que não precisa vc ter no javaResource uma classe, somente os relatorios.
Com relação aos parametros vc faz o seguinte.
Na Class classe vc passa o nome da tua classe no JavaSource. Então ficaria assim ClasseRelatotio.class e no resource vc passa o nome do teu relatorio mais a extensão dele.

Acho que isto pode te ajudar.
Valeu!

O.o cara deu certinho aki,pra mim usa as servlets eu nao poderia passa um arraylist de objetos por meio do request entao larguei de mão as servlets,mas isso deu certinho pego o caminho relativo do meu diretorio… :lol:

vlw msm,pow gurizada vcs sao os cara,devo uma…

meu codigo fiko o seguinte:

public void geraRelatorioTabelas(ArrayList<NaoConformidade> listNC,
			String path, String nomeBanco) throws FileNotFoundException,
			IOException {

		String subreport = ""
				+ getLocalURL(Relatorio.class, "RelatorioTabelas.jasper");
		subreport = (String) subreport.substring(6, subreport.length());
		subreport = (String) subreport.substring(0, 123);
		subreport = subreport.replaceAll("%20", " ");

		HashMap parametros = new HashMap();
		parametros.put("pathImage", subreport + "marca_cliente.png");
		parametros.put("SUBREPORT_DIR", subreport);
		parametros.put("path", path);
		parametros.put("nomeCon", nomeBanco);

		String arquivoJ = ""
				+ getLocalURL(Relatorio.class, "RelatorioTabelas.jasper");
		arquivoJ = (String) arquivoJ.subSequence(6, arquivoJ.length());
		arquivoJ = arquivoJ.replaceAll("%20", " ");
		JasperReport arquivo = null;
		try {
			arquivo = (JasperReport) JRLoader.loadObject(arquivoJ);
		} catch (JRException e1) {
			// TODO Auto-generated catch block

			e1.printStackTrace();
			System.err.println("NAO CONSEGUIU CARREGA O .JASPER!!!!!");
			System.err.println("CAMINHO ARQUIVO: " + arquivoJ);
		}
		System.out.println(subreport.toUpperCase());
		System.out.println(arquivoJ.toUpperCase());
		List<NaoConformidade> listNcTab = listNC;

		JRDataSource dataSource = new JRBeanCollectionDataSource(listNcTab);

		try {
			JasperPrint jp = JasperFillManager.fillReport(arquivo, parametros,
					dataSource);
			JasperViewer.viewReport(jp, false);
		} catch (JRException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			System.err.println("PROBLEMA NA HORA DE DA O FILLMANAGER!!!!");
		}

	}