[Resolvido]Flex4+Java servlets+relatorios Ireport

9 respostas
V

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???

9 Respostas

R

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.

V

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???

R

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

Ivan_Alves

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:

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  
}

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

V
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 parametros = new HashMap();
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();
}
}

Ivan_Alves

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!!

V

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

andre07041989

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

/**
	 * 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;  
       
     }
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.
System.out.println("Caminho do arquivo " + getLocalURL(MinhaClasseRelatorio.class, "RelatorioIReport.jasper"));

Acho que isto pode te ajudar.
Valeu!

V

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!!!!");
		}

	}
Criado 22 de junho de 2011
Ultima resposta 27 de jun. de 2011
Respostas 9
Participantes 4