Доброго всем времени суток. Когда я начинал изучать этот превосходный 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 файл и впишем следующие строки:
Дальше в унаследованном классе напишем процедуру по генерации отчета в pdf, и если все прошло нормально отображаем это на форме.
Маленькое замечание: если вы хотите передать в скомпилированный класс параметры и строку подключения, то для примера можно воспользоваться вот таким кодом:
Ну вот и все, очень просто и легко.
P.S. Если есть вопросы по zul разметке, по коду или вообще по фреймворку, то спрашивайте — в комментариях постараюсь ответить на все вопросы
Ой чуть не забыл. вот список всех нужных библиотек для того, чтобы все заработало:
файлы breeze.jar,sapphire.jar,silvertail.jar — это скины, так что их наличие у вас на сервере не обязательно
Ну, хватит прелюдий, начнем. Исходя из названия поста очевидно, что повествование будет вестись об интеграции 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 — это скины, так что их наличие у вас на сервере не обязательно