JasperReports JSF插件用例–简单列表报告

这是JasperReports JSF插件系列的第一篇“用例文章” ,我将专注于一个简单的需求,并且我将进一步深入。 起点是我们已经为图书商店完成的项目设置,我将向其中添加一个列表,其中包含在数据库中注册的其他图书,该列表也将作为报告提供。

向用户显示报告时,我们的应用程序将提供以下功能:

  • 用户将能够选择报告的输出格式。
  • 报告视图将是可本地化的,并将以与应用程序用户相同的语言环境输出。

最初设定

为了避免从功能上创建所有CRUD,为简单起见,我将初始化包含将使用SQL脚本显示的值的表。 仅几条记录就​​足以满足本文的目的,因此,我将使用以下脚本来提供书本表:

insert into book(title, author, published_year, genre, price)values('The Futurogical Congress', 'Stanislaw Lem', '1978', 'SciFi', 2.5);
insert into book(title, author, published_year, genre, price)values('Brave New World', 'H. G. Wells', '1975', 'SciFi', 3.99);
insert into book(title, author, published_year, genre, price)values('Treasure Island', 'Robert Lewis Stevenson', '1948', 'Adventures', 4.45);
insert into book(title, author, published_year, genre, price)values('The Lord of the Rings', 'J. R. Tolkien', '1945', 'Fantasy', 12.23);
insert into book(title, author, published_year, genre, price)values('In Cold Blood', 'Truman Capote', '1966', 'Nonfiction', 9.50);

我将创建一个资源包,其中将包含视图和报告的本地化文本。 该文件的名称为Messages.properties ,我将其添加到资源根文件夹下的包net.sf.jasperreports.jsf.sample.usecases中 。 文件内容如下:

report.format.select=Select report formatbookList.pageTitle=Browsing Books
bookList.id=Reference ID
bookList.title=Title
bookList.author=Author
bookList.genre=Genre
bookList.year=Year
bookList.price=Price

我添加了与上一个文件类似的另一个文件,但名为Messages_es.properties并保留了西班牙语翻译,如果您对支持多个以上的语言感兴趣,可以添加其他首选语言。 必须在faces-config.xml文件中配置先前的资源文件:

<faces-config ...><application><locale-config><default-locale>en</default-locale><supported-locale>es</supported-locale></locale-config><resource-bundle><var>Messages</var><base-name>net.sf.jasperreports.jsf.sample.usecases.Messages</base-name></resource-bundle></application>
</faces-config>

由于使用的是Maven,因此我将在项目结构中配置一个文件夹来保存报告的.jrxml文件,并配置POM以对该文件夹运行JasperReports编译器。 我选择的文件夹名称是src / main / jasperreports , JasperReports Maven插件的POM配置如下:

<plugin><groupId>org.codehaus.mojo</groupId><artifactId>jasperreports-maven-plugin</artifactId><version>1.0-beta-2</version><executions><execution><goals><goal>compile-reports</goal></goals></execution></executions><configuration><outputDirectory>target/jasperreports/jasper</outputDirectory></configuration><dependencies><dependency><groupId>net.sf.jasperreports</groupId><artifactId>jasperreports</artifactId><version>4.5.1</version></dependency></dependencies>
</plugin>

我还将在Maven WAR插件中添加一些额外的配置,以便它可以收集JasperReports编译器生成的所有.jasper文件并将它们打包在应用程序WAR文件中:

<plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-war-plugin</artifactId><version>2.2</version><configuration><webResources><resource><directory>src/main/jasperreports</directory><includes><include>**/*.jrxml</include></includes><targetPath>resources/reports/sources</targetPath></resource><resource><directory>target/jasperreports/jasper</directory><includes><include>**/*.jasper</include></includes><targetPath>resources/reports/jasper</targetPath></resource></webResources></configuration>
</plugin>

