Saturday, June 5, 2010

Thiết yếu lập trình java cho J2EE

Lời nói đầu: bài viết này nằm trong loạt 5 bài viết hướng dẫn các kỹ thuật nền tảng để xây dựng 1 ứng dụng J2EE hoàn chỉnh. Các bài viết này dành riêng cho khóa "J2EE nền tảng" của Java Developer Training Center (JDTC). Sau đây là danh sách toàn bộ bài viết:
- Cốt lõi Java trong phần mềm quản lý J2EE
- Kết nối thế giới hướng đối tượng và quan hệ
- Giao diện người - máy thế hệ mới
- Máy ảo javascript với jquery
- MVC framework nào, đó là câu hỏi cần trả lời


Java là một ngôn ngữ lớn, đầy thách thức nhưng cũng đầy khả năng. Một trong những điểm mạnh của Java chính là cộng đồng rộng lớn với hàng chục ngàn framework khác nhau được xây dựng để hỗ trợ thực hiện các chức năng khác nhau. Có nhiều người dự đoán Java sẽ chết và Ruby sẽ thay thế. Thực sự, Java chỉ có thể chết khi cả cộng đồng to lớn đó chết. Điều này hoàn toàn không dễ xảy ra ít nhất trong thời gian 10 năm tới. Bởi vì, Java luôn thay đổi, luôn thích ứng. EJB cồng kềnh đã được thay thế bằng EJB 3.0. Đặc biệt với Spring, thế giới J2EE đã trở nên hợp nhất và mạnh mẽ hơn bao giờ hết. Nếu thế gian mất 16 năm để Java có thể tiến hóa như hiện tại thì sẽ phải mất từng đó năm để có thể một cái gì đó khác thay thế cho Java.

Java được sử dụng nhiều nhất trong các ứng quản lý trên nền web. Đó là sân chơi mà Java chiếm ưu thế. Và đó cũng là chủ đề của bài viết này.

1. Hướng đối tượng trong Java
- Java gắn liền với hướng đối tượng. Có nhiều đánh giá cho rằng Java là ngôn ngữ hướng đối tượng trong sáng nhất. Nhưng hướng đối tượng của Java trong các ứng dụng quản lý khác nhiều so với quan niệm phổ biến là "đối tượng bao gồm các thuộc tính và hành vi". Trong các ứng dụng quản lý, các lớp đối tượng được tách riêng hoàn toàn thuộc tính và hành vi.

Ví dụ 1:
- Mô tả yêu cầu:
Xây dựng mô hình class để quản lý sinh viên. Mỗi sinh viên có các thuộc tính cơ bản: mã số, họ tên, ngày sinh, địa chỉ, giới tính. Mỗi khoa có thuộc tính: mã khoa, tên khoa. Mỗi sinh viên sẽ thuộc về một khoa, mỗi khoa sẽ có nhiều sinh viên. Ứng dụng cho phép CRUD (Create Read Update Delete) các sinh viên và khoa.

- Phân tích và thiết kế:
Theo quan niệm truyền thống lớp (class) bao gồm thuộc tính và hành vi vậy lớp Sinh viên có thể được thiết kế như sau:

public class Student
{
private String id;
private String name;
private Date birthDate;
private String address;
private boolean gender;

//hàm get set cho các thuộc tính của sinh viên

//các method CRUD

public void addStudent(Student student);
public void updateStudent(Student student);
public void deleteStudent(Student student);

}

Tuy nhiên trên thực tế không ai làm như vậy mà phải tách ra thành 2 lớp riêng biệt:
public class Student
{
private String id;
private String name;
private Date birthDate;
private String address;
private boolean gender;

//hàm get set cho các thuộc tính của sinh viên
}

public class StudentManager
{
//các method CRUD

public void addStudent(Student student);
public void updateStudent(Student student);
public void deleteStudent(Student student);

}

2. Trừu tượng hóa bằng interface:
Java có vô số thứ nổi tiếng, design pattern là một trong số đó. Design pattern nghe có vẻ "cao siêu" thực ra cũng rất đơn giản. Làm riết thành quen, design pattern không phải là lý thuyết mà thực chất là kinh nghiệm. Design pattern có hơn 250 mẫu, không ai nhớ được hết 250 mẫu, khoảng mười mấy cái được dùng chủ yếu nhất. Trong J2EE, ít nhất trong Spring, có 2 cái dùng thường xuyên đó là Factory Method và MVC. MVC ai cũng hiểu. Factory method thực chất cũng dễ hiểu.

Áp dụng Factory method cho ví dụ ở trên, ta được:

interface StudentManager
{
public void addStudent(Student student);
public void updateStudent(Student student);
public void deleteStudent(Student student);
}

