Thứ Bảy, 25 tháng 4, 2009

Java: Spring beginning (Review Project Part 2)

Bắt đầu với Spring
Spring là một java framework nguồn mở dùng ở tầng "bussiness layer" trong kiến trúc sau:

Nhiệm vụ của nó là tạo chỉ mục đến một "bean" trong tổng thể các "beans" đã định nghĩa trước đó. Để hiểu rõ ràng hơn thì bạn hãy tìm đọc các sách hoặc ebook về Spring, Spring in Action, ... Ở ví dụ step by step dưới đây chỉ phần nào thể hiện công cụng cơ bản của Spring.
Với IDE MyEclipse:
- Hãy tạo một project trống rỗng với tên DemoSpring
- Ở cửa sổ Package Explorer, right click vào "DemoString" -> MyEclipse -> Add Spring Capabilities, chọn Finish ở cửa sổ "Add Spring Capabilities"
Sau khi Finish, kết quả ở cửa sổ Package Explorer sẽ có thêm file applicationContext.xml (file này là file định nghĩa các bean) và Spring 2.5 reference library:
- Tới đây, ta tạm ngưng các hoạt động với Spring để định nghĩa các đối tượng, hành động ví dụ. Tạo các lớp như sau :
và codes:
------- DemoSpring.java --------------
import java.util.Scanner;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.ClassPathResource;