您可能会注意到,我将JasperReports的.jrxml文件打包在Web应用程序档案中。 当使用插件时,我们可以将其作为报告模板资源进行引用,插件引擎足够智能,可以识别所引用文件的类型,而当使用对报告源文件的引用时,插件将即时编译报告。 但是,首选方法应该始终是使用.jasper文件,因为它比其他文件具有更好的性能。  

设计报告模板

如本系列简介中所述,我将使用的JasperReports视觉设计工具是iReport,那里有很多关于如何使用iReport的教程,因此我将跳过这一部分。 但是,由于我要设计一个可识别语言环境的报告,因此必须注意JasperReports网站上提供的I18n Sample 。

因此,我们启动iReport并选择一个空白报告模板。 由于我们的报告将使用基于SQL的数据源,因此可视设计器完成加载后,我们必须配置SQL语句以从数据库中获取数据。 为此,我们必须在设计器视图中单击缩放选项左侧的按钮,然后选择“报告查询”标签:
jasperreports-jsf-plugin-use-cases-simple-list-report1
我将用来获取数据的SQL查询是我们可以做的最简单的查询。 输入该SQL语句后,iReport将在窗口下部显示所有可用字段。 如果它可以加载所有字段而没有任何错误,则单击“确定”按钮以保存它们以进行报告:

select * from book;

我最终报告中将输出的所有文本都将来自资源包或数据库本身。 因此,正如JasperReports i18n示例所指出的,无论何时要输出一些文本,都应使用文本字段。 报表设计视图将如下图所示:

jasperreports-jsf-plugin-use-cases-simple-list-report2
报告模板文件的XML视图将类似于以下内容:

<?xml version="1.0" encoding="UTF-8"?>
<jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd"name="booklist" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20"topMargin="20" bottomMargin="20"><property name="ireport.zoom" value="1.5"/><property name="ireport.x" value="0"/><property name="ireport.y" value="0"/><queryString><![CDATA[select * from book]]></queryString><field name="BOOK_ID" class="java.lang.Integer"/><field name="TITLE" class="java.lang.String"/><field name="AUTHOR" class="java.lang.String"/><field name="PUBLISHED_YEAR" class="java.lang.String"/><field name="GENRE" class="java.lang.String"/><field name="PRICE" class="java.math.BigDecimal"/><background><band splitType="Stretch"/></background><title><band height="38" splitType="Stretch"><textField><reportElement x="0" y="0" width="227" height="29"/><textElement><font size="18" isBold="true"/></textElement><textFieldExpression><![CDATA[$R{bookList.pageTitle}]]></textFieldExpression></textField></band></title><columnHeader><band height="27" splitType="Stretch"><textField><reportElement x="0" y="0" width="100" height="20"/><textElement><font isBold="true"/></textElement><textFieldExpression><![CDATA[$R{bookList.id}]]></textFieldExpression></textField><textField><reportElement x="113" y="2" width="155" height="20"/><textElement><font isBold="true"/></textElement><textFieldExpression><![CDATA[$R{bookList.title}]]></textFieldExpression></textField><textField><reportElement x="285" y="2" width="100" height="20"/><textElement><font isBold="true"/></textElement><textFieldExpression><![CDATA[$R{bookList.author}]]></textFieldExpression></textField><textField><reportElement x="398" y="2" width="100" height="20"/><textElement><font isBold="true"/></textElement><textFieldExpression><![CDATA[$R{bookList.year}]]></textFieldExpression></textField></band></columnHeader><detail><band height="21" splitType="Stretch"><textField><reportElement x="0" y="0" width="100" height="20"/><textElement/><textFieldExpression class="java.lang.Integer"><![CDATA[$F{BOOK_ID}]]></textFieldExpression></textField><textField><reportElement x="113" y="0" width="155" height="20"/><textElement/><textFieldExpression><![CDATA[$F{TITLE}]]></textFieldExpression></textField><textField><reportElement x="285" y="0" width="100" height="20"/><textElement/><textFieldExpression><![CDATA[$F{AUTHOR}]]></textFieldExpression></textField><textField><reportElement x="398" y="0" width="112" height="20"/><textElement/><textFieldExpression><![CDATA[$F{PUBLISHED_YEAR}]]></textFieldExpression></textField></band></detail><columnFooter><band height="45" splitType="Stretch"/></columnFooter><pageFooter><band height="25" splitType="Stretch"><textField><reportElement x="227" y="0" width="100" height="20"/><textElement textAlignment="Center"/><textFieldExpression class="java.lang.Integer"><![CDATA[$V{PAGE_NUMBER}]]></textFieldExpression></textField></band></pageFooter><summary><band height="42" splitType="Stretch"/></summary>
</jasperReport>