Có nhiều cách để hiện thực các methods ở trên. Nếu ta dùng Hibernate, ta sẽ được:
public class HibernateStudentManager implements StudentManager
{
public void addStudent(Student student)
{
session.save(student);
}
}

còn nếu hiện thực bằng jdbc:

public class JDBCStudentManager implements StudentManager
{
public void addStudent(Student student)
{
con.execute("insert into student(id, name) values(student.getId, student.getName) ");
}
}

Như vậy, đối tượng trong J2EE tách rời hoàn toàn thuộc tính và phương thức.

3. Đảo ngược điều khiển (Inversion of Control):
Đảo ngược điều khiển là 1 khái niệm rất nổi tiếng trong Spring. Nói nghe có vẻ phức tạp nhưng trên thực tế rất đơn giản. Đảo ngược điều khiển trao quyền tạo đối tượng cho bean factory và được cấu hình trên file beans.xml thay vì lập trình viên phải viết code.

Trong ví dụ ở trên, khi muốn tạo 1 đối tượng studentManager, người dùng chỉ việc khai báo:

private StudentManager studentManager:

Sau đó get hoặc set cho property này. Việc quyết định StudentManager là HibernateStudentManager hoặc là JDBCStudentManager hoàn toàn được khai báo trong file beans.xml.

4. Sức mạnh của hướng đối tượng
Những điểm mạnh của hướng đối tượng thường được nhắc tới bao gồm: trừu tượng hóa, tính đa hình. Tuy vậy, có một điểm mạnh của hướng đối tượng thường được bỏ quên đó là: hướng đối tượng cho phép mô hình thế giới thực một cách đầy đủ nhất. Thật vậy, trong ví dụ ở trên, nếu sinh viên có thêm thuộc tính Khoa, lớp sinh viên sẽ được mô hình chính xác như sau:

public class Student
{
....
private Department department:
}
với Department là một lớp khai báo như sau:

public class Department
{
private String code;
private String name:
}

Khi trình bày 1 danh sách sinh viên, nếu muốn lấy tên khoa ta chỉ cần thao tác như sau: student.getDepartment().getName()


Bài tập
1. Phân tích và thiết kế class cho hệ thống có yêu cầu như sau:
Hệ thống quản lý 1 danh sách nhân viên. Thông tin của nhân viên gồm có: mã số, họ tên, ngày sinh, giới tính, địa chỉ. Mỗi nhân viên thuộc về 1 phòng ban. Thông tin của phòng ban gồm có: mã phòng, tên phòng. Một phòng ban có nhiều nhân viên.
- Viết 1 interface gồm các phương thức để quản lý danh sách nhân viên với các thao tác CRUD (Tạo mới, Đọc, Cập nhật, và Xóa)
- Hiện thực interface trên bằng 2 cách: 1) dùng kiểu array chứa danh sách nhân viên 2) dùng jdbc để thao tác với cơ sở dữ liệu;

2. Phân tích và thiết kế class cho hệ thống như sau:
Hệ thống quản lý kho dược quản lý danh mục các loại thuốc. Thông tin thuốc gồm có: tên thương mại (brand name), tên thuốc gốc (generic name), qui cách đóng gói, đơn vị tính nhỏ nhất (viên, gói, hộp, chai, lọ).
- Viết 1 interface gồm các phương thức để quản lý danh mục thuốc với các thao tác CRUD (Tạo mới, Đọc, Cập nhật, và Xóa)
- Hiện thực interface trên bằng 2 cách: 1) dùng kiểu array chứa danh sách nhân viên 2) dùng jdbc để thao tác với cơ sở dữ liệu;

3. Phân tích và thiết kế class cho hệ thống như sau:
Hệ thống quản lý xuất nhập tồn kho dược. Hệ thống quản lý danh sách các loại thuốc: tên thuốc, đơn giá. Hằng ngày, nhân viên sẽ lập các phiếu nhập để nhập thuốc vào kho. Thông tin phiếu nhập gồm: số phiếu, ngày nhập, tên nhân viên nhập, tổng tiền trước thuế, % thuế, tiền thuế, và tổng cộng. Mỗi phiếu nhập sẽ bao gồm nhiều chi tiết. Mỗi chi tiết là 1 loại thuốc, số lượng nhập, và đơn giá.
- Viết 1 interface gồm các phương thức để quản lý danh mục phiếu nhập với các thao tác CRUD (Tạo mới, Đọc, Cập nhật, và Xóa)
- Hiện thực interface trên bằng 2 cách: 1) dùng kiểu array chứa danh sách nhân viên 2) dùng jdbc để thao tác với cơ sở dữ liệu;

Download ví dụ mẫu:
http://www.mediafire.com/file/rnonmzjnwyj/struts-example.rar


No comments:

Post a Comment