Pull to refresh

JasperReport+ZK интеграция без одного потраченного цента

Reading time3 min
Views4.3K
Доброго всем времени суток. Когда я начинал изучать этот превосходный framework zk, а было это года два назад, то конечно русских манов я не встретил, тогда я полез на всеми нами обожаемый хабр и таки нашел один вводный пост. Но он был настолько вводный (не в обиду уважаемому, который потрудился его написать), что пришлось обращаться к одному источнику, их же форуму . Поэтому, моя цель — заполнить эту огромную брешь в наличии русскоязычных туториалах.

Ну, хватит прелюдий, начнем. Исходя из названия поста очевидно, что повествование будет вестись об интеграции JasperReport с zk, и, чтобы эта интеграция прошла безболезненно для бюджета. Так как, если заглянуть сюда, то можно обнаружить такую нелицеприятную фразу — This feature requires ZK PE or EE.
Про CE, PE и EE лицензии можно почитать на их сайте, а если кратко, то только CE бесплатна. Но что же делать, если почти в любом приложении необходима реализация функций генерации и вывода отчетов пользователю. Есть несколько путей выхода из данной ситуации первый — заплатить за PE или EE, второй будет изложен здесь.

Начнем из далека, то есть с jasper скомпилированного класс. Для этих целей всем советую пользоваться продуктом iReport, отличный editor для проектирования, компиляции и предпросмотра отчетов. Расписывать как генерировать отчеты в JasperReport не буду, так как для этого есть куча даже русских хелпов. В итоге у нас будет скомпилированный отчет с расширением .jasper. Отлично, но про него пока забудем и напишем пару строчек кода интеграции.

Для простоты создадим zk project и в WebContent создадим, конечно, если он сам автоматом не сгенерировался, index.zul файл и впишем следующие строки:
<window title="ZK+JasperReport" border="normal" width="100%"
    use="ui.component.Main" id="wndMainForm">
    <label value="view report" />
    <toolbarbutton label="show->" onClick="wndMainForm.onShowMessage()" />
    <iframe id="iframe" width="100%" height="90%"/>
</window>


Дальше в унаследованном классе напишем процедуру по генерации отчета в pdf, и если все прошло нормально отображаем это на форме.
package ui.component;

import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.sql.Connection;

import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperExportManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;

import org.zkoss.util.media.AMedia;
import org.zkoss.zul.Iframe;
import org.zkoss.zul.Messagebox;
import org.zkoss.zul.Window;

public class Main extends Window
{
    private static final long    serialVersionUID    = 1L;

    public void onShowMessage() throws InterruptedException
    {
        try
        {
            JasperPrint print = JasperFillManager.fillReport("путь к файлу/HelloWorld.jasper", null);
            JasperExportManager.exportReportToPdfFile(print, "путь к файлу/HelloWorld.pdf");
            
            Iframe iframe = (Iframe) this.getFellow("iframe");
            File f = new File("путь к файлу/HelloWorld.pdf");
            byte[] buffer = new byte[(int) f.length()];
            FileInputStream fs = new FileInputStream(f);
            fs.read(buffer);
            fs.close();
            ByteArrayInputStream is = new ByteArrayInputStream(buffer);
            AMedia amedia = new AMedia("HelloWorld.pdf", "pdf", "application/pdf", is);
            iframe.setContent(amedia);
        } catch (IOException e)
        {
            Messagebox.show("Ошибка при чтении файла");
            e.printStackTrace();
        } catch (JRException e)
        {
            Messagebox.show("Ошибка при формировании pdf-файла");
            e.printStackTrace();
        }
    }
}

Маленькое замечание: если вы хотите передать в скомпилированный класс параметры и строку подключения, то для примера можно воспользоваться вот таким кодом:
HashMap<String, String> hm = new HashMap<String, String>();
hm.put("dateStart", new SimpleDateFormat("HH:mm:ss").format(dbStart.getValue()));
hm.put("pCommand", "\"Название команды\"");
Connection conn = ;// ну, тут море способов получить коннект, каждый использует свой любимый способ
JasperPrint print = JasperFillManager.fillReport("путь к файлу/HelloWorld.jasper",hm,conn );

Ну вот и все, очень просто и легко.
P.S. Если есть вопросы по zul разметке, по коду или вообще по фреймворку, то спрашивайте — в комментариях постараюсь ответить на все вопросы
Ой чуть не забыл. вот список всех нужных библиотек для того, чтобы все заработало:
  • breeze.jar
  • bsh.jar
  • commons-collections-3.1.jar
  • commons-digester-1.7.jar
  • commons-fileupload.jar
  • commons-io.jar
  • commons-lang-2.5.jar
  • commons-logging-1.1.1.jar
  • fckez.jar
  • groovy.jar
  • iText-2.1.0.jar
  • jasperreports-3.7.6.jar
  • jruby.jar
  • js.jar
  • jython.jar
  • sapphire.jar
  • silvertail.jar
  • zcommon.jar
  • zcommons-el.jar
  • zhtml.jar
  • zk.jar
  • zkplus.jar
  • zul.jar
  • zweb.jar

файлы breeze.jar,sapphire.jar,silvertail.jar — это скины, так что их наличие у вас на сервере не обязательно
Tags:
Hubs:
Total votes 7: ↑5 and ↓2+3
Comments4

Articles