将此文件保存在先前创建的src / main / jasperreports文件夹中,您可以开始下一节了。

设计JSF视图

我们的JSF View将基于Facelets ,因此它将被编写为XHTML文件,在其中我们需要声明将要使用的不同库名称空间。 有关如何设置Facelets的说明,请直接转到其文档 (JSF 2.x应用程序无需额外配置即可直接支持Facelets)。

以下代码片段显示了Facelets模板的内容,我将使用它们来呈现图书清单的用户界面。 复制它并将其保存在Web应用程序内容文件中的文件中。 我将使用的文件名为/book/bookList.xhtml

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"xmlns:f="http://java.sun.com/jsf/core"xmlns:h="http://java.sun.com/jsf/html"xmlns:jr="http://jasperreportjsf.sf.net/tld/jasperreports-jsf-1_3.tld">
<head><title>Book List - JasperReports JSF Use Cases</title>
</head>
<body>
<h1><h:outputText value="#{Messages['bookList.pageTitle']}"/></h1><div><h:form id="bookListForm"><jr:source id="bookSource" type="jndi" value="java:comp/env/jdbc/BookStoreDB"/><h:panelGrid columns="3"><h:outputLabel for="reportFormat" value="#{Messages['report.format.select']}" /><h:selectOneMenu id="reportFormat" value="#{bookList.reportFormat}"onchange="document.bookListForm.submit();"><f:selectItems value="#{bookList.reportFormats}" /></h:selectOneMenu><jr:reportLink id="reportLink" format="#{bookList.reportFormat}"target="blank" source="bookSource"value="/resources/reports/jasper/booklist.jasper"resourceBundle="#{Messages}"><h:outputText value="#{Messages['bookList.action.show']}"/></jr:reportLink></h:panelGrid><h:dataTable value="#{bookList.allBooks}" var="book"><h:column><f:facet name="header"><h:outputText value="#{Messages['bookList.title']}"/></f:facet><h:outputText value="#{book.title}"/></h:column><h:column><f:facet name="header"><h:outputText value="#{Messages['bookList.author']}"/></f:facet><h:outputText value="#{book.author}"/></h:column><h:column><f:facet name="header"><h:outputText value="#{Messages['bookList.year']}"/></f:facet><h:outputText value="#{book.publishedYear}"/></h:column><h:column><f:facet name="header"><h:outputText value="#{Messages['bookList.genre']}"/></f:facet><h:outputText value="#{book.genre}"/></h:column></h:dataTable></h:form>
</div>
</body>
</html>

突出显示的行是我们添加JasperReports JSF插件组件的位置:

  • 首先,在第14行,我们通过<jr:source>标记定义了一个报告源组件。 该组件不会将任何数据输出到呈现HTML,但是可以由库的可视组件引用,以告诉他们如何获取呈现报表内容所需的数据。
  • 从第21行到第26行,我们通过<jr:reportLink>标记定义一个报告链接组件。 该组件将输出一个标准 HTML元素,该元素指向由插件引擎生成的特殊URL。 当单击它时,插件的引擎将拦截该URL并替换一些JSF生命周期阶段来处理报告数据并生成结果。 注意,报表组件具有一个属性resourceBundle,它指向我们在第一部分中创建的消息包。

