Доброго всем времени суток. Когда я начинал изучать этот превосходный 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 — это скины, так что их наличие у вас на сервере не обязательно
