我编写了一个简单的应用程序来从服务器上获取订单。我决定能够运行一些报告并在JasperViewer中显示它们,然后从那里决定我是否要以其他格式打印或导出/保存。当我在NetBeans中运行该项目时,它运行良好,但是一旦将其编译并发布到服务器中,该报表便会运行,但无法在JasperViewer中打开该报表。实际上,查看器根本不会启动。

这是我的代码:

try {
    Connection con = DriverManager.getConnection(
            "jdbc:mysql://MYDATABASE",
            "MY_UN",
            "MY_PW");

    java.sql.Statement stmt = con.createStatement();

    ResultSet rs = stmt.executeQuery("SELECT `Product_ID` AS PRODUCT_ID, `Name` AS PRODUCT_DESCRIPTION, `Qty` AS QTY, `Price` AS PRICE_EACH_LINE, `Line_Total` AS LINE_TOTAL_LINE FROM `orderlines`;");

    JRResultSetDataSource resultSetDataSource = new JRResultSetDataSource(rs);

    final Map<String, Object> parameter = new HashMap<String, Object>();
    parameter.put("DEALER_NAME", "TY JACOBS");
    parameter.put("DEALER_STREET", "MY_ADDRESS");
    parameter.put("DEALER_CITY_STATE_ZIP", "MY_CITY_STATE_ZIP");
    parameter.put("DEALER_PHONE", "MY_PHONE_NUMBER");

    ClassLoader classloader = getClass().getClassLoader();
    InputStream url = null;
    url = classloader.getResourceAsStream("OK/report3.jrxml");
    JasperReport jasperReport = JasperCompileManager.compileReport(url);

    JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, parameter, resultSetDataSource);

    JasperViewer.viewReport(jasperPrint, false);

} catch (SQLException|JRException ex) {
    Logger.getLogger(DbReportDSFill.class.getName()).log(Level.SEVERE, null, ex);
}


还有一件事,我也可以在本地运行它,没有任何问题。似乎只有将其发布到服务器后,我才能在JasperViewer中获取报告。

最佳答案

我认为,我们也有类似情况。使用JasperViewer.viewReport(jasperPrint,false);,它显示在部署它的同一服务器上。因此,当您在本地执行时,它在本地部署时可以正常工作。您可以验证尝试从其他系统访问本地URL,并且会看到jasperviewer将在您的系统中打开,而不是从调用它的位置打开。

这是我们所做的:
转换为字节数组,然后将其传递给前端进行显示。

byte[] byteArray = JasperExportManager.exportReportToPdf(jasperPrint);


然后httpServletResponse.getOutputStream().write(byteArray);

希望这可以帮助!

08-06 00:57