注意resourceBundle属性已在JasperReports JSF插件的主干版本(在编写此行时)中可用,该版本使用标记库的1.3版本。 对于仍在使用1.2版标记库的用户,他们可以获得类似的结果,将参数添加到报表链接中:

<jr:reportLink id="reportLink" format="#{bookList.reportFormat}"target="blank" source="bookSource"value="/resources/reports/jasper/booklist.jasper"><f:param name="RESOURCE_BUNDLE" value="#{Messages}" /><h:outputText value="#{Messages['bookList.action.show']}"/>
</jr:reportLink>

除了突出显示的行外,我还添加了代码以呈现一个组合框,其中包含JasperReports JSF插件支持的所有导出选项以及一个数据表,该数据表将为表簿布置不同的记录。

注意 :组合框包含一个onchange属性,该属性旨在使用报表导出选项的新值提交表单。 我必须这样做,才能使报告链接在版本2.x之前的JSF中正常工作,因为该版本不提供任何AJAX支持。

上面显示的JSF视图需要一个托管Bean才能工作,该托管Bean将向用户界面提供值:

public class BookListView {private BookManager bookManager;private List allBooks;private String reportFormat = &quot;pdf&quot;;public void setBookManager(BookManager bookManager) {this.bookManager = bookManager;}public List getAllBooks() {if (allBooks == null) {allBooks = bookManager.getAllBooks();}return allBooks;}public String getReportFormat() {return reportFormat;}public void setReportFormat(String reportFormat) {this.reportFormat = reportFormat;}public List getReportFormats() {FacesContext context = FacesContext.getCurrentInstance();JRFacesContext jrContext = JRFacesContext.getInstance(context);List list = new ArrayList();for (String format : jrContext.getAvailableExportFormats()) {list.add(new SelectItem(format, format));}return list;}}

bookManager字段是对接口的引用,该接口将提供从数据库中获取所有书籍的逻辑:

public interface BookManager {public List getAllBooks();
}

如本系列的介绍文章中所述,我将不介绍实现用例所需的其他类或接口的细节,因为由每个特定用户来决定哪种框架将提供应用程序的框架。  

一起测试

现在该检查所有功能是否正常运行了。 因此,让我们打包我们的Web应用程序,将其部署到我们的Tomcat服务器上,然后在您喜欢的浏览器中输入以下URL: http:// localhost:8080 / jrjsf-usecases / book / bookList.jsf

注意 :在执行部署操作之前,Derby(数据库)和Tomcat(应用程序服务器)必须正在运行。

因此,这是我们的浏览器输出前面提到的URL的内容时的外观:

jasperreports-jsf-plugin-use-cases-simple-list-report3
现在,单击“显示报告”链接以查看报告的输出,其中填充了我们资源包中的字符串和数据库中的数据:

jasperreports-jsf-plugin-use-cases-simple-list-report4
这是从报告的PDF视图中截取的示例屏幕截图。 使用用户界面中的组合框可以更改报告导出格式。

结论

因此,完成所有操作,这是向JavaServer Faces应用程序添加报告的最简单方法。 我从一个简单的示例开始,我将不时为其添加更复杂的功能。 希望您喜欢这篇文章并回来以后的出版物,好东西还没有出现!

参考: JasperReports JSF插件用例–来自Code Nibbles博客的JCG合作伙伴 Alonso Dominguez的简单列表报告 。


翻译自: https://www.javacodegeeks.com/2012/07/jasperreports-jsf-plugin-use-cases-2.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/372179.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ER图流程图

ER图&#xff1a;ER图分为实体、属性、关系三个核心部分。实体是长方形体现&#xff0c;而属性则是椭圆形&#xff0c;关系为菱形。 图书馆管理系统流程图&#xff08;图片源于网上&#xff09;&#xff1a;对于程序员来说&#xff0c;我们要知道&#xff1a;整个系统中&#x…

php源码仿三一重工,织梦仿三一重工业大学气企业网站php源码

