5.3.2.Kiến trúc của richfaces Biểu đồ : luồng xử lý yêu cầu.
Giải thích luồng :
Phía Client : Trang JSF xảy ra sự kiện. Sự kiện được đưa vào ajax engine. Thông qua ajax engine xử lý sự kiện và gửi yêu cầu từ phía Client lên Server.
Phía Server : XML Filter nhận request và lọc, phân loại yêu cầu rồi gửi sang ajaxViewRoot
5.3.3.Ưu điểm của Richfaces
a. Tạo nhanh được một khung nhìn view phức tạp, thư viện Richfaces UI bao gồm các thành phần để thêm vào các đặc tả giao diện người sử dụng vào các ứng dụng JSF
b. Các thành phần richfaces được thiết kế một cách đồng nhất với thư viện các thành phần 3d trong cùng một trang, nhờ đó bạn có nhiều lựa chọn hơn để phát triển ứng dụng
c. Tạo ra một giao diện thân thiện với công nghệ skin bên trong. Richfaces cung cấp các đặc tả giao diện cho phép dễ dàng định nghĩa lại và quản lý các màu khác nhau và các tham số khác của giao diện với sự giúp đỡ của các tham số skin đã được đặt tên. Ở đây, có thể truy cập vào các tham số của giao diện từ mã JSF và mã JAVA
5.3.4.Cài đặt Richfaces
a. Bước 1 : Download thư viện richfaces tại trang:
http://www.eclipse.org/downloads / . Ở đây ta sử dụng thư viện richfaces phiên bản 3.3.3 gồm 4 file : richfaces-api-3.3.3.Final.jar, richfaces-impl-3.3.3.Final.jar, richfaces-impl-jsf2-3.3.3.Final.jar, richfaces-ui-3.3.3.Final.jar.
b. Bước 2 : copy 4 file vào thư viện của project thông thường có đường dẫn sau (với người sử dụng công cụ MyEclipse) : …Workspaces\MyEclipse
8.x\Tên_Project\WebRoot\WEB-INF\lib
c. Bước 3 : Đăng ký thư viện richfaces trong trang web.xml <context-param> <param-name>org.richfaces.SKIN</param-name> <param-value>blueSky</param-value> </context-param> <context-param> <param-name>org.richfaces.CONTROL_SKINNING</param-name> <param-value>enable</param-value> </context-param> <filter> <display-name>RichFaces Filter</display-name> <filter-name>richfaces</filter-name> <filter-class>org.ajax4jsf.Filter</filter-class> </filter> <filter-mapping> <filter-name>richfaces</filter-name> <servlet-name>Faces Servlet</servlet-name> <dispatcher>REQUEST</dispatcher> <dispatcher>FORWARD</dispatcher> <dispatcher>INCLUDE</dispatcher> </filter-mapping>
d. Bước 4 : Vậy là chúng ta đã có thư viện richfaces bản 3.3.3. Khi sử dụng trong file web, các bạn chú ý phải có khai báo khi sử dụng richfaces như sau:
<%@ taglib uri="http://richfaces.org/rich" prefix="rich"%>
Lời gọi khi sử dụng : <rich:{tên tag} [{thuộc tính}={giá trị}]/>
Hoặc : <rich:{tên tag} [{thuộc tính}={giá trị}]> [Nội dung văn bản HTML] </rich:{tên tag}>
e. Bước 5 : tham khảo hai link sau để sử dụng richfaces:
i. http://livedemo.exadel.com/richfaces-
demo/richfaces/colorPicker.jsf?c=colorPicker&tab=usage – demo giao diện của richfaces, có mã nguồn mở và hệ thống skin cho richfaces
ii. http://docs.jboss.org/richfaces/latest_3_3_X/en/devguide/html_sin gle/#RichFacesComponentsLibrary – các thành phần của
5.4. Hibernate
5.4.1.Tổng quan về Hibernate
Hibernate 3.0, một công nghệ mới nhất trong nền tảng cốt lỗi của J2EE EJB 3.0. Hibernate là một framework cho persistence layer, là một dịch vụ lưu trữ và truy vấn dữ liệu quan hệ mạnh mẽ và nhanh chóng. Hibernate giúp người phát triển các class dùng để lưu trữ dữ liệu theo cách thức hướng đối tượng: association, inheritance, polymorphism, composition và collections. Hibernate cho phép thực hiện các câu truy vấn dữ liệu bằng cách sử dụng ngôn ngữ SQL mở rộng của Hibernate (HQL) hoặc là ngôn ngữ SQL nguyên thuỷ cũng như là sử dụng các API.
Không giống như các persistence layer khác, Hibernate không ẩn đi sức mạnh của ngôn ngữ SQL thuần túy mà Hibernate còn đảm bảo cho người phát triển đầu tư vào công nghệ và tri thức cơ sở dữ liệu quan hệ là luôn luôn chính xác. Và điều quan trọng hơn nữa là Hibernate được license theo LGPL (Lesser GNU Public License). Theo đó, bạn có thể thoải mái sử dụng Hibernate trong các dự án open source hoặc các dự án thương mại (commercial).
Các tính năng của Hibernate:
* Hibernate 3.0 cung cấp ba đầy đủ tính năng tiện truy vấn: Hibernate Query Language, HibernateCriteria Query API và các truy vấn tự nhiên.
* Bộ lọc để làm việc với dữ liệu tạm thời ,vùng dữ liệu hoặc các dữ liệu được phân quyền
* Nâng cao khả năng truy vấn với API: với sự hỗ trợ đầy đủ cho các phép chiếu ,phép kết hợp và phép chọn.
* Kiểm soát được thời gian chạy: thông qua JMX hoặc Java API, bao gồm cả bộ đệm trình duyệt ở mức thứ cấp.
* Hỗ trợ IDE Eclipse, bao gồm một bộ Eclipse plug-in để làm việc với Hibernate 3.0, bao gồm biên tập liên kết, tương tác với mẫu truy vấn, công cụ nhận lại cấu trúc cơ sở dữ liệu.
* Hibernate là miễn phí theo LGPL: Hibernate có thể được dùng để phát triển phân phối các ứng dụng miễn phí.
* Hibernate có thể mở rộng: Hibernate mang lại hiệu năng cao và kiến trúc 2 lớp của nó có thể được sử dụng trong môi trường tập trung.
* Giảm thời gian phát triển ứng dụng: Hibernate làm giảm thời gian phát triển các ứng dụng vì nó hỗ trợ thừa kế, đa hình, thành phần và các framework trong java.
* Hibernate XML cho phép liên kết dữ liệu được biểu diễn như XML và POJOs thay thế cho nhau.
5.4.2.Kiến Trúc Hibernate
Sơ đồ trên cho thấy rằng Hibernate là sử dụng cơ sở dữ liệu và file cấu hình để cung cấp các dịch vụ lâu dài cho ứng dụng.
Để sử dụng Hibernate, sự cần thiết phải tạo ra các lớp Java biểu diễn cho bảng tương ứng trong cơ sở dữ liệu và sau đó ánh xạ các thuộc tính của lớp với các cột của bảng trong cơ sở dữ liệu. Sau đó, Hibernate có thể được sử dụng để thực hiện các thao tác trên cơ sở dữ liệu như chèn, chọn, cập nhật và xóa các bản ghi trong bảng. Hibernate tự động tạo ra các truy vấn để thực hiện các thao tác này.
Kiến trúc Hibernate có ba thành phần chính: * Quản lý kết nối
Hibernate cung cấp dịch vụ quản lý kết nối cơ sở dữ liệu hiệu quả. Kết nối cơ sở dữ liệu là phần tốn kém tài nguyên và hiệu năng nhất trong việc tương tác với cơ sở dữ liệu vì nó đòi hỏi nhiều tài nguyên phải mở và đóng kết nối cơ sở dữ liệu.
* Quản lý giao dịch:
Quản lý dịch vụ giao dịch cung cấp khả năng người sử dụng để thực hiện nhiều hơn một câu lệnh tại một thời điểm.
*Đối tượng bản đồ quan hệ:
Đối tượng bản đồ quan hệ là kỹ thuật lập ánh xạ biểu diễn dữ liệu từ một mô hình đối tượng cho đến một mô hình dữ liệu quan hệ. Đối tượng này được sử dụng đê thực hiện các thao tác như truy vấn ,thêm mới, cập nhật và xóa các bản ghi dạng bảng bên dưới.Hibernate là rất tốt công cụ như xa như là đối tượng bản đồ quan hệ là mối quan tâm, nhưng về mặt quản lý kết nối và quản lý giao dịch, đó là thiếu hiệu năng và khả năng. Vì vậy, thường Hibernate được sử dụng để quản lý kết nối khác và các công cụ quản lý giao dịch. Ví dụ apache DBCP được sử dụng để kết nối tổng hợp với Hibernate.
Hibernate cung cấp rất nhiều tính linh hoạt trong sử dụng. Nó được gọi là kiến trúc "Lite" khi chúng ta chỉ sử dụng các thành phần đối tượng bản đồ quan hệ. Trong khi kiến trúc "Full Cream" tất cả trong ba thành phần đối tượng quan hệ lập bản đồ, quản lý kết nối và Quản lý giao dịch được sử dụng.
5.4.3.Thành phần của ứng dụng Hibernate
Các ORM framework mang đến cho các developer những tư duy trong khái niệm về quan hệ trong khi vẫn làm việc với các lớp. Có nhiều framework mang mục đích này. Những gì làm cho Hibernate khác với những framework khác chính là tính đơn giản và khả chuyển của nó. Để tạo nên ứng dụng Hibernate, có ba điều cần phải có, đó là:
a) Persistence Class:
Persistence class là một Plain Old Java Object hay POJO model. Một POJO là tương tự như một JavaBean, có những getter và setter để truy câp các thuộc tính của nó là những instance variable (biến thực thể). Persistence class có những đặc điểm dưới đây:
Nó là thay thế hướng đối tượng cho bảng ở cơ sở dữ liệu
Các thuộc tính của bảng trở thành những instance variable của persistence class.
Đối tượng của persistence class thay hế cho hàng của bảng.
b) Mapping file:
Mapping file là một file XML chứa ánh xạ chi tiết giữa persistence class và bảng nó thay thế. Các thành phần bắt buộc của file XML này là:
1. Hibernate-mapping: Đây là thành phần gốc bao tất cả các thành phần khác 2. Class: được sử dụng để ánh xạ tên bản thành persistence class. Tên thuộc tính được sử dụng để xác định tên lớp, và thuộc tính bản được sử dụng để xác định bảng mà lớp thay thế. Ví dụ để ánh xạ một bản mang tên ORDERS thành một persistence class với tên đầy đủ là com.someorg.persist.Order sẽ như dưới đây:
<class name=”com.someorg.persist.Order” table=”ORDERS”>…</class>
3. ID: Thành phần này sử dụng để ánh xạ khóa chíh của table thành một instance variable của class. Thành phần cột con của id có thể sử dụng để ánh xạ thành biến tương ứng. Giá trị của khóa chính có thể tự động tạo ra được công bố ở đây. Thành phần
generator có thể được sử dụng để nói cho Hibernate một lớp sẽ được sử dụng ở đâu để tự động tạo id, hoặc id được gán bởi ứng dụng.
<id name="id" type="string" unsaved-value="null">
<column name="id" sql-type="char(32)" not-null="true"/> <generator class="assigned"/>
</id>
Ví dụ trên nói cho Hibernate rằng, tên của khóa chính là id mà nó đã được ánh xạ thành instance variable "id". Kiểu dữ liệu của nó là "string" được ánh xạ cho cột "id" có kiểu "char(32)" thay thế bởi thuộc tính sql-type. Thuộc ính lớp của generator chứa giá trị "assigned" nghĩa là ứng dụng bản thân nó sẽ cung cấp giá trị cho khóa chính.
4. Property: thành phần này, thuộc về các cột thành phần con của nó, ánh xạ những thuộc tính khác (hoặc các côt thành những instance variable của persistence class. Thuộc tính name của property chứa tên của biến như một giá trị. Thuộc tính name của thành phần column chứa tên của cột mà instance variable được ánh xạ. Các thuộc tính length và sql- type trỏ đến độ dài và kiểu dữ liệu của cột
<property name="name">
</property>
c) Hibernate Configuration file:
File này có thể được gọi trỏ đến ứng dụng sử dụng Hibernate. Nguyên nhân là nó chứa cấu hình điều khiển giao tiếp với database ở phía dưới. Ở đây, tất cả các file mapping được sử dụn bởi ứng dụng được công bố. Địnn dạng thành phần của hibernate-
configuration là thành phần gốc. Hầu hết các thành phần thông dụng sử dụng trong file XML là:
1. Property: Thuộc tính name của thành phần property có thể được sử dụng để cấu hình những tham số khác nhau. Trong công nghệ Hibernate, những tham số này được biết như là những tham số property. Kiểu database server (MySQL, Oracle...), dialect class, URL của database, username/password... là những tham số property khác nhau. Để đặt chúng vào trong mã:
<session-factory>
<!-- Database connection settings -->
<property name="connection.driver_class">org.hsqldb.jdbcDriver</property> <property name="connection.url">jdbc:hsqldb:data/tutorial</property> <property name="connection.username">sa</property> : : </session-factory>
2. Mapping: Nó là thành phần kết nối tất cả các file mapping,, cũng gọi là các file hbm, được sử dụng bởi ứng dụng đã công bố. Thuộc tính resource được cho giá trị của đường dẫn file hbm.
<mapping resource="Event.hbm.xml"/>
5.4.4. Ví dụ minh họa
* Ví dụ xét một bảng Orders Cấu trúc như sau : CREATE TABLE ORDERS(
ID VARCHAR NOT NULL PRIMARY KEY, ORDER_DATE TIMESTAMP NOT NULL, PRICE_TOTAL DOUBLE NOT NULL);
* Bước kế tiếp là tạo ra persistence class (cũng chính là một JavaBean) package com.someorg.persist;
import java.util.HashSet; import java.util.Set; public class Order { private String id; private Date date;
private double priceTotal;
// Automatically set the creation time of // this Order
public Order() {
this.date = new Date(); }
public String getId() { return id;
}
public void setId(String string) { id = string;
}
// other getters/setters not shown for // brevity
// ... } }
* Bước tiếp theo tạo file hbm. Tên của file là Order.hbm.xml <?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-mapping default-cascade="none" default-access="property" auto- import="true">
<class name="com.someorg.persist.Order" table="orders" mutable="true" select- before-update="false" optimistic-lock="version">
<id name="id" type="string" unsaved-value="null">
<column name="id" sql-type="char(32)" not-null="true" /> <generator class="assigned" />
</id>
<property name="date" not-null="false" >
<column name="order_date" sql-type="datetime" not-null="true" /> </property>
<property name="priceTotal" not-null="false" >
<column name="price_total" sql-type="double" not-null="true" /> </property>
</class>
* Tất cả các instance variable được ánh xạ sử dụng thành phần property. Đây là file cấu hình
<?xml version='1.0' encoding='utf-8'?> <!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration>
<session-factory>
<!-- Database connection settings -->
<property name="connection.driver_class"> oracle.jdbc.driver.OracleDriver </property> <property name="connection.url">jdbc:oracle:thin:@localhost: 1521:orcl </property> <property name="connection.username">scott</property> <property name="connection.password">tiger</property> <!-- JDBC connection pool (use the built-in) --> <property name="connection.pool_size">1</property> <!-- SQL dialect -->
<property name="dialect"> org.hibernate.dialect.OracleDialect </property>
<!-- Echo all executed SQL to stdout --> <property name="show_sql">true</property>
<mapping resource=" com/someorg/persist/Event.hbm.xml"/> </session-factory> </hibernate-configuration> * Test Ứng dụng : package test; import java.util.List; import org.hibernate.Hibernate; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; import com.someorg.persist.Order; // use as
// java test. FindOrderById name public class FindOrderById {
public static void main(String[] args) throws Exception { // query to issue
String query = "select order from Order " + "where order.id=:id"; // search for what?
String name = args[0];
// init
Configuration cfg = new Configuration().addClass(Order.class); SessionFactory sf = cfg.buildSessionFactory();
// open session
Session sess = sf.openSession(); // search and return
List list = sess.find(query, id, Hibernate.STRING); if (list.size() == 0) {
System.out.println("No Order having id " + id); System.exit(0);
}
Order o = (Order) list.get(0); sess.close();
System.out.println("Found Order: " + p); }
5.5. Jasper report
a. Khái niệm:
Jasper report là framework cho phép thiết kế, dịch và xuất báo cáo dưới nhiều định dạng khác nhau như PDF, Excel, HTML, Java Applet Viewer, plain text. Jasper report là công nghệ mã nguồn mở được phát triển bởi Jaspersoft.
b. Thiết kế báo cáo:
Để thiết kế báo cáo, ta sử dụng công cụ iReport:
Một báo cáo bao gồm có 7 phần chính như trong hình trên:
- Title: phần tiêu đề của báo cáo, nó xuất hiện một lần duy nhất tại phần đầu của trang đầu báo cáo.
- Page Header: phần tiêu đề của từng trang báo cáo, nó xuất hiện tại phần đầu của mỗi trang báo cáo.
- Colunm Header: phần tiêu đề của các cột dữ liệu.
- Detail: phần lặp lại của báo cáo. Nó dùng để hiển thị dữ liệu của báo cáo.
- Colunm Footer: phần kết thúc của các cột dữ liệu. Nó thường dùng để hiển thị giá trị đếm số lượng, tổng hoặc tính trung bình của các giá trị của cột tương ứng. - Page Footer: phần kết thúc của các trang. Nó thường được dùng để tổng kết, thông
kê các giá trị trong từng trang hoặc đánh số trang.
- Summary: phần hiển thị tổng kết, thông kê của cả báo cáo. Nó xuất hiện một lần duy nhất tại cuối báo cáo.
Trong iReport cho phép định nghĩa datasource dùng làm nguồn cho báo cáo. Mặc định, từ datasource, iReport sẽ trích xuất ra được các cột dữ liệu (FIELD) phục vụ cho việc hiển thị trong phần Detail và các thống kê trong phần Page Footer, Summary. Ngoài ra, jasper report cho phép người dùng định nghĩa ra các tham số (PARAMETER) để có thể truyền vào trong lúc dịch báo cáo; định nghĩa các biến (VARIABLE) cho phép tính toán giá trị từ các parameter, các field lấy từ datasource.
Để thiết kế báo cáo, ta sử dụng các đối tượng được hỗ trợ sẵn trong panel Palette. Các đối tượng quan trọng:
- Static text: Cho phép hiển thị nội dung một chuỗi xác định trước lên báo cáo.
- Text Field: Cho phép hiển thị nội dung của các FIELD, PARAMETER, VARIABLE thông qua cú pháp $F{TEN_FIELD}, $P{TEN_PARAMETER},
$V{TEN_VARIABLE}
- Line: cho phép hiển thị đường kẻ trên báo cáo. Lưu ý: một line không được. - Image: cho phép hiển thị ảnh trên báo cáo