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);
}
<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>
<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.