★模板引荐★源码称呼&#xff1a;仿三一重工业大学气企业网站php源码仿三一重工业大学气企业网站php源码&#xff0c;尝试完备无错&#xff0c;兼容合流欣赏器。模板包括安置证明&#xff0c;并包括尝试数据。本模板鉴于DEDECms 5.7 GBK安排&#xff0c;须要 UTF-8版本的请本人…

php树莓派魔镜,用树莓派和显示器制作一面“魔镜”

所需要的材料一台显示器一块和显示器大小相同的双面镜一些2*4米的细木条树莓派机器必要组件(电源、HDMI线、usb无线网卡、键盘)木工工具(锯子、磨砂机、螺丝刀)螺丝、液态钉子选一个合适的显示器镜子的大小完全由显示器的类型和大小决定&#xff0c;所以我希望得到一个尽量大的…

【数字图像处理】[3]--直方图规范化

【数字图像处理】[3]--直方图规范化直方图规范化出现的原因是因为直方图均衡只能产生出固定的图像&#xff0c;不满足于需求&#xff0c;有时我们需要让直方图变成特定的直方图&#xff0c;于是有了直方图规范化原理&#xff1a;可能只看公式没什么感觉&#xff0c;我们来举一个…

JavaFX 2.0布局窗格– GridPane

毫无疑问&#xff0c; GridPane是JavaFX 2.0中功能最强大&#xff0c;最灵活的布局窗格。 它在由行和列组成的灵活网格中布置其子项&#xff0c;与Swing的GridBagLayout或HTML的表格模型非常相似。 这种方法使该窗格非常适合于任何形式的表单&#xff08;例如网站上的联系表单&…

java ui自动化测试脚本,如何用Airtest编写UI自动化脚本(示例代码)

前言游戏并不像app一样直接把渲染树节点暴露出来&#xff0c;这就造成游戏UI自动化在元素定位上的不方便性&#xff0c;不过依赖airtest的图片识别&#xff0c;我们可以直接跳过元素检查&#xff0c;以图片对比的形式进行自动化&#xff0c;虽然效率可能会低一些&#xff0c;但…

django实现瀑布流、组合搜索、阶梯评论、验证码

django实现图片瀑布流布局 我们在一些图片网站上经常会看到&#xff0c;满屏都是图片&#xff0c;而且图片都大小不一&#xff0c;却可以按空间排列。默认一个div是占用一行&#xff0c;当想把div里的图片并排显示的时候&#xff0c;只能使用float属性&#xff0c;但是&#xf…

带有docx4j的Java Word(.docx)文档

几个月前&#xff0c;我需要创建一个包含许多表和段落的动态Word文档。 过去&#xff0c;我曾使用POI来实现此目的&#xff0c;但是我发现它很难使用&#xff0c;并且在创建更复杂的文档时对我来说效果不佳。 因此&#xff0c;对于这个项目&#xff0c;经过一番搜索&#xff0c…

mysql中distinct关键字,MySQL关键字Distinct的详细介绍

DDLPrepare SQL&#xff1a;?Prepare Data&#xff1a;?查询数据如下图所示&#xff1a;第一种情况&#xff0c;使用Distinct关键字&#xff0c;查询单列数据&#xff0c;如下图所示&#xff1a;结果&#xff1a;对 name 字段进行去重处理&#xff0c;符合预期期望&#xff0…

(二)windows下安装PHPCMS V9

一、准备工作 搭建环境 &#xff1a;参考:Windows下搭建PHP开发环境及相关注意事项PHPCMS V9 &#xff1a;下载适合自己 PHPCMS V9 版本到本地或服务器&#xff0c;下载地址&#xff1a;http://www.phpcms.cn/html/download/说明&#xff1a;官方提供了 2 种不同的编码。包括 G…

JavaFX 2.0布局窗格– HBox和VBox

