jasper pdf报告没有显示

时间:2014-11-09 12:13:56

标签: pdf jsf-2

我的JSF 2.0 Web应用程序旨在生成PDF报告。 问题是资源管理器窗口中没有显示PDF报告。 我使用的是eclipse kepler,apache-tomcat-7.0.52和jasper Ireport的版本是4.8 任何帮助将不胜感激。

我将提供整个java类:

   package khldqr.beans;


import java.io.File;
import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;

import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperRunManager;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;


@ManagedBean 
@SessionScoped

public class TestReport  {

    private List<Refugee> refugee;  


    public List<Refugee> connectRefugeeData() {
        ResultSet rs = null;
        PreparedStatement pst = null;
        Connection con = Database.getConnection();
        String stm = "Select R_NO, F_P_Name from M_MAIN_INFO where R_NO < 10";

        refugee = new ArrayList<Refugee>();

        try {
            pst = con.prepareStatement(stm);
            pst.execute();
            rs = pst.getResultSet();

            while (rs.next()) {
                Refugee refugeelist = new Refugee();
                refugeelist.setR_NO(rs.getInt(1));
                refugeelist.setF_P_Name(rs.getString(2));

                refugee.add(refugeelist);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return refugee;
    }

        public void PDF(ActionEvent actionEvent) throws IOException, JRException {
            System.out.println("this is not my lucky day!!!!!");
            File jasper = new File(FacesContext.getCurrentInstance().getExternalContext().getRealPath("report/Majd.jasper"));
            byte[] bytes = JasperRunManager.runReportToPdf(jasper.getPath(),null,new JRBeanCollectionDataSource(refugee));
            HttpServletResponse response =(HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();
            response.setContentType("application/pdf");
            ServletOutputStream outputStream = response.getOutputStream();
            outputStream.write(bytes, 0 , bytes.length);
            outputStream.flush();
            outputStream.close();
            FacesContext.getCurrentInstance().responseComplete();
        }

    public TestReport() {
    connectRefugeeData();
    }

    public List<Refugee> getRefugee() {
        return refugee;
    }

    public void setRefugee(List<Refugee> refugee) {
        this.refugee = refugee;
    }

}

这里是xhtml文件:

    <?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:p="http://primefaces.org/ui">

<h:head>
    <title>Hello To GOPA World!!</title>

</h:head>

<h:body dir="rtl">


               <h:form>
                <p:commandButton value = "PDF" actionListener="#{testReport.PDF}"></p:commandButton>
                 </h:form>
    <h:dataTable value="#{testReport.refugee}" var="var">
    <h:column>
      <h:outputText value="#{var.r_NO}"></h:outputText>
    </h:column>

    <h:column >
      <h:outputText value="#{var.f_P_Name}"></h:outputText>
    </h:column>
    </h:dataTable>

</h:body>
</html>

我可以在控制台上看到该消息,页面会刷新,但资源管理器屏幕上没有PDF报告

我已使用下面的代码替换了上述PDF方法,但是徒劳无功,结果相同:浏览器屏幕上没有PDF报告。

   JasperPrint jasperPrint;
      public void init() throws JRException{
            JRBeanCollectionDataSource beanCollectionDataSource=new JRBeanCollectionDataSource(refugee);
    String  reportPath= "e:\\Rita.jasper";
    jasperPrint=JasperFillManager.fillReport(reportPath, new HashMap(),beanCollectionDataSource);
        }


       public void PDF(ActionEvent actionEvent) throws JRException, IOException{
           init();
           HttpServletResponse httpServletResponse=(HttpServletResponse)FacesContext.getCurrentInstance().getExternalContext().getResponse();
        //  httpServletResponse.addHeader("Content-disposition", "attachment; filename=report.pdf");
           FacesContext.getCurrentInstance().getExternalContext().setResponseContentType("‌​application/pdf");
           ServletOutputStream servletOutputStream=httpServletResponse.getOutputStream();
           JasperExportManager.exportReportToPdfStream(jasperPrint, servletOutputStream);
           System.out.println("All done the report is done");
           servletOutputStream.flush();
           servletOutputStream.close(); 
           FacesContext.getCurrentInstance().responseComplete();
       }

2 个答案:

答案 0 :(得分:0)

代码是正确的,它没有任何问题。 问题是某种安全问题。 当报表位于所有用户的完整访问文件夹中时,我遇到了上述问题。 当我将所请求的xhtml和报告都放在一个安全的文件夹中时,一切都很顺利。 我不知道为什么!!但就是我的情况。 希望其他人会利用这一点。 THX。

答案 1 :(得分:0)

<p:commandButton value = "PDF" actionListener="#{testReport.PDF}" ajax="false" type="submit"></p:commandButton>

调用jasperReports时无法使用ajax