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.pswp.cn/news/372179.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/372179.shtml
英文地址,請注明出處:http://en.pswp.cn/news/372179.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

2016.10.17先占坑

2016.10.17先占坑轉載于:https://www.cnblogs.com/amurzet/p/5978986.html

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版本的請本人…

接觸Jenkins(Hudson)API,第2部分

這篇文章從本教程的第1部分繼續。 已經快一年了&#xff0c;但是我終于有時間重新審視我為與Jenkins api交互而編寫的一些代碼。 我已經使用了部分工作來幫助管理許多Jenkins構建服務器&#xff0c;主要是保持插件同步以及將作業從一臺機器移動到另一臺機器。 在本文中&#xf…

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;例如網站上的聯系表單&…

leecode 題解 || Merge k Sorted Lists 問題

problem&#xff1a; Merge k sorted linked lists and return it as one sorted list.Analyze and describe its complexity.Tags Divide and Conquer Linked List Heap合并K個已序單鏈表 thinking&#xff1a; &#xff08;1&#xff09;題目沒有要求不能夠新開ListNode,所以…

PHP在瀏覽器中被拒絕請求,php控制請求頁面瀏覽器緩

緩存的主要作用是防止用戶頻繁刷新網站頁面&#xff0c;導致服務器數據庫負擔&#xff0c;既要保證信息更新的及時性&#xff0c;也要保證緩存能被充分利用。http協議里控制瀏覽器緩存的頭有三個Cache-Control&#xff0c;Expires&#xff0c;Last-Modified&#xff0c;在PHP下…

js -03課 -03 js中的真假判斷

真假的問題&#xff1a;數據類型-數字&#xff08;NaN&#xff09;、字符串、布爾、函數、對象&#xff08;elem、[]、{}、null&#xff09;、未定義真&#xff1a;非0的數字、非空字符串、true、函數、能找到的元素、[]、{}假&#xff1a;0、NaN、空字符串、false、不能找到的…

HBASE啟動失敗,Failed construction of Master: class org.apache.hadoop.hbase.master.HMaster

Master日志錯誤&#xff1a;2015-12-02 06:34:32,394 ERROR [main] master.HMasterCommandLine: Master exitingjava.lang.RuntimeException: Failed construction of Master: class org.apache.hadoop.hbase.master.HMasterat org.apache.hadoop.hbase.master.HMaster.constru…

Java線程:我應該創建幾個

介紹 “我應該創建多少個線程&#xff1f;”。 許多年前&#xff0c;我的一個朋友問我這個問題&#xff0c;然后我按照“ CPU核心數 1”的指示給了他答案。 當您在這里閱讀時&#xff0c;大多數人都在點頭。 不幸的是&#xff0c;我們所有人當時都錯了。 現在&#xff0c;如果您…

java ui自動化測試腳本,如何用Airtest編寫UI自動化腳本(示例代碼)

前言游戲并不像app一樣直接把渲染樹節點暴露出來&#xff0c;這就造成游戲UI自動化在元素定位上的不方便性&#xff0c;不過依賴airtest的圖片識別&#xff0c;我們可以直接跳過元素檢查&#xff0c;以圖片對比的形式進行自動化&#xff0c;雖然效率可能會低一些&#xff0c;但…

Spring JDBC數據庫連接池設置

對于任何Java應用程序而言&#xff0c; 在Spring框架中設置JDBC數據庫連接池都是很容易的&#xff0c;僅需更改spring配置文件中的一些配置即可。使用Apache Commons DBCP和Commons Pool以及Spring框架的連接池是不錯的選擇&#xff0c;但是如果您擁有Web服務器和托管的J2EE容器…

BZOJ 3505 [Cqoi2014]數三角形(組合數學)

【題目鏈接】 http://www.lydsy.com/JudgeOnline/problem.php?id3505 【題目大意】 給定一個nxm的網格&#xff0c;請計算三點都在格點上的三角形共有多少個。   注意三角形的三點不能共線。 【題解】 我們計算三個點組合的情況&#xff0c;去除橫豎三共線&#xff0c;以及斜…

matlab多項式加法運算,matlab多項式運算與代數方程求解解析.ppt

* 多項式運算與代數方程求解 數學軟件 Matlab Matlab基礎及應用 * 多項式轉化為符號表達式&#xff1a;poly2sym 四則運算&#xff1a;conv、deconv 導數與積分&#xff1a;ployder、polyint 求值與零點&#xff1a;polyval、polyvalm、roots、poly 多項式運算 主要內容 代數方…

java.lang.NoClassDefFoundError:如何解決–第3部分

本文是我們的NoClassDefFoundError故障排除系列的第3部分。 正如我在第一篇文章中提到的那樣&#xff0c;有許多可能導致NoClassDefFoundError的問題。 本文將重點介紹該問題的最常見原因之一&#xff1a;Java類靜態初始化程序塊或變量的失敗。 將提供一個示例Java程序&#xf…

django實現瀑布流、組合搜索、階梯評論、驗證碼

django實現圖片瀑布流布局 我們在一些圖片網站上經常會看到&#xff0c;滿屏都是圖片&#xff0c;而且圖片都大小不一&#xff0c;卻可以按空間排列。默認一個div是占用一行&#xff0c;當想把div里的圖片并排顯示的時候&#xff0c;只能使用float屬性&#xff0c;但是&#xf…

通過ifrmae異步下載文檔

//通過ifrmae異步下載文檔 function iframeGetFile(opts) {var defaultOpts {filePath: ,onload: function (e) { }}, iframeFile;$.extend(defaultOpts, opts);iframeFile document.createElement("iframe");iframeFile.onload function (e) {defaultOpts.onload…

IO與NIO –中斷,超時和緩沖區

假設有一個系統有時需要將文件復制到幾個位置&#xff0c;但是這種方式在響應速度至關重要的情況下。 換句話說&#xff0c;如果由于某種原因文件系統過載&#xff0c;并且我們無法在不到一秒鐘的時間內寫入文件&#xff0c;則應該放棄。 ExecutorService是一項非常方便的工作工…