如果要对JavaFX 2.0中所有不同的布局窗格进行概述&#xff0c;或者想了解有关它们的一些基本知识&#xff0c;请参阅我以前的文章《 JavaFX 2.0中的布局窗格》 。 布局窗格HBox和VBox绝对是JavaFX 2.0中最基本的布局容器。 如您所知&#xff0c;它们的用途是将所有子级布置在一…

单片机串行通信全解析

1.什么是串行通信&#xff1f; 串行通信&#xff08;英语&#xff1a;Serial communication&#xff09;是指在计算机总线或其他数据通道上&#xff0c;每次传输一个位元数据&#xff0c;并连续进行以上单次过程的通信方式。与之对应的是并行通信&#xff0c;它在串行端口上通过…

java type 类型,java中的泛型类型与Type接口

假设我们定义了一个Room的类&#xff0c;表示一个房间public classRoom(){}由于我们建造好房间是&#xff0c;不知道房间以后的用途&#xff0c;他可能用来住人&#xff0c;也有可能用来放货物&#xff0c;因此需要用到泛型。但是我们可能想获取Room这个房间里面进来的的东西的…

vray学习笔记(3)-多维子材质是个什么东西

多维子材质是个什么东西&#xff1f;为什么出现这个概念&#xff1f; 在3dsmax官方网站&#xff0c;我们可以看到它的定义&#xff1a; The Multi/Sub-Object material lets you assign different materials at the sub-object level of your geometry. 意思是多维子材质这个概…

Hello JavaFX 2.0:命令行介绍

我从博客文章Hello JavaFX 2.0&#xff1a;NetBeans 7.1 beta的介绍中&#xff0c;从NetBeans 7.1 beta的角度看了一个无处不在的Hello World示例的简单JavaFX版本。 在本文中&#xff0c;我将介绍仅使用命令行工具通过JavaFX实现的Hello World版本。 JavaFX 2.0 API文档包括ja…

oracle列分区,Oracle数据库分区--实例

分区表通过对分区列进行判断&#xff0c;把满足不同条件的分区列对应的记录保存在不同的分区中。一、何为分区表什么情况下会使用分区表&#xff1f;表中已有大量数据&#xff0c;或预计到表中将会保存大量的数据可以按照预期(月份、区域、dml)对表中的数据执行查询和更新什么是…

ZK实际应用:MVVM –与ZK客户端API一起使用

在之前的文章中&#xff0c;我们使用ZK的MVVM实现了以下功能&#xff1a; 将数据加载到表中 使用表单绑定保存数据 删除条目并以编程方式更新视图 ZK MVVM和ZK MVC实现方式之间的主要区别是&#xff0c;我们不直接在controller&#xff08;ViewModel&#xff09;类中访问和操…

终极JPA查询和技巧列表–第1部分

我们可以在Internet上找到一些JPA“如何做”&#xff0c;在本博客的此处&#xff0c;教您如何使用JPA执行多项任务。 通常&#xff0c;我看到有人问有关使用JPA进行查询的问题。 通常&#xff0c;为了回答此类问题&#xff0c;提供了几个链接&#xff0c;以尝试找到该问题的解决…

Spring集成–第2节–更多世界

这是Spring Integration Session 1的后续活动 第一部分是使用Spring Integration的简单Hello World应用程序。 我想通过考虑其他一些方案来进一步介绍它。 因此&#xff0c;对Hello World应用程序的第一个更改是添加网关组件。 要快速重新访问较早的测试程序&#xff0c;请执行…

oracle 会话实例,返璞归真:Oracle实例级别和会话级别的参数设置辨析

杨廷琨(yangtingkun)云和恩墨 CTO高级咨询顾问&#xff0c;Oracle ACE 总监&#xff0c;ITPUB Oracle 数据库管理版版主参数文件是Oracle数据库文件中级别最低&#xff0c;也是最基本的文件&#xff0c;但是也是数据库实例启动第一个涉及的文件。如果参数文件缺失或者某些参数设…