本系列將介紹構建前面提到的Web應用程序所需的步驟。 我將嘗試使文章盡可能整潔,獨立且完整,但是我會故意省略一些與此處沒有公開的主要技術沒有特別關系的部分。 這樣,每篇文章都將直截了當,并且不再那么冗長,從而使人們更容易理解主要演員及其角色。
在深入介紹JasperReports JSF插件的不同場景的材料之前,我們需要設置Web應用程序項目,這將是進一步使用案例的起點。 本系列中用于該項目的主要工具如下:
- JasperReports 4.5.1:報告引擎。
- iReport 4.5.1:可視報表設計器
- Java Server Faces 1.2和Facelets 1.1.1:我的應用程序的Web框架(請注意,可以輕松地將其遷移到JSF 2.x中)。
- JasperReports JSF插件 1.0:報告引擎和Web框架之間的集成橋梁。
- Apache Derby 10.8.2.2:將保存我們所需信息的數據庫。
- Apache Tomcat 6.0.35:將用于部署和測試應用程序的應用程序服務器。
每個特定報告要顯示的數據將來自一個簡單的數據庫,其中包含一些表,這些表將保存我們所需的信息。 我將用來復合域模型的主要實體基本上是: 帳簿 , 客戶 , 訂單和訂單行 。
內容
- 1項目設置
- 2配置iReport
- 3域模型
- 4。結論
項目設置
我將采用的方法是創建一個新的基于Web的項目,該項目將使用該數據庫模型。 我將使用Maven來配置和管理將要使用的依賴項,因為我已經習慣了它,這將避免我獨立獲取所有jar文件并在我的代碼庫中手動配置它們。 其他任何人都可以使用他/她喜歡的工具( Ant , Gradle ,基于IDE等)。
使用Maven做到這一點的一個很好的例子是Maven Book中的“ simple-webapp”原型樣本。 我將在此處發布使用該原型生成項目結構時使用的命令行語句:
mvn archetype:create -DgroupId=net.sf.jasperreports.jsf.sample
-DartifactId=jrjsf-usecases
-Dpackage=net.sf.jasperreports.jsf.sample.usecases
-Dversion=1.0-SNAPSHOT
-DarchetypeArtifactId=maven-archetype-webapp
-DarchetypeGroupId=org.apache.maven.archetypes
-DarchetypeVersion=1.0
這將在名為jrjsf-usecases且具有以下初始值的文件夾中生成一個Maven項目:
- groupId : net.sf.jasperreports.jsf.sample
- artifactId : jrjsf用例
- 版本 : 1.0-快照
- 包 : net.sf.jasperreports.jsf.sample.usecases
現在,需要對pom.xml文件進行一些修改,以保存我們項目所需的依賴項。 我要做的主要更改將包括添加對Java 1.5(及更高版本)的支持以及對本文開頭列出的項目的依賴關系。
為了能夠使用Java 5發行后添加到Java的泛型和其他高級功能,我們需要配置maven-compiler-plugin,以便Java編譯器可以識別出我們希望支持這些功能:
<project>...<build><plugins><plugin><artifactId>maven-compiler-plugin</artifactId><groupId>org.apache.maven.plugins</groupId><configuration><source>1.5</source><target>1.5</target></configuration></plugin></plugins></build>
</project>
現在,讓我們添加實現應用程序所需的依賴項:
<project>...<dependencies><dependency><groupId>javax.servlet</groupId><artifactId>servlet-api</artifactId><version>2.4</version><scope>provided</scope></dependency><dependency><groupId>javax.servlet.jsp</groupId><artifactId>jsp-api</artifactId><version>2.0</version><scope>provided</scope></dependency><dependency><groupId>javax.el</groupId><artifactId>el-api</artifactId><version>1.0</version></dependency><dependency><groupId>javax.faces</groupId><artifactId>jsf-api</artifactId><version>1.2_14</version></dependency><dependency><groupId>javax.faces</groupId><artifactId>jsf-impl</artifactId><version>1.2_14</version></dependency><dependency><groupId>com.sun.facelets</groupId><artifactId>jsf-facelets</artifactId><version>1.1.1</version></dependency><dependency><groupId>net.sf.jasperreports</groupId><artifactId>jasperreports</artifactId><version>4.5.1</version></dependency><dependency><groupId>net.sf.jasperreports.jsf</groupId><artifactId>jasperreports-jsf</artifactId><version>1.0</version></dependency><dependency><groupId>org.apache.derby</groupId><artifactId>derbyclient</artifactId><version>10.8.2.2</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.8.1</version><scope>test</scope></dependency></dependencies>
</project>
在此項目中,我們將使用可通過JNDI訪問的容器管理數據源。 這種配置取決于我們使用的應用程序服務器的類型。 由于我將Tomcat用作應用程序服務器,因此我需要在文件夾src / main / webapp / META-INF下的項目中添加一個context.xml文件,以告訴它如何訪問該數據庫以及資源的類型。我想要:
<Context path='/jrjsf-usecases' reloadable='true'><Resource name='jdbc/BookStoreDB' auth='Container' type='javax.sql.DataSource'maxActive='100' maxIdle='30' maxWait='10000'username='app' password='' driverClassName='org.apache.derby.jdbc.ClientDriver'url='jdbc:derby://localhost:1527/bookstoredb;create=true'/></Context>
配置iReport
我們需要配置iReport,使其能夠連接到我們的數據庫,因此讓我們啟動iReport設計工具并對其進行配置,以使其可以進行設計工作。 iReport的不帶至Apache Derby數據庫的支持外的開箱 ,我們需要將庫添加到其類路徑和手工配置Derby JDBC驅動程序。 本練習將教我們如何配置工具以支持其他任何數據庫。
首先,從Apache Derby數據庫的網站下載該數據庫,然后將其安裝(解壓縮zip文件)到本地計算機中您選擇的文件夾中(如果尚未執行的話)。 然后打開iReport的首選項/選項窗口,然后選擇類路徑選項卡:

我將把Derby的lib文件夾添加到iReport類路徑中。 為此,請單擊“添加文件夾”按鈕并瀏覽文件系統,直到獲得Apache Derby安裝中的lib文件夾:

完成后,單擊“首選項”窗口中的“確定”按鈕,現在iReport中應該可以使用Apache Derby客戶端類。 現在,我們準備在iReport中配置Apache Derby數據源,該數據源將由我們的報告使用。 要添加新的數據源,我們可以從iReport歡迎頁面開始,然后單擊“ 步驟1 :創建數據庫連接...”按鈕,或者單擊工具欄上的“報告數據源”按鈕,然后單擊“添加”。按鈕。 無論哪種方式,我們都將到達如下所示的窗口:

需要在iReport中手動配置Apache Derby數據源,因此在上一個窗口的列表中選擇“數據庫JDBC連接”,單擊“下一個>”,然后在下一個窗口中填寫JDBC驅動程序的值:

字段的值如下:
- 名稱 : BookStoreDB
- JDBC驅動程序 : org.apache.derby.jdbc.ClientDriver
- JDBC URL : jdbc:derby:// localhost:1527 / bookstoredb
- 用戶名 : app
- 密碼 : <空>
現在,在繼續之前,請確保您的Apache Derby實例正在運行以允許與其建立連接,然后單擊“測試”按鈕以檢查一切是否正常。
領域模型
假設我們已經配置了項目并準備開始工作(我們有一個基本的項目文件夾結構,所有基本依賴項都在我們的類路徑中,并且iReport能夠連接到我們的數據庫),所以讓我們從碼。 我在這方面的第一步將是創建一個SQL文件( bookstore.create.sql ),以初始化我在本系列的Introduction部分中討論的域模型。 復制此段下面的文本并將其粘貼到項目文件夾結構內的文件中,以便以后使用:
create table book (book_id int generated by default as identity primary key,title varchar(50) not null,author varchar(50) not null,published_year varchar(4) not null,genre varchar(20) not null,price numeric not null
);create table customer (customer_id int generated by default as identity primary key,name varchar(250) not null
);create table purchase_order (order_id int generated by default as identity primary key,customer_id int not null,created_date date not null,constraint customer_fk foreign key (customer_id) references customer(customer_id)
);create table purchase_order_line (order_line_id int generated by default as identity primary key,order_id int not null,book_id int not null,item_count int not null,constraint order_fk foreign key (order_id) references purchase_order(order_id),constraint book_fk foreign key (book_id) references book(book_id)
);
這只是我的域模型的后端部分,在我的應用程序中,我還需要將那些實體表示為Java類。 因此,要使此域模型完整,下一步就是編寫Java類,該類需要表示Java應用程序中先前定義的域模型。 現在該看一下以前的模型了,我們有4個不同的實體,因此我們將需要在Java應用程序中使用4個不同的類來遵守該模型:
書
public class Book {private Long id;private String title;private String author;private String publishedYear;private String genre;private double price;public String getAuthor() {return author;}public void setAuthor(String author) {this.author = author;}public String getGenre() {return genre;}public void setGenre(String genre) {this.genre = genre;}public Long getId() {return id;}public void setId(Long id) {this.id = id;}public double getPrice() {return price;}public void setPrice(double price) {this.price = price;}public String getPublishedYear() {return publishedYear;}public void setPublishedYear(String publishedYear) {this.publishedYear = publishedYear;}public String getTitle() {return title;}public void setTitle(String title) {this.title = title;}}
顧客
public class Customer {private Long id;private String name;public Long getId() {return id;}public void setId(Long id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}}
訂購
public class Order {private Long id;private Customer customer;private Date createdDate;private List lines = new ArrayList();public Date getCreatedDate() {return createdDate;}public void setCreatedDate(Date createdDate) {this.createdDate = createdDate;}public Customer getCustomer() {return customer;}public void setCustomer(Customer customer) {this.customer = customer;}public Long getId() {return id;}public void setId(Long id) {this.id = id;}public List getLines() {return lines;}public void setLines(List lines) {this.lines = lines;}}
訂單行
public class OrderLine {private Long id;private Order order;private Book book;private int itemCount;public Book getBook() {return book;}public void setBook(Book book) {this.book = book;}public Long getId() {return id;}public void setId(Long id) {this.id = id;}public int getItemCount() {return itemCount;}public void setItemCount(int itemCount) {this.itemCount = itemCount;}public Order getOrder() {return order;}public void setOrder(Order order) {this.order = order;}}
現在,使用您選擇的工具連接到數據庫,并執行bookstoredb.create.sql文件創建表結構。
結論
我試圖使代碼盡可能簡單和干凈。 上一節中列出的Java類可以使用ORM工具(例如Hibernate , iBATIS , Ebean等)映射到我們的關系數據庫。我將對象關系映射層的選擇留給讀者,因為有很多選擇,但是沒有一個選擇將影響我們將報告與Web框架集成的方式。
我們的Web應用程序應包含其他類,以將其體系結構構成為DAO和業務外觀以及視圖控制器。 但是,出于與我沒有添加任何可能有助于將模型類鏈接到數據庫表的ORM信息相同的原因,在本文中添加所有它們完全超出了范圍。 如今有很多IoC容器( Spring框架 , Weld , Seam等),本系列中真正重要的是演示JasperReports JSF插件的用法。 (視圖控制器將在其特定的文章中列出,因為它們是每個特定用例的一部分)。
這就是我們開始在這個精巧工具的不同示例中所做的全部。 在接下來的幾周內,新文章將在JasperReports JSF插件類別下發布,并提供詳細的示例來演示如何實現最常見的用例。 希望您喜歡它們,歡迎任何評論。
參考:來自Code Nibbles博客的JCG合作伙伴 Alonso Dominguez的JasperReports JSF插件用例系列 。
翻譯自: https://www.javacodegeeks.com/2012/06/jasperreports-jsf-plugin-use-cases.html