/**
* @author Hung.Trinh
*/
public class DemoSpring {

private static String CONFIG_FILE_LOCATION = "applicationContext.xml";
private static volatile BeanFactory beanFactory = null;

/**
* Copyright by tqhung at Apr 24, 2009 - 3:09:09 PM
* @param args
*/
public static void main(String[] args) {
System.out.println("Hello to Demo Using Spring with MyEclipse.");
Scanner sn = new Scanner(System.in);
String beanname = "";
getBeanFactory();
do {
try {
beanname = sn.next();
if (beanname.compareToIgnoreCase("exit") == 0) {
break;
}
IActionClass aclass = (IActionClass) beanFactory.getBean(beanname);
System.out.println(aclass.showMessage());
} catch (BeansException be) {
System.out.println("No bean found.");
} catch (Exception e) {
System.out.println(e.getMessage());
}
} while (true);

System.out.println("completed");
}

public static BeanFactory getBeanFactory() {
if (beanFactory == null) {
final ClassPathResource resource = new ClassPathResource(CONFIG_FILE_LOCATION);
beanFactory = new XmlBeanFactory(resource);
}
return beanFactory;
}
}
------- IActionClass.java --------------
/**
* @author Hung.Trinh
*/
public interface IActionClass {
String showMessage();
}
------- ActionClass1.java --------------
/**
* @author Hung.Trinh
*/
public class ActionClass1 implements IActionClass{

public String showMessage(){
return "In action 1 of class" + ActionClass1.class.toString();
}
}
------- ActionClass2.java --------------
/**
* @author Hung.Trinh
*/
public class ActionClass2 implements IActionClass{
public String showMessage(){
return "In action 2 of class" + ActionClass2.class.toString();
}
}
- Công đoạn kế tiếp là ta định nghĩa các bean cho Spring. Mở file applicationContext.xml:
-------- applicationContext.xml - Default ----------
[?xml version="1.0" encoding="UTF-8"?]
[beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"]

[/beans]
Có 2 cách định nghĩa bean: định nghĩa bằng dòng lệnh và định nghĩa bằng giao diện. Định nghĩa bằng dòng lệnh theo cấu sẽ đơn giản hơn với người lập trình chuyên sâu. Ở đây coi như ta chưa biết gì, ta dùng giao diện vậy :D. Mở cửa sổ Spring Explorer (Window -> Show View -> Other.. -> Spring Explorer), right click lên "bean" chọn "New Bean"
Và định nghĩa "action1", "action2" tương ứng với 2 lớp ActionClass1 và ActionClass2 mới vừa được tạo:
Nên nhớ là sau mỗi lần tạo bean bạn đều phải thực hiện save file applicationContext.xml. Kết quả sau 2 lần tạo bean, nội dung file applicationContext.xml sẽ là:
--------- applicationContext.xml - Configured ----------
[?xml version="1.0" encoding="UTF-8"?]
[ơbeans
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"]
[bean name="action1" class="ActionClass1" abstract="false"
lazy-init="default" autowire="default" dependency-check="default"]
[/bean]
[bean name="action2" class="ActionClass2" abstract="false"
lazy-init="default" autowire="default" dependency-check="default"]
[/bean]
[/beans]
nhưng thực tế cần thì ít hơn:
[?xml version="1.0" encoding="UTF-8"?]
[beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"]
[bean name="action1" class="ActionClass1" /]
[bean name="action2" class="ActionClass2" /]
[/beans]
save lại 1 lần nữa cho chắc ăn :D,
Tới đây bạn có thể test kết quả vừa làm. Run DemoSpring java application, ở console, nhập chuỗi "action1" -> enter, "action2" -> enter sẽ thấy kết quả:
input : action1 --> output: In action 1 of classclass ActionClass1
input : action2 --> output: In action 2 of classclass ActionClass2
input : exit --> output: completed
Chúc thành công.

Thứ Tư, 1 tháng 4, 2009

Java : Mapping DB tour with Middlegen and Hibernate (Review Project Part 1)

Hôm nay, nhận được một yêu cầu trời giáng choáng váng cả tiếng. Tui phải tìm hỉu mã nguồn một cái dự án Java tổng hợp bao gồm Hibernate, Spring, Strut, Mina 2.0, + linh tinh những thứ mà tui lờ mờ như tờ giấy trắng ngoại trừ ngôn ngữ Java basic.
Để bắt đầu, tui chọn sử dụng MyEclipse để đỡ mắc công cài các plugin lằng nhằng cho mấy cái framework khủng, trong khi thứ tui iu thích nhẹ nhàng lại là Eclipse đã từng cắn xé Javacard.
Quả thật là sau khi cài đặt MyEclipse vào, tui nhận thấy hầu như các framework mình cần cho thực tế đều có sẵn (thiệt đỡ quá). Đối với dự án tui tìm hỉu chỉ cần thêm một cái MySQL connector và vài cục jar log4net, .. là xong, he he

Khởi động ME (MyEclipse), theo thói quen tui tạo luôn một project rỗng trơn không gì cả, xài lại một cái ant builder.xml có sẵn đâu đó và sửa lại mỗi properties name.

Bắt đầu với Hibernate và Middelgen:
- Đọc lòng vòng thì tui biết, Hibernate chỉ đơn thuần là để "mapping" với một database ở đâu đó. Lợi ích của dùng Hibernate là để đơn giản hóa và chuẩn hóa thao tác với cơ sở dữ liệu, biết nhiêu đó là đủ rùi.
- Tuy nhiên, để có thể hoàn thành việc "mapping" này thì cần phải có các thứ linh tinh khác như sau:
+ hibernate mapping files: các file cấu hình định nghĩa các bảng trong database. Thường mỗi bảng ta lại định nghĩa một file dạng ".hbm.xml"
+ hibernate configuration file: một file cấu hình để định vị đối tượng database bao gồm : connection string, database connection provider, username, password ...
+ Implementation files: các file hoặc gọi là các lớp thể hiện của các bảng trong database.
Chài ai, tìm hiểu đến đây, tui nghĩ hỏng lẽ mình thay cái thao tác Connection rồi query xưa cũ lòng thòng bằng một đống file ngồi gõ chít bỏ. Tính sơ sơ ra mỗi table có thao thác là phải tạo ra 1 file mapping và 1 file đối tượng, Hibernate thiệt là khùng hết sức !! T_T !! Nhưng việc làm thủ công đó là trước đây, các anh các chị trước đây đã chịu khổ và sản sinh ra công cụ Middlegen...
- Middlegen được ứng dụng để truy vấn đến database và xuất ra các table mapping file
một cách tự động và chuẩn xác. Đồng thời Middlegen cũng tự động phát sinh java code các lớp đối tượng table tương ứng, nhưng tui được khuyến cáo là không nên dùng những lớp code này. Tìm hiểu tới đây là đủ nhức mắt ngứa tay rồi, thôi quay lại cái bàn phím thôi.
- Để sử dụng Middlegen, ta tạo một middlegen build file (xml) bằng cách right click vào Project -> New -> Other -> Middlegen -> Middlegen Build File. Click next đến của sổ "Configure Database and Table", ở đây phải cung cấp các thông số bắt buộc để xác định database như: xác đinh gói JDBC, Database URI, Username, Password như hình dưới:
sau đó click "Finish" cửa sổ Middlegen Generator sẽ mở thể hiện mối quan hệ các bảng trong cơ sở dữ liệu, click "Generate" và sau đó đóng cửa sổ. Kiểm tra lại thư mục "src" của project sẽ thấy package các file Middlegen vừa xuất
tới đây tui được các đàn anh mách bảo là xóa hết các class object đi, chỉ để lại các mapping file và right click -> Hibernate Synchronizer -> Synchronize Files, kết quả là được 4 package như sau:
tạm thời tui chỉ hiểu 4 package này chứa các lớp đối tượng thể hiện chính xác các bảng dữ liệu và mối quan hệ bảng ở database. Tới đây, dường như nhiệm vụ của Hibernate và Middlegen đã hoàn thành.

Sau đó còn sử dụng tiếp String, Mina 2.0, ... hồi sau sẽ rõ !!!