Servlet e commandLink

7 respostas
M

Seguinte:
Sou iniciante em Java Web. Estou tentando gerar relatórios pelo iReport3.7.3 passando parâmetros pra ele. Utilizo uma servlet para fazer isso e funciona corretamente, até eu precisar especificar parâmetros.
Venho enfrentando vários problemas por nao conhecer o ambiente: java, mb, jsf, xml. Mas o maior deles é não saber como fazer rodar a tal servlet de dentro de um a4j:commandLink ou h:commandLink. Eu sei que existe o parametro action, mas para utilizá-lo eu preciso mapear uma mb no faces-config.xml e chamá-lo através de um método.
O que desejo saber é isso: Se tem como eu chamar uma servlet de dentro do commandLink, passando um parâmetro para ela, sendo que ela possui o método doPost (onde eu crio os relatórios e preciso restringir a query.)?

ps.: Já tentei fazer um outro método pra chamar o doPost, mas não sei como passar o request e response desta forma.

servlet:
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	
		//System.out.println("SERVLETPATH: " + request.getServletPath());
			
		String caminhoRelatorio = "/relatorios/ProgressoAlunos.jasper";
			
		ServletContext sc = request.getSession().getServletContext();
		File reportFile = new File(sc.getRealPath(caminhoRelatorio));
		System.out.println("Bytes: " + reportFile.getUsableSpace());
		try {
			JasperReport jasperReport = (JasperReport) JRLoader.loadObject(reportFile.getPath());
		} catch (JRException e1) {
			e1.printStackTrace();
		}
		
		
		//COM O HASHMAP VOCÊ INDICA OS NOMES DOS PARÂMETROS E O SEU TIPO.
		HashMap<String, String> parametros = new HashMap<String, String>();
		/*parametros.put("nome", new String());
		parametros.put("pai", new String());
		parametros.put("mae", new String());*/
		
		//GERANDO OS DADOS PARA TESTE
		
		JRDataSource jrds = null;
		
		try {
			Class.forName( driver );
			Connection con = DriverManager.getConnection( url , login , pwd );
			Statement stm = con.createStatement();
			
			String query = "SELECT  aluno.Pai AS aluno_Pai, aluno.Mae AS aluno_Mae, pessoa.Nome AS " +
					"pessoa_Nome, pessoa.Sexo AS pessoa_Sexo, pessoa.Endereco AS pessoa_Endereco, " +
					"pessoa.Email AS pessoa_Email FROM aluno INNER JOIN pessoa ON aluno.id_pessoa = " +
					"pessoa.id_pessoa";
			
			ResultSet resultSet = stm.executeQuery( query );
			
			jrds = new JRResultSetDataSource(resultSet);	
			
			
		} catch (Exception e1) {
			response.setStatus(Response.BAD);
			response.getWriter().print("ERRO AO GERAR RELATÓRIO.\n" + e1.getMessage());			
		}
		
		//O RELATÓRIO PRECISA DE UM DATASOURCE
		//JRDataSource jrds = new AlunoTesteJRDataSource(alunos);
		
		
		//O RELATÓRIO GERADO RETORNA UM TIPO BYTE		
		byte[] bytes = null;
		try {			
			
			//AQUI ONDE SE GERA O RELATÓRIO
			bytes = JasperRunManager.runReportToPdf(reportFile.getPath(), parametros,jrds);
		
		} catch (JRException e) {
			System.err.println(e.getMessage());			
		}
		
		
		try{		
			//O SERVLET AGORA PRECISA 'IMPRIMIR' O RELATÓRIO GERADO
			//QUE ESTÁ NO FORMATO DE BYTE
		
			if (bytes != null && bytes.length > 0) {
				ServletOutputStream ouputStream = response.getOutputStream();
				response.reset();
		
		        response.setContentType("application/pdf");  
		        response.setContentLength(bytes.length);  
		                    
		        ouputStream.write(bytes, 0, bytes.length);  
		        ouputStream.flush();  
		        ouputStream.close();  
		    }
		}catch (Exception e) {
			System.out.println(e.getMessage());
		}
	}	
	
	public void gerarRelatorio(String defineConsulta) throws ServletException, IOException 
	{	
		FacesContext context = FacesContext.getCurrentInstance();
		HttpServletRequest req = (HttpServletRequest) context.getExternalContext().getRequest();
		      
		//long id = new Long( req.getParameter("pessoaId") ).longValue();
				
		HttpServletResponse response = null;
		
		this.doPost(req, response);
	}
como eu estou tentando chamar no jsp:
<a4j:commandLink action="#{relatorio.gerar}" ajaxSingle="true" id="selectlink">
	<f:param value="#{reg.idPessoa}" name="pessoaId"></f:param>							
	<h:graphicImage value="/images/pdfpequeno.gif" style="border:0" />
</a4j:commandLink>

no faces-config.xml:

<managed-bean>
	<managed-bean-name>relatorio</managed-bean-name>		
	<managed-bean-class>br.ifba.relatorios.CriarRelatorios</managed-bean-class>
	<managed-bean-scope>session</managed-bean-scope>
</managed-bean>

<navigation-case>			
	<from-outcome>gerar_relatorio</from-outcome>
	<to-view-id>/pages/relatorios.jsp</to-view-id>
</navigation-case>
no web.xml:
<servlet>
  		<description /> 
  		<display-name>CriarRelatorio</display-name> 
  		<servlet-name>CriarRelatorio</servlet-name> 
  		<servlet-class>br.ifba.relatorios.CriarRelatorio</servlet-class> 
  	</servlet>
  	
	<servlet-mapping>
  		<servlet-name>CriarRelatorio</servlet-name> 
  		<url-pattern>/CriarRelatorio</url-pattern> 
  	</servlet-mapping>

Desde já agradeço qualquer resposta.

7 Respostas

M

Alguma ajuda gente?!!

L

Você NÃO precisa do JSF pra invocar o Servlet! Fazer isso é até gambiarra…

Minha sugestão: ao invés de usar doPost(), vá de doGet(). Depois, mapeie o Servlet no web.xml, e invoque a URL usando um anchor (sabe qual é? o ).

M

Desculpa, como eu disse, eu sou iniciante. Não tenho a mínima idéia de como mexer com passagens de parâmetros JSP-Servlets. Poderia me explicar a tua solução um pouco mais detalhado?! :oops:

E me desculpe se não me fiz entender, mas é padrão do sistema o JSF e talz. A servlet já está mapeada. Agora preciso saber como passar o tal parâmetro (o id da Pessoa) pra servlet.
:lol:

L

A chamada a Servlet é feita através de uma URL, e isso pode ser feito com HTML puro.

Suponha que você mapeou a Servlet com o nome “Relatorio”, você criaria um anchor assim:

<a href="${pageContext.request.contextPath}/Relatorio">Exibir Relat&oacute;rio</a>

É isso, apenas um link para o URL do seu relatório.

M

Muito obrigada pela ajuda amigo!

Mas testei pôr o link pro relatório e ele vem totalmente em branco. O que poderá ser isso? Já tinha conseguido fazer com um button tb em html, mas da msm forma o relatório vem em branco. Me parece q o parâmetro não está sendo passado corretamente da página jsf pra servlet fiz desta forma:

...

                HashMap<String, String> parametros = new HashMap<String, String>();
		String idPassado = request.getParameter("pessoaId");
		//parametros.put("idPassado", idPassado);
		
		//GERANDO OS DADOS PARA TESTE
		/*FacesContext context = FacesContext.getCurrentInstance();
		HttpSession session = (HttpSession) context.getExternalContext().getSession(false);
		String idPassado = (String)session.getAttribute("pessoaId");
		if (idPassado.equals("") || idPassado.equals(null)) idPassado = "0";*/
						
		JRDataSource jrds = null;
		
		try {
			Class.forName( driver );
			Connection con = DriverManager.getConnection( url , login , pwd );
			Statement stm = con.createStatement();
				
			String query = "SELECT aluno.Pai AS aluno_Pai, aluno.Mae AS aluno_Mae, pessoa.Nome AS " +
					"pessoa_Nome, pessoa.Sexo AS pessoa_Sexo, pessoa.Endereco AS pessoa_Endereco, " +
					"pessoa.Email AS pessoa_Email FROM aluno aluno INNER JOIN pessoa pessoa ON " +
					"aluno.id_pessoa = pessoa.id_pessoa where pessoa.id_pessoa = " + idPassado;
			
			ResultSet resultSet = stm.executeQuery( query );
			
			jrds = new JRResultSetDataSource(resultSet);
						
			
			
		} catch (Exception e1) {
			response.setStatus(Response.BAD);
			response.getWriter().print("ERRO AO GERAR RELATÓRIO.\n" + e1.getMessage());			
		}
                ...

Também pus um image dentro do link e ela não aparece na tela, testei no IE e Firefox.

<form action="../CriarRelatorio" method="get">
	<h:inputText  id="pessoaId" value="#{reg.idPessoa}"/>
	<a href="${pageContext.request.contextPath}/CriarRelatorio"><img src="/imagens/icone_pdf.jpg" border="0"></a>
</form>
M

Gente agora estou precisando resolver outra coisa!

Como passar um valor (‘value’) dinamicamente através da tag html input pra eu poder resgatar em um página java?
Quando eu passo o valor estaticamente, ou seja, passando um valor na “mão grande” ex.: value=“123456” ele gera o relatório perfeitinho, q nem eu quero. Mas quando passo dinamicamente me parece que o valor não é pego, daí o relatório vem totalmente em branco.

Estou setando assim:

<input type="image" src="/image/icone_pdf.jpg" value="${reg.idPessoa}" alt="Gerar" name="btnGerar"/>

Estou resgatando assim:

String idPassado = request.getParameter("btnGerar");

**Só pra explicar: eu estou tentando pegar o valor de outro input pra passar nesse input pra uma servlet. Isso é possível/

M
Pessoal! Foi SOLUCIONADO. Um colega aqui de cima, o Leonardo03... me ajudou e muito. Obrigada amigo! Aí vai a resposta, era só fazer assim:
<a href="${pageContext.request.contextPath}/CriarRelatorio?pessoaId=<h:outputText value="#{reg.idPessoa}" />"><img src="/imagens/icone_pdf.jpg" border="0"/></a>

ou assim

<form action="${pageContext.request.contextPath}/CriarRelatorio" method="GET">    
	<input type="hidden" name="pessoaId" value="<h:outputText value="#{reg.idPessoa}" />"/>  
	<input type="submit" value="Exibir relatorio">  
</form>
:D :lol: :D

Grata!

E agora? como fechar o tópico? uahuahuahu

Criado 14 de julho de 2010
Ultima resposta 22 de jul. de 2010
Respostas 7
Participantes 2