Đề cương: Các Ví Dụ Nâng Cao Công Nghệ Phần Mềm

Bởi: Khoa CNTT ĐHSP KT Hưng Yên

Đề cương: Các Ví Dụ Nâng Cao Công Nghệ Phần Mềm

Bởi: Khoa CNTT ĐHSP KT Hưng Yên

Phiên bản trực tuyến: < http://voer.edu.vn/content/col10330/1.1/ >

Hoc lieu Mo Vietnam - Vietnam Open Educational Resources Tài liệu này và sự biên tập nội dung có bản quyền thuộc về Khoa CNTT ĐHSP KT Hưng Yên. Tài liệu này tuân thủ giấy phép Creative Commons Attribution 3.0 (http://creativecommons.org/licenses/by/3.0/). Tài liệu được hiệu đính bởi: August 19, 2010 Ngày tạo PDF: August 20, 2010 Để biết thông tin về đóng góp cho các module có trong tài liệu này, xem tr. 124. Nội dung

Lời mở đầu ...... 1 1 Bài 1: Lập trình hướng thành phần (HTP) 1.1 Giới thiệu và Định nghĩa ...... 3 1.2 Hợp lệ hoá dữ liệu. Ngôn ngữ vấn tin cơ sở dữ liệu. Kết nối cơ sở dữ liệu sử dụng công nghệ ADO...... 4 2 Bài 2: Lập trình đa tầng 2.1 Giới thiệu ...... 39 2.2 Kiến trúc đa tầng ...... 39 2.3 Phát triển ứng dụng đa tầng ...... 41 3 Bài 3: Lập trình mạng 3.1 Lập trình mạng ...... 47 4 Bài 4: Kiến trúc hướng dịch vụ (webservice) 4.1 Kiến trúc hướng dịch vụ (webservice) ...... 59 5 Bài 5: Thiết kế mẫu (Design Pattern) 5.1 Thiết kế mẫu (Design Pattern) ...... 79 6 Bài 6: Công nghệ Hibernate 6.1 Công nghệ Hibernate ...... 95 7 Bài 7: Công nghệ Ajax 7.1 Công nghệ Ajax ...... 101 8 Bài 8: Mã nguồn mở 8.1 Mã nguồn mở ...... 113 9 Tài liệu tham khảo ...... 123 Attributions ...... 124 iv Lời mở đầu1

Công nghệ thông tin đang phát triển mạnh mẽ, để phát triển được những dụng trong thực tế thì việc sử dụng một số phương pháp và công nghệ phát triển phần mềm tiên là điều không thể thiếu đối với người phát triển. Module giới thiệu cho người học một số chủ đề nâng cao của Công nghệ phần mềm: Giới thiệu một số phương pháp phát triển phần mềm tiến, áp dụng cho những bài toán có qui mô lớn như phát triển phần mềm theo mô hình Client-Server; Component-Based; web-service, design pattern ...; Giới thiệu một số công nghệ phát triển phần mềm mà tại thời điểm tương ứng đang được áp dụng trong các công ty phần mềm, như: Công nghệ Hibernate, Ajax, ...; Trên cơ sở đó giao các chủ đề cụ thể cho từng sinh viên/ nhóm sinh viên tìm hiểu và cài đặt ứng dụng, sau đó trình bày trước lớp nhắm hiện thực hóa những phương pháp và công nghệ tiên tiến phát triển phần mềm.

1This content is available online at .

1 2 Chương 1

Bài 1: Lập trình hướng thành phần (HTP)

1.1 Giới thiệu và Định nghĩa1 1.1.1 Giới thiệu Lập trình hướng thành phần (HTP)- component-oriented programming Xuất phát từ lập trình hướng đối tượng, tư duy lập trình hướng thành phần (component-oriented pro- gramming) theo ý tưởng:

• Giải quyết bài toán bằng cách xây dựng một tập các thành phần (component) có tính độc lập tương đối với nhau. Mỗi thành phần đảm nhiệm một phần công việc nhất định. • Sau đó, người ta ghép các thành phần với nhau để thu được một phần mềm thoả mãn một tập các yêu cầu xác định

Với lập trình hướng thành phần, người ta có thể tiến hành lập trình theo phương pháp sau:

• Xây dựng một thư viện các thành phần, mỗi thành phần thực hiện một công việc xác định. • Khi cần phát triển một phần mềm cụ thể, người ta chỉ cần chọn những thành phần có sẵn trong thư viện để ghép lại với nhau. Người lập trình chỉ phải phát triển thêm các thành phần mình cần mà chưa có trong thư viện.

Phương pháp này có những ưu điểm rất lớn:

• Lập trình viên có thể chia sẻ với nhau những thành phần mình đã xây dựng cho nhiều người khác dùng chung.

Khi cần, lập trình viên có thể lắp ghép các thành phần có sẵn khác nhau để tạo thành các chương trình có chức năng khác nhau. Tất cả chỉ cần dựa trên công nghệ lắp ghép thành phần, tiết kiệm được rất nhiều công sức lập trình.

1.1.2 Định nghĩa về lập trình HTP Một số định nghĩa về "lập trình hướng thành phần": Thành phần (component): là một phần không tầm thường của hệ thống, gần như độc lập và có thể thay thế được, giữ một chức năng rõ ràng trong hệ thống. Một component có thể là một trong ba loại: source code component; runtime component; executable component.

1This content is available online at .

3 4 CHƯƠNG 1. BÀI 1: LẬP TRÌNH HƯỚNG THÀNH PHẦN (HTP)

Lập trình hướng thành phần là kiểu lập trình có xu hướng chia hệ thống phần mềm thành những thành phần, giữ các chức năng khác nhau, mà khi phối hợp chúng ta sẽ hệ thống phần mềm đó. Lập trình hướng thành phần sử dụng chung nhiều quan niệm của "lập trình hướng đối tượng", nhưng hai khái niệm này là độc lập với nhau.

1.2 Hợp lệ hoá dữ liệu. Ngôn ngữ vấn tin cơ sở dữ liệu. Kết nối cơ sở dữ liệu sử dụng công nghệ ADO. 1.2.1 Công cụ hợp lệ hoá dữ liệu trong Visual Basic2 Hợp lệ hoá dữ liệu là làm cho dữ liệu nhập vào đảm bảo tính hợp lệ.

1.2.1.1 Hợp lệ hoá sử dụng sự kiện LostFocus và phương thức SetFocus Sự kiện LostFocus xảy ra mỗi khi một điều kiểm mất tiêu điểm. Ta có thể viết mã lệnh trong sự kiện này để kiểm soát xem dữ liệu khi dời khỏi điều kiểm đã hợp lệ chưa. Nếu như dữ liệu chưa hợp lệ ta có thể yêu cấu người nhập dữ liệu phải nhập lại. Như vậy ta phải dời tiêu điểm về điều kiểm. Khi đó ta sẽ sử dụng phương thức SetFocus để đặt lại tiêu điểm cho điều kiểm. Khung của thủ tục LostFocus như sau: Private Sub ControlName_ LostFocus() ‘ Mã Code End Sub Ví dụ: Private Sub TxtTen_ LostFocus() If len(TxtTen.Text)=0 then Msgbox “Tên không được rỗng !” TxtTen.SetFocus End If End Sub

1.2.1.2 Hợp lệ hoá sử dụng sự kiện Validate Sự kiện Validate xảy ra trước khi người dùng có thể dịch chuyển tiêu điểm ra xa điều kiểm đó. Do đó ta có thể đặt mã lệnh để kiểm soát tính hợp lệ của dữ liệu trong sự kiện Validate nhằm ngăn cản người dùng dịch chuyển tiêu điểm cho đến khi các tiêu chuẩn về hình dạng dữ liệu được thoả mãn. Khung của thủ tục Validate như sau: Private Sub ControlName_ Validate(Cancel As Boolean) ‘ Mã Code End Sub Nếu bạn xác lập Cancel là True thì người dùng sẽ không có khả năng dời khỏi điều kiểm này cho đến khi người đó nhận được đữ liệu đúng VD: Private Sub TxtTen_ Validate(Cancel As Boolean) If len(TxtTen.Text)=0 then Msgbox “Tên không được rỗng !” Cancel=True End If End Sub 2This content is available online at . 5

Trên thực tế VB cung cấp cho bạn một dòng lệnh để bảo vệ VB còn tạo ra biến cố Validate cho điều khiển dữ liệu mỗi khi bản ghi hiện hành sắp được thay đổi Ví dụ bằng phương pháp Move First hoặc trứơc khi xử lý phương pháp Update, Delete hoặc Close. Cú pháp cho thủ tục biến cố này như sau: Sub DataControlName_ Validate([Index As Integer,] Action As Integer, Save_ As Integer) End Sub =∼ Chú y: Bạn không nên đặt phương pháp bất kỳ trong biến cố Validate làm thay đổi bản ghi hiện hành. Kết quả sẽ là sự chuyển đổi biến cố vô tận. Các phương pháp truy cập dữ liệu bạn có thể đặt vào biến cố này chỉ gồm UpdateRecord, UpdateControls, bởi vì chúng đều không sinh ra biến cố Validate. Điều này cung cấp cho bạn phương pháp cập nhật cở dữ liệu hoặc các điều khiển gắn kết trong thủ tục biến cố đó Trong đó tham số tuỳ chon Index được dùng nếu điều khiển dữ liệu là phần của mảng điều khiển một mảng điều khiển. Tham số Action được gởi bởi VB cho thủ tục biến cố và báo nguyên nhân thực sự để biến cố Validate được tạo ra. Dưới đây là danh sách các hằng kí hiệu được xây dựng trong VB khả dĩ cho sự kiện Validate

Constant Value Description vbDataActionCancel 0 Cancel the operation when the Sub exits vbDataActionMoveFirst 1 MoveFirst method vbDataActionMovePrevious 2 MovePrevious method vbDataActionMoveNext 3 MoveNext method vbDataActionMoveLast 4 MoveLast method vbDataActionAddNew 5 AddNew method vbDataActionUpdate 6 Update operation (not UpdateRecord) vbDataActionDelete 7 Delete method vbDataActionFind 8 Find method vbDataActionBookmark 9 The Bookmark property has been set vbDataActionClose 10 The Close method vbDataActionUnload 11 The form is being unloaded

Table 1.1

Nếu bạn thay đổi tham số Action thành vbDataActionCancel thì VB sẽ xoá thao tác này trước khi rời khỏi thủ tục Sub. Ngoài ra nếu bạn thay đổi tham số Action sang một trong các giá trị khác, VB sẽ thực thi thao tác đó thay vì thao tác ban đầu khi thủ tục trải qua. Ví dụ, nếu thủ tục biến cố Validate đã được xảy ra do phương pháp MoveFirst và trong tiến trình của thủ tục bạn có dòng Action=vbDataActionMoveLast Thì VB sẽ dịch chuyển bản ghi hiện hành đến cuối bảng đó. Bạn chỉo có thể dùng khả năng này nếu các hành động đó là tương thích. VD: bạn không thể thay đổi tham số hành động MoveFirst sang tham số vbDataActionUnload mà không có lỗi. Tham số Save nhận hai giá trị True, False. Nếu thông tin bất kỳ trong các điều khiển gắn kết data-aware đã được thay đổi, tham số này là True. Điều đó cho bạn một phương pháp phân tích thông tin có trong điêug khiển gắn kết trước khi cập nhật cơ sở dữ liệu. Để xác định các điều khiển data-aware nào đã được thay đổi, bạn dùng tính chất DataChanged của điều khiển đó. Tính chất này là True nếu nội dung của điều khiển đã được thay đổi và là False nếu không được thay đổi.

1.2.1.3 Hợp lệ hoá sử dụng sự kiện KeyPress, KeyUp, KeyDown - Các sự kiện trên xảy ra trên các điều kiểm theo bảng sau: 6 CHƯƠNG 1. BÀI 1: LẬP TRÌNH HƯỚNG THÀNH PHẦN (HTP) 7

Sự kiện Xảy ra khi KeyPress Người sử dụng nhấn và thả một phím trên bàn phím trong khi một đối tượng đang trong tầm ngắm KeyDown Người sử dụng nhấn một phím trên bàn phím trong khi một đối tượng đang trong tầm ngắm KeyUp Người sử dụng thả một phím trên bàn phím trong khi một đối tượng đang trong tầm ngắm Table 1.2 Cú pháp của các biến cố này như sau: Private Sub ControlName_ KeyPress(KeyAscii As Integer) End Sub Private Sub ControlName_ KeyDown(KeyCode As Integer, Shift As Integer) End Sub Private Sub ControlName_ KeyUp(KeyCode As Integer, Shift As Integer) End Sub Trong đó tham số KeýyAscii và KeyCode là mã ASCII của kýy tự vừa được nhấn. Tham số Shift có thể nhận các giá trị sau

Constant Value Description vbShiftMask 1 SHIFT key bit mask. VbCtrlMask 2 CTRL key bit mask. VbAltMask 4 ALT key bit mask. Table 1.3 Như vậy ta có thể đặt mã lệnh trong các sự kiện này để kiểm soát xem các phím được nhấn xem có hợp lệ hay không và có thể huỷ bỏ những ky tự nhận được bằng cách gán KeyCode=0 Ví dụ: Private Sub TxtSo_KeyPress(KeyAscii As Integer) Static dautru As Boolean Static daucham As Boolean Select Case KeyAscii Case vbKeyBack, vbKeyLeft, vbKeyRight, Asc("0") To Asc("9") Case Asc("-") If (txtso.SelStart <> 0) Or dautru = True Then KeyAscii = 0 Else dautru = True End If Case Asc(".") If daucham = True Then KeyAscii = 0 Else daucham = True End If Case Else KeyAscii = 0 End Select End Sub 8 CHƯƠNG 1. BÀI 1: LẬP TRÌNH HƯỚNG THÀNH PHẦN (HTP)

1.2.1.4 Hợp lệ hoá sử dụng sự kiện MouseDown, MoseUp - Các sự kiện trên xảy ra trên các điều kiểm theo bảng sau:

Sự kiện Xảy ra khi MouseDown Người sử dụng nhấn một nút chuột bất kỳ trong khi con trỏ chuột đang nằm trên một đối tượng. MouseUp Người sử dụng thả một nút chuột bất kỳ trong khi con trỏ chuột đang nằm trên một đối tượng.

Table 1.4 Cú pháp của các biến cố này như sau: Private Sub ControlName_ MouseUp(Button As Integer, Shift As Integer, X As_ Single, Y As Single) End Sub Private Sub ControlName_ MouseDown(Button As Integer, Shift As Integer, X As_ Single, Y As Single) End Sub

Constant (Button) Value Description vbLeftButton 1 Left button is pressed vbRightButton 2 Right button is pressed vbMiddleButton 4 Middle button is pressed

Table 1.5

Constant (Shift) Value Description vbShiftMask 1 SHIFT key is pressed. vbCtrlMask 2 CTRL key is pressed. vbAltMask 4 ALT key is pressed.

Table 1.6 Ta có thể đặt mã lệnh để kiểm soát tính hợp lệ của dữ liệu trong hai sự kiện nhằm ngăn cản sự chấp nhận dữ liệu cho đến khi các tiêu chuẩn về hình dạng dữ liệu được thoả mãn. Ví dụ: Private Sub Cmdnhap_MouseDown(Button As Integer, Shift As Integer, X As Single,_ Y As Single) If Len(txtten) = 0 Then MsgBox "Nhap ho ten!" txtten.SetFocus End If End Sub

1.2.2 Ngôn ngữ vấn tin cơ sở dữ liệu (Structure Query Language)3 1.2.2.1 Cơ sở dữ liệu là gì? Cơ sở dữ liệu là một kho chứa thồn tin. Có nhiều loại cơ sở dữ liệu. Cơ sở dữ liệu và quan hệ chính là một loại cơ sở dữ liệu phổ biến nhất hiện nay. Một cơ sở dữ liệu bao gồm: 3This content is available online at . 9

• Chứa dữ liệu trong các bảng, đựơc cấu tạo bởi các dòng còn gọi là các mẩu tin,và cột còn gọi là các trường. • Cho phép lấy về (hay truy vấn) các tập dữ liệu con từ các bảng • Cho phép nối các bảng với nhau cho mục điứch truy cập các mẩu tin liên quan đến nhau chứa trong các bảng khác nhau.

1.2.2.2 Bộ máy (Engine) cơ sở dữ liệu là gì? Chức năng cơ bản của một cơ sở dữ liệu được cung cấp bởi một bộ máy cơ sở dữ liệu, là hệ thống chương trình quản lý cách thức chứa và trả về dữ liệu. Như bộ máy cơ sở dữ liệu Microsoft Jet, Microsoft SQL Server...

1.2.2.3 Bảng và trường. Các cơ sở dữ liệu được cấu tạo từ các bảng dừng thể hiện các phân nhóm dữ liệu. Ví dụ nếu ta tạo một cơ sở dữ liệu để quản lýy các tài khoản trong công việc kinh doanh, ta phải tạo một bảng cho khách hàng, một bảng cho hoá đơn và một bảng cho nân viên. Bảng có cấu trúc định nghĩa sẵn và chứa dữ liệu phù hợp với cấu trúc này

• Bảng chứa các mẩu tin là các mẩu dữ liệu riêng rẽ bên trong phân nhóm dữ liệu. • Mốu tin: Chứa các trường. Mỗi trường thể hiện một bộ phận dữ liệu trong một mẩu tin.

Thiết kế một cở dũ liệu: để tạo một cở dữ liệu trước hết ta phải xác định thông tin gì cần theo dõi. Sau đó ta thiết kế cơ sở dữ liệu tạo bảng chứa các trường định nghĩa các kiểu dữ liệu sẽ có sau ki tạo ra cấu trúc cơ sở dữ liệu, cơ sở dữ liệu có thể chứa dữ liệu dưới dạng mẩu tin. Ta không thể đưa dữ liệu vào mà không có các bảng hay định nghĩa trường vì dữ liệu sẽ không có chỗ để chứa. Do đó thiết kế cơ sở dũ liệu cức kỳ quan trọng nhất là rất khó thay đổi mộ khi đã tạo xong nó. Giữa các bảng trong cùng một cơ sở dữ liệu có những mối liên hệ với nhau. Khi ta định nghĩa một mối quan hệ ta đã thông báo với bộ máy cơ sở dữ liệu biết rằng hai trường trong hai bảng liên quan được nối với nhau.

1.2.2.4 Recordset là gì? Một khi ta đã biết tạo bảng ta phải biết thao tác với chúng. Thao tác trên các bảng liên quan đến việc nhập và lấy dữ liệu từ các bảng khác nhau cũng như việc kiểm tra sửa đổi cấu trúc bảng. Để thao tác với cấu trúc bảng ta dùng câu lệnh định nghĩa dữ liệu (Câu lệnh truy vấn) hoặc một đối tượng TableDef. Để thao tác các dữ liệu trong bảng ta dùng RecorSet. Một Recordset là một cấu trúc dữ liệu thể hiện một tập hợp con các mẩu tin lấy về từ cơ sở dữ liệu. Về khái niệm nó tương tự một bảng nhưng có thêm một vài thuộc tính riêng biệt quan trọng. Các Recordset thể hiện như là các đối tượng, về khái niệm tương tự như là các đối tượng giao diện người sử dụng. Cũng như các đói tượng khác trong VB các đối tượng Recordset có các thuộc tính và phương thức riêng. Ta có thể lập trình để tạo và sử dụng các Recordset theo một trong ba thư viện truy cập dữ liệu:

• Các đối tượng truy cập dữ liệu (DAO) • Các đối tượng truy cập dữ liệu từ xa (RDO) • Các đối tượng dữ liệu Active (ADO)

Ngôn ngữ SQL Các câu truy vấn SQL cho ta khả năng lấy về các mẩu tin từ một bảng cơ sở dữ liệu, đối chiếu các quan hệ cơ sở dữ liệu với nhau trong nhiều bảng và thao tác với cấu trúc cơ sở dữ liệu. SQL(Structure Query Language) là giải pháp chuẩn để thao tác với cơ sở dũ liệu. Nó được thực hiện theo nhiều dạng khac nhau trong các hệ thống cơ sở dữ liệu quan hệ bao gồm MicroSoft Access và SQL Server. 10 CHƯƠNG 1. BÀI 1: LẬP TRÌNH HƯỚNG THÀNH PHẦN (HTP)

Nói chung SQL được dùng để tạo câu truy vấn dùng để trích dữ liệu từ cơ sở dũ liệu với một số lượng lớn các câu lệnh dùng để thi hành các chức năng khác trên cơ sở dữ liệu như tạo bảng và trường. Các câu lệnh SQL được chia làm hai loại:

• DDL(Data definition language): Ngôn ngữ định nghĩa dữ liệu • DML (Data manipulation languge): Ngôn ngữ thao tác dữ liệu • DCL(Data control language ): Ngôn ngữ điều khiển dữ liệu • TCL(Transaction control languge): Ngôn ngữ điều khiển phiên dao dịch

1.2.3 Kết nối cơ sở dữ liệu sử dụng công nghệ ADO (ActiveX Data Objects)4 1.2.3.1 Công nghệ Open Database Connectivity (ODBC) ODBC là công nghệ Windows cho phép sử dụng client nối với cơ sở dữ liệu từ xa. Lưu trú trên máy Cilent, ODBC tìm cách làm cho nguồn dữ liệu quan hệ trở thành tổng quát đối với ứng dụng Client. Điều này có nghĩa là ứng dụng Client không cần quan tâm kiểu dữ liệu cơ sở mà nó đang nối là gì. Bởi vì đây là công nghệ phía Client, ODBC không đòi hỏi phải xử lý trên Servercuar cơ sở dữ liệu. ODBC gồm 3 phần : - Trình quản lý điều khiển (Driver maneger)

• Một hay nhiều trình điều khiển (Driver) • Một hay nhiều nguồn dữ liệu (Data source).

Figure 1.1: Kiến trúc của ODBC

1.2.3.1.1 Tạo nguồn dữ liệu ODBC. Để tạo một ứng dụng Client nối với cơ sở dữ liệu Client/Server dùng ODBC, trước hết ta phải cung cấp thông tin về nguồn dữ liệu trên client. Mỗi server yêu cầu những gói thông tin khác nhau để nối với client. ODBC cung cấp cho thông tin này một tên đơn giản để ta có thể tham chiếu đến nó, thay vì phải thiết lập gói thông tin từ đầu mỗi lần ta cần đến nó. Điều này cung cấp cho ứng dụng Client khả năng tham chiếu một cách dễ dàng đến tổ hợp của một điều khiển, một cơ sở dữ liệu và có thể thêm tên một người sử dụng và mật khẩu. Tên này chính là tên của nguồn dữ liệu hay DSN. Để tạo một tên nguồn dữ liệu ODBC trên máy Client, ta theo các bước sau: + Đảm bảo có một SQL Server đang hoạt động vàg có thể truy cập nó từ máy Client. + Từ Start chọn Setting chọn ConTrol Panel + Nhấn đúp chuột lên biểu tượng ODBC. Hộp thoại quản trị nguồn dữ liệu xuất hiện:

4This content is available online at . 11

Figure 1.2

Ta có thể tạo một trong ba kiểu nguồn dữ liệu ODBC: + User DSN: Chỉ có một người tạo ra nó được sử dụng nó và chỉ trên máy đang dùng. + System DSN: Bất kỳ ai sử dụng máy này cũng có thể dùng được. Đây cũng là kiểu nguồn dữ liệu mà ta cần tạo khi cài đặt ứng dụng cơ sở dữ liệu Web. + File DSN: Có thể được copy và sử dụng dễ dàng bởi máy khác.

1.2.3.1.2 Tạo System DSN 1. Chọn Vào Tab System DSN trong cửa sổ ODBC Data Source Administrator. 2. Nhấn nút Add 3. Hộp thoại Create New Data Source xuất hiện, chọn tên của diều khiển cơ sở dữ liệu ta muốn dùng 4. Nhấn Finish. Trình tạo nguồn cơ sở mới xuất hiện. 5. Trong ô Name nhập tên của nguồn dữ liệu. Tên này sẽ được dùng trong ứng dụng Client để tham chiếu đến cơ sở dữ liệu, vì vậy nên đặt tên sao cho dễ nhớ. 12 CHƯƠNG 1. BÀI 1: LẬP TRÌNH HƯỚNG THÀNH PHẦN (HTP)

6. Điền vào ô Description thông tin mô tả về cơ sở dữ liệu, thông tin này chỉ hiển thị trong cửa sổ Control Panel 7. Trong hộp kết hợp Server, chọn chọn bộ máy cơ sở dữ liệu. 8. Nhấn Next, màn hình kế tiếp của trình tự động xuất hiện, hỏi ta cách Login vào Server. 9. Màn hình kế tiếp của trình tự động xuất hiện, chọn vào hộp đánh dấu “Change the Default database to” rồi chọn cơ sở dữ liệu vừa đạt tên 10. Nhấn Next màn hình kế xuất hiện, nhắc ta chọn thông dịch bộ ký tự (thông thường ta để mặc định trừ phi ta sử dụng bộ ký tự khác trên Server) nhấn next 11. Màn hình kế cho ta chọn khả năng kích hoạt tác vụ ghi nhật ký . Thông thường ta chỉ chuyển nó thành On nếu ta đang gặp lỗi hay tìm kiếm những nguyên nhân ách tắc trong ứng dụng.

Nếu bật tuỳ chọn này thành on và quên không tắt nó thành off thì đay chính là nguyên nhân phổ biến của sự suy biến của khả năng hoạt động truy vấn khi sử dụng ODBC, Vì là công cụ gỡ rối nên nhớ chuyển nó thành off khi ta đưa ứng dụng thành sản phẩm.

1. Nhấn Finish, hộp thoại xuất hiện mô tả chi tiết của nguồn dữ liệu mà ta vừa tạo. Sau đó nhấn nút Test Data Source. Trình điều khiển sẽ đáp ứng bằng cách thông báo một kết nối vừa được thiết lập thành công.

1.2.3.2 Công nghệ OLE DB (Object Linking and Embedding Data Base) OLE DB là một tập hợp các hệ giao tiếp truy cập dữ liệu của Microsoft dùng để cung cấp sự tích hợp dữ liệu chung trên một doanh nghiệp bất chấp loại dữ liệu. Những giao diện này cho phép các nguồn dữ liệu chia sẻ thông tin của chúng qua các giao diện chung mà không cần bổ sung các chức năng CSDL không có trong nơi lưu trữ. Ta chỉ cần lập trình với phần giao diện của người sử dụng ở phía Client, bởi vì sự truy cập dữ liệu trên cả trình trình duyệt Web và ứng dụng Visual Basic được chuyển hết về phía ActiveX Server, ta có thể đảm bảo rằng logic chương trình luôn nhất quán, bất kể loại chương trình nào đang được dùng.

1.2.3.2.1 Chỉ ra trình cung cấp OLE DB và chuỗi kết nối Nếu không chỉ ra trình cung cấp, hoặc ta không dùng đối tượng Connection, ta sẽ có một trình cung cấp mặc định là trình cung cấp ODBC MSDASQL Dùng đối tường connection của ADO để kết nối với nguồn dữ liệu. Thuộc tính Provider của đối tượng Connection là chuỗi ký tự chỉ ra kết nối mà trình cung cấp OLE DB sẽ dùng, dùng chuỗi kết nối trong ADO ConnectionString để cung cấp thông tin về cách thức kết nối với Server. Tuỳ thuộc vào nguồn dữ liệu mà thông tin kết nối khác nhau: - Khi ta dùng trình cung cấp ODBC: cn.provider = “MSDASQL” cn.ConnectionString = “DSN = tracnghiem” Tất nhiên một DSN tên là tracnghiem phải thực sự tồn tại trên máy Client. Trường hợp kết nối không có DSN cn.provider = “MSDASQL” cn.ConnectionString = “Driver =SQL Server; DataBase =Tracnghiem; UID=Hue; PID=minhhue; ” Kết nối này sẽ nhanh hơn vì không cần đọc thông tin DSN từ bảng đăng ký của Windows. Tuy nhiên nó kém linh hoạt hơn vì nó gắn chặt thông tin đã được biên dịch - Dùng trình cung cấp Jet thì chuỗi kết nối là đường dẫn và tập tin MDB: cn.Provider = ”Microsoft.Jet.OLEDB.4.0 ” cn.ConnectionString = “c:\data\dulieu.mdb” Để kết nối cơ sở dữ liệu bảo mật của trình cung cấp Jet thì ta phải cung cấp thêm thông tin thông qua tập hợp Properties của đối tượng connection. Thường là tên người sử dụng, mật khẩu, vị trí của cơ sở dữ liệu chứa thông tin về bảo mật. 13

Cn.Provider = “Microsoft.Jet.OLEDB.4.0” Cn.ConnectionString =”C:\data\dulieu.mdb” Cn.Properties(“PassWord”) = “minhhue” Cn.Properties(“User ID”) = “Hue” - Để nối với cơ sở dữ liệu SQL Server, ta dùng trình cung cấp SQLOLEDB.1 cn.Provider = “SQLOLEDB.1” cn.ConnectionString = “DATABASE = dulieu; SERVER = NameServer; UID = hue; PWD = minhhue” Lưu ý trường hợp này, chuỗi kết nối của SQL Server tương tự với chuỗi kết nối không có DSN, ngoại trừ tham số DRIVER= - Để kết nối với Oracle, ta dùng trình điều khiển Oracle gọi là MSDAORA cn.Provider =”MSDAORA” cn.ConnectionString = User/MyPassWord@ServiceName Trên đây là cách kết nối Oracle chuẩn, tổ hợp tên người sử dụng, mật khẩu và tên dịch vụ. Ta còn có thể logon vào Oracle bằng cách cung cấp Server, tên người sử dụng như tham số cho phương thức Open của đối tượng connection Dim cn As ADODB.Connection Set cn = New ADODB.connection cn.Provider = “MSDAORA” cn.Open “Server”, “UserID”, “PasWord”

1.2.3.3 Công nghệ Data Access Object (DAO) Ta có thể dùng DAO để thao tác với cơ sở dữ liệu (CSDL) thông qua môi trường lập trình Visual Basic 6.0, với DAO ta có thể thi hành các câu truy vấn, cập nhật giá trị, trong các bảng CSDL và tạo cấu trúc CSDL bao gồm các bảng, các câu truy vấn chứa sẵn và mối quan hệ giữa các bảng. Mô hình đối tượng DAO khá phức tạp với hàng trăm yếu tố, hàng tá kiểu tập hợp chứa rất nhiều đối tượng xử lý CSDL. Thông qua các tập hợp sở hữu bởi đối tượng DataBase, ta có thể thao tác trên dữ liệu và cấu trúc của CSDL chứa trong một CSDL Trong lập trình DAO, có một tập hợp cốt lõi gồm các kỹ thuật thông dụng được sử dụng gần như cho mọi chương trình. Chúng bao gồm: - Thi hành câu truy vấn SELECT để lấy về các dữ liệu từ CSDL - Duyệt qua từng mẩu tin trong một RecordSet - Thi hành câu truy vấn hành động (Update, Delete và Append, ...) - Sửa đổi cấu trúc CSDL - Xử lý lỗi phát sinh bởi truy cập CSDL + Các tập hợp hiện có trong lập trình DAO 3.5 và thể hiện của chúng:

Tập hợp Thể hiện Giao diện WorkSpaces Thể hiện kết nối mở cho bộ máy Thuộc tính Count, Append, CSDL, thông thường ta chỉ có thể Delete phương thức Refresh có 1 workspace hoạt động tại thời điểm hiện thời continued on next page 14 CHƯƠNG 1. BÀI 1: LẬP TRÌNH HƯỚNG THÀNH PHẦN (HTP)

DataBase Tất cả các CSDL được mở trong Thuộc tính Count, phương thức 1 workspace, thường ta chỉ có 1 Refresh CSDL được mở hiện thời TableDefs Tất cả các định nghĩa bảng hiện Thuộc tính Count, Append, có trong 1 CSDL Delete, phương thức Refresh QueryDefs Tất cả các định nghĩa truy vấn Thuộc tính Count, Append, hiện có trong 1 CSDL Delete, phương thức Refresh RecordSet Tất cả các RecordSet mở trong Thuộc tính Count, phương thức ngữ cảnh của một CSDL duy Refresh nhất Parameter Các tham số hiện có trong một Thuộc tính Count, phương thức QueryDef nhất định Refresh Relations Mối quan hệ được định nghĩa Thuộc tính Count, Append, trong 1 CSDL đặc biệt Delete, phương thức Refresh Connections Kết nối đến CSDL hiện hữu bởi 1 Thuộc tính Count, phương thức đối tượng workspace =ODBCDi- Refresh rect Indexes Chỉ mục thuộc về một TableDef Thuộc tính Count, Append, nhất định Delete, phương thức Refresh Fields Các trường hiện có trong một cấu Thuộc tính Count, Append, trúc dữ liệu Delete, phương thức Refresh Groups Nhoms bảo mật sở hữu bởi CSDL Thuộc tính Count, Append, (tham khảo phần CSDL nhiều Delete, phương thức Refresh người sử dụng) Users Danh sách người sử dụng xác Thuộc tính Count, Append, định bởi tính năng bảo mật Delete, phương thức Refresh CSDL (tham khảo phần CSDL nhiều người sử dụng) Errors Lỗi sinh ra do 1 hành động của Thuộc tính Count, phương thức DAO Refresh Containers Nhóm các đối tượng tài liệu định Thuộc tính Count, phương thức nghĩa sẵn chứa trong CSDL Refresh Documents CSDL, bảng, và quan hệ là những Thuộc tính Count, phương thức ví dụ của đối tượng Refresh continued on next page 15

Properties Các thuộc tính của một đối tượng Thuộc tính Count, Append, DAO Delete, phương thức Refresh

Table 1.7

Sử dụng DAO để làm việc với sữ liệu Dùng đối tượng DataBase để kết nối với 1 CSDL + Từ menu Project chọn Reference + Chọn "Microsoft DAO 3.51 Object Library" + Chọn OK. Dùng phương thức OpenDataBase để tạo đối tượng DataBase Phương thức này trả về một đối tượng DataBase do đó trước khi dùng ta phải khai báo biến đối tượng có kiểu DataBase để chưa giá trị trả về của phương thức. Dim DB As Database Set DB = OpenDatabase(DBName, [Option], [ReadOnly], [Connect]) DBName: Tên file CSDL Option: = True: CSDL được mở trong chế độ loại trừ (không ai khác có thể mở nó) = False: Mọi người có thể mở nó ReadOnly: = True: Ta không thể sửa đổi CSDL Connect: Cách thức kết nối với CSDL Client/Server [U+F0A9] Dùng đối tượng RecordSet để thao tác với các mẩu tin Ta sử dụng đối tượng RecordSet để thao tác với các mẩu tin trong DAO. Đối tượng RecordSet cung cấp một giao diện hướng đối tượng cho mô hình CSDL quan hệ liên quan đến các bảng được chia thành những mẩu tin và trường. [U+F0A9] Dùng phương thức OpenRecordSet để tạo đối tượng RecordSet Trong DAO các đối tượng DataBase, Connection, QueryDef, TableDef, và RecordSet đều có phương thức OpenRecordSet, tất cả đều dùng để truy cập dữ liệu chứa trong CSDL. Set Recordset = object.OpenRecordset (Source, [Type], [Options],[LlockEdits])

Recordset: Biến đối tượng bạn muốn mở Object: Đối tượng đã tồn tại để tạo có phương thức Open- RecordSet Source: Một chuỗi chỉ ra nguồn dữ liệu mà RecordSet sẽ lấy, có thể là tên bảng, tên truy vấn hoặc một câu truy vấn. Type Lựa chọn: Một hằng số quy định kiểu của con chỏ Recordset được mở Options Lựa chọn: Một sự kết hợp hằng số chỉ ra đặc tính của Recordset continued on next page 16 CHƯƠNG 1. BÀI 1: LẬP TRÌNH HƯỚNG THÀNH PHẦN (HTP)

LockEdit Lựa chọn: Một hằng số xác định khoá của Recordset

Table 1.8

Type: có thể nhận các kiểu sau

Tên hằng Mô tả (ý nghĩa) dbOpenTable Tạo một đối tượng Recordset kiểu bảng trong một WorkSpaceCho phép sửa đổi bản ghi, không thể trình bày kết quả của câu truy vấn nhiều bảng dbOpenDynamic Mở một đối tượng Recordset kiểu Dymamic trong 1 WorkSpace Cho phép sửa đổi, thêm hay xoá ngay khi RecordSet đang được mở ở user khác, không hiệu quả = Dynaset dbOpenDynaset Mở một đối tượng Recordset kiểu Dynaset , cho phép cập nhật, cho phép lấy về các mẩu tin từ nhiều bảng = cách nối bảng, cập nhật được, tốc độ tìm kiếm chậm. dbOpenSnapshot Mở một đối tượng Recordset kiểu Snapshot, nhanh hơn Dynaset, cập nhật được. chỉ trả về một bản sao còn Dynaset lấy về 1 bộ các tham chiếu RecordSet. dbOpenForwardOnly (Defalt) Mở một đối tượng Recordset tương tự như Snapshot nhưng nhanh hơn Snapshot, con trỏ của nó chỉ có thể di chuyển tới phía trước

Table 1.9

Options:Bạn có thể dùng kết hợp của những hằng cho đối số Options

Tên hằng Mô tả (ý nghĩa) dbAppendOnly Cho phép người dùng thêm bản ghi mới, ngăn chặn sửa đổi, xoá các bản ghi đang tồn tại. dbSQLPassThrough Thực hiện một câu truy vấn (Microsoft Jet snapshot-type Recordset only). dbSeeChanges Phát sinh một lỗi nếu người sử dụng đang thay đổi dữ liệu mà một người sử dụng khác truy nhập vào. dbDenyWrite Ngăn chặn các user khác sửa đổi hoặc thêm bản ghi. continued on next page 17 dbDenyRead Ngăn chặn các user khác đang đọc trong bảng. dbForwardOnly Tạo 1 con trỏ Recordset kiểu Snapshot. Nó cung cấp chỉ tương thích con trỏ kiểu Forward và bạn nên dùng hằng dbOpenForwardOnly trong hằng của lựa chon Options dbReadOnly Ngăn chặn users thay đổi bản ghi. Bạn nên dùng hằng bReadOnly trong hằng của lựa chon Options dbRunAsync Thi hành truy vấn đồng bộ. dbExecDirect Thi hành truy vấn trực tiếp gọi bởi SQLExecDirect. Chỉ dùng lựa chọn này khi bạn không mở Record- Set. Xem thêm Microsoft ODBC 3.0 Programmer’s Reference." dbInconsistent Cho phép cập nhật những mâu thuẫn (Microsoft Jet dynaset-type and snapshot-type Recordset objects only). dbConsistent Chie cho phép cập nhật thích hợp (Microsoft Jet dynaset-type and snapshot-type Recordset objects only).

Table 1.10

LockEdits:Bạn có thể dùng những hằng cho cho đối số LockEdit

Tên hằng Mô tả (ý nghĩa) dbReadOnly Ngăn chặn user thay đổi Recordset (Default cho ODBCDirect workspaces). Bạn có thể dùng dbReadOnly trong lựa chọn options, hoặc trong LockEdit (nhưng không gồm cả 2. Nếu bạn dùng cả 2 sẽ có lỗi). dbPessimistic Dùng Pesimistic khoá kết nối môi trường nhiều người dùng dbOptimistic Dùng Pesimistic khoá kết nối môi trường nhiều người dùng cho đến khi thi hành phương thức Up- date7. dbOptimisticValue Dùng optimistic đặt cơ sở đồng thời nhiều giá trị trên hàng. continued on next page 18 CHƯƠNG 1. BÀI 1: LẬP TRÌNH HƯỚNG THÀNH PHẦN (HTP)

dbOptimisticBatch Cho phép cập nhật theo gói.

Table 1.11

[U+F0A9] Các thuộc tính, phương thức của RecordSet + Thuộc tính EOF (End Of File) = True khi con trỏ bản ghi ở vị trí cuối của RecordSet + Thuộc tính BOF (Begin Of File)=True khi ta di chuyển con trỏ bản ghi đến cuối dòng của RecordSet. + Các phương thức di chuyển con trỏ RecordSet - MoveFirst: Di chuyển con trỏ đến mẩu tin đầu tiên trong RecordSet - MoveNext: Di chuyển con trỏ đến mẩu tin kế tiếp sau trong RecordSet - MovePrevious: Di chuyển con trỏ đến mẩu tin kế tiếp trước trong RecordSet - MoveLast: Di chuyển con trỏ đến mẩu tin cuối cùng trong RecordSet - Move: Di chuyển một số mẩu tin được chỉ định + Thuộc tính RecordCount xác định số mẩu tin trong một RecordSet + Phương thức Edit cho phép sửa đổi giá trị trong một mẩu tin - Dùng phương thức duyệt để di chuyển con trỏ bản ghi đến vị trí cần sửa - Thi hành phương thức Edit - Dùng tập hợp Fields của đối tượng RecordSet để gán giá trị mới cho mẩu tin - Dùng phương thức Update để cập nhật giá trị mới cho RecordSet + Dùng phương thức AddNew và Update để tạo mẩu tin mới - Thi hành phương thức AddNew để thêm bản ghi mới - Dùng tập hợp Fields của đối tượng RecordSet để gán giá trị mới cho mẩu tin - Dùng phương thức Update để cập nhật giá trị mới cho RecordSet + Các phương tìm kiếm để định vị mẩu tin - FindFirst: - FindNext: - FindPrevious: - FindLast: RecordSet.{FindFirst | FindLast | FindNext | FindPrevious} Criteria Criteria: Một xâu chứa điều kiện tìm kiếm. Ví dụ: Public dao As Database Private Sub Form_Load() Set dao = OpenDatabase(App.Path & "\qlbh97.mdb") End sub ——————– Public Sub mbdao(rs As Recordset, tenbang As String) Set rs = dao.OpenRecordset(tenbang, dbOpenSnapshot) End sub ——————— Public cmdthem_Click() Dim rs as Recordset Call modao(rs, “loai”) rs.AddNew rs!maloai = "mb" rs!tenloai = "máy bay" rs.Update rs.Close End sub ———————- 7http://voer.edu.vn/content/m18842/latest/mk:@MSITStore:C:%5CProgram%20Files%5CMicrosoft%20Visual%20Studio%5CMSDN%5Cdao360.chm::/htm/damthupdate.htm 19

Public cmdsua_Click() Dim rs as Recordset Call modao(rs, “loai”) Do While not rs.EOF If Ucase(rs!maloai) = Ucase("mb") then Rs.Edit Rs!tenloai = “Máy bay moi” Rs.Update End if Rs.MoveNext Loop rs.Close End sub

1.2.3.4 Công nghệ Remote Data Access Object (RDO) + Định cấu hình và sử dụng ODBC ODBC là một công nghệ của Windows cho phép ứng dụng Client kết nối với CSDL từ xa. ODBC gồm 3 phần: 1. Trình quản lý điều khiển (Driver manager) 2. Một hay nhiều trình điều khiển (Driver) 3. Một hay nhiều nguồn dữ liệu (Data Source) Tạo nguồn dữ liệu cho ODBC 1. Đảm bảo rằng ta có một SQL Server đang hoạt động 2. Phóng Coltrol Panel 3. Chọn ODBC. hộp thoại quản trị nguồn dữ liệu xuất hiện 20 CHƯƠNG 1. BÀI 1: LẬP TRÌNH HƯỚNG THÀNH PHẦN (HTP)

Figure 1.3

Hình 1.2 Hộp thoại Quản trị nguồn dữ liệu ODBC [U+F0B7] User DSN: Chỉ có người tạo ra nó mới sở dụng nó và chỉ trên máy đang dùng [U+F0B7] System DSN: Bất kỳ ai sử dụng máy này cũng có thể dùng được [U+F0B7] File DSN: Có thể được copy và sử dụng dễ dàng bởi máy khác

1.2.3.4.1 Tạo System DSN 1. Chọn tab System DSN trong cửa sổ ODBC Data Source Administrator 2. Chọn Add. 3. Hộp thoại Create New Data Source xuất hiện. Chọn tên của điều khiẻn CSDL ta muốn dùng 4. Chọn Finish 5. Chọn tên của nguồn dữ liệu ở Name (Tên này sẽ được dùng trong ứng dụng Client để tham chiếu đến CSDL, vì thế nên đặt cho gợi nhớ) 6. Description chỉ định thông tin hiển thị trong cửa sổ ODBC của Control Panel 7. Trong hộp thoại Server, chọn (tên Server) SQL Server chứa CSDL mà ta đang làm việc 8. Chọn Next chọn cơ chế Login vào server. Sau đó nhập tên người sử dụng và mật khẩu. Nhấn Next 9. Chọn ô đánh dấu "Change the default database", rồi chọn cơ sở dữ liệu là "Data" từ hộp kết hợp 10. Nhấn Next. Trên màn hình nhắc ta chọn thông dịch bộ ký tự . Hãy nhấn Next 11. Màn hình kế cho ta chọn khả năng kích hoạt tác vụ ghi nhật ký 12. Chọn Finish sau đó nhấn nút Test Data Source 13. Nhấn OK , tên nguồn dữ liệu mới sẽ xuất hiện trong cửa sổ ODBC Data Source Addministrator 21

1.2.3.4.2 Kiểm nghiệm kết nối CSDL ODPC (Ping) Công việc này được dùng khi cần xác định nguyên nhân trục trặc trong một kết nối Client/Server, là do Server, do kết nối mạng, do ODBC hay do ứng dụng Client. Cú pháp: ODBCPing /UUserName/ PPassWord/ SServer Ví dụ: Để kiểm định kết nối với SQL Server = BEDROCK, UserName= randy, PassWord=Prince ODBCPing /Urandy /Pprince /SBEDROCK +Từ dấu nhắc DOS, gõ lệnh ODBCPing /Urandy /Pprince /SBEDROCK [U+F0BF] + ODBCPING thiết lập kết nối với Server rồi thoát.

1.2.3.4.3 Kiểm nghiệm SQL Server DSN 1. Tạo nguồn dữ liệu ODBC tên là Novelty 2. Tạo 1 đề án Standard.EXE của VB. 3. Thêm điều khiển "Micrisoft Data Bound Grid Control" 4. Thêm đều khiển DBGrid 5. Tạo 1 form và 2 điều khiển kết nối dữ liệu 6. Đổi thuộc tính Data.DefaultType = 1 - UseODBC 7. Thiết lập thuộc tính Data.Connect = "ODBC;UID=randy; PWD=printce; DSN=Data" 8. Thiết lập thuộc tính Data.RecordSet= "SELECT * from cauhoi" 9. Quy định thuộc tính DBGrid.DataSource = Data1 10. Thi hành ứng dụng.

1.2.3.4.4 Truy cập dữ liệu dùng điều khiển dữ liệu từ xa + Điều khiển dữ liệu từ xa (Remote Data Control - RDO) là một cách truy cập dữ liệu từ xa trong một ứng dụng viết bằng Visual Basic, giao diện lập trình tương tự như điều khiển ADO Data hay DAO Data. + Sử dụng RDC - Trong Visual Basic chọn menu Project, Components - Chọn "Microsoft Remote Data Control ", thiết lập tham chiếu đến "Microsoft Data Bound Grid Control ". - Chọn OK - Tạo một instance cho điều khiển Remote Data và điều khiển Data Bound Grid - Nhập tên người sử dụng vào thuộc tính RemoteData . UserName - Nhập vào mật khẩu người dùng truy cập cơ sở dữ liệu vào thuộc tính RemoteData .Passoword - Quy định thuộc tính SQL RemoteData.SQL = "SELECT * from Noidung" - Chọn DSN cho cơ sở dữ liệu SQL Server ở thuộc tính Remote Data.DataSourceName. (DSN được tạo trước đây, sẽ xuất hiện trong danh sách thả xuống) - Đặt thuộc tính DBGrid.DataSource = MSRDC1 - Thi hành ứng dụng Sử dụng RDO trong chương trình Đối tượng dữ liệu từ xa (Remote Data Object - RDO) được sắp xếp trong cấu trúc phân nhánh đối tượng tương tự như DAO. + Tạo tham chiếu đến RDO trước khi sử dụng: chọn Project/ Reference/ "Microsoft Remote Data Object 2.0" + Chọn OK 22 CHƯƠNG 1. BÀI 1: LẬP TRÌNH HƯỚNG THÀNH PHẦN (HTP)

1.2.3.4.5 Thiết lập kết nối dùng đối tượng RDOConnection Ta có thể dùng đối tượng RDOConnection để thiết lập 1 kết nối đến Server cơ sở dữ liệu từ xa trong RDO Để tạo 1 kết nối dùng đối tượng RDOConnection, ta bắt đầu bằng công việc tạo chuỗi kết nối ODBC gồm các phần tử thông dụng:

UID Tên login của người sử dụng PID Mật khẩu của người sử dụng DSN Tên nguồn dữ liệu ta tạo trong trình Quản lý Điều khiển ODBC SRIVER Điều khiển ODBC mà ta muốn dùng DATABASE Tên cơ sở dữ liệu mà ta muốn kết nối APP Tên ứng dụng kết nối với CSDL LANGUAGE Ngôn ngữ quốc tế được dùng bởi Server SERVER Tên của SQL Server mà ứng dụng kết nối đến

Table 1.12

Ta không nhất thiết phải dùng toàn bộ các tham biến. Ví dụ: DSN=DSNQLBH; UID=hue;PWD=minhhue Nếu không cung cấp tên login và mật khẩu ngời sử dụng vào trong chuỗi kết nối, khi ứng dụng nối đến server, trình điều khiển ODBC sẽ hiển thị hộp thoại yêu cầu ngời sử dụng cung cấp thông tin vào. Thi hành phơng thức EstablishConnection để thi hành kết nối Ví dụ: Set rdo = New rdoConnection rdo.Connect = "DSN=DSNQLBH" rdo.EstablishConnection

1.2.3.4.6 Thi hành truy vấn đối với RDOQuery và RDOResultset chứa kết quả các mẩu tin trả về Dùng đối tợng RDOQuery để tạo câu truy vấn SQL động và đối tợng RDOResualset để chứa kết quả các mẩu tin trả về thông qua phương thức OpenResultset của đối tợng RDOQuery VD: Public rdo as rdoConnection ———————— Public Sub Form_load() Set rdo = New rdoConnection rdo.Connect = "DSN=DSNQLBH" rdo.EstablishConnection End Sub ——————— Public Sub mbrdo(rq As rdoQuery, rs As rdoResultset) Dim rq As rdoQuery Dim rs As rdoResultset Set rq = New rdoQuery Set rq.ActiveConnection = rdo rq.SQL = "select * from loai" Set rs = rq.OpenResultset Do While Not rs.EOF If rs!maloai = "tv" Then 23

rs.Edit rs!tenloai = "ti vi mau" rs.Update MsgBox "mau tin vua duoc sửa" End If rs.MoveNext Loop rs.Close End Sub ———————-

1.2.3.5 Công nghệ ActiveX Data Objects (ADO) ADO là công nghệ truy cập cơ sở dữ liệu hướng đối tượng. ADO được xem là kỹ thuật để truy cập cơ sở dữ liệu từ Web Server. Vì ADO được cung cấp dưới dạng thư viện ActiveX Server. Ta có thể dùng ADO trong ứng dụng Visual Basic. Trong thực tế sử dụng ADO để làm việc với cơ sở dữ liệu Client / Server thì dễ hơn kỹ thuật khác. ADO là giao diện dựa trên đối tượng cho công nghệ dữ liệu mới OLE DB.

1.2.4 Truy xuất dữ liệu sử dụng công nghệ ADO8 1.2.4.1 Truy xuất dữ liệu sử dụng điều khiển ADO Data Control Tạo một ứng dụng dừng điều khiển ADO Data rất đơn giản. Ta chỉ quan tâm đến việc duyệt cơ sở dữ liệu, không cần quan tâm đến lập trình. Thông qua hai thuộc tính ConnectionString và RecordSource của điều khiển Data, sau đó ràng buộc điều khiển với giao diện người sử dụng. Các bước thực hiện:

1. Bắt đầu một đề án mới của Visual Basic 2. Vào Menu Project Components, lập một tham chiếu đến “Microft ADO Data Control 6.0 (OLEDB)” 3. Nhấn OK, điều khiển ADO Data xuất hiện trên thanh công cụ của Visual Basic. Nhấp Double chute lên điều khiển để tạo một instance của điều khiển trên biểu mẫu. 4. Di chuyển điều khiển đến vị trí thích hợp trên biểu mẫu. 5. Nhấn nút phải chuột lên điều khiển, Menu bật ra chọn ADODB Properties. 6. Hộp thoại Data Link Properties xuất hiện. Chọn nút tuỳ chọn “User Connection String” rồi nhấn Build 7. Hộp thoại Data Link Properties xuất hiện. Đây là hộp thoại dùng để kết nối với cơ sở dữ liệu, sửdụng các bước kết nối để kết nối với cơ sở dữ liệu. 8. Trong hộp thoại Proprety pages của điều khiển ADO Data, thông báo cho điều khiển bảng nào sẽ được dùng, chọn tab RecordSource, rồi chọn adCmdTable từ hôpkj kết hợp commandType 9. Chọn hộp kết hợp Table or Stored Procedure Name. hộp kết hợp hiển thị danh sách tất cả các bảng trong cơ sở dữ liệu. Chọn bảng cần kết nối rồi nhấn Ok.

Kết nối đến cơ sở dữ liệu xảy ra khi ứng dụng thi hành. Tuy nhiên, kêt nối không có thông báo, bởi vì không có cách nào để hiển thị dữ liệu. Để hiển thị dữ liệu trả vè từ một điều khiển dữ liệu ta phảI tạo các kết nối ràng buộc với điều khiển dữ liệu. Theo các bước sau:

1. Tạo các điều khiển 2. Quy định thuộc tính DataSource của các điều khiển là tên của điều khiển ADO Data 3. Chọn điều khiển, quy định thuộc tính DataField của nó là một trường trong cơ sở dữ liệu.

Sử dụng điều khiển Data để kết nối với cơ sở dữ liệu Người sử dụng có thể duyệt qua các mẩu tin bằng các nút của điều khiển.

8This content is available online at . 24 CHƯƠNG 1. BÀI 1: LẬP TRÌNH HƯỚNG THÀNH PHẦN (HTP)

Figure 1.4

Sử dụng điều khiển ADO Data để cập nhật mẩu tin Khi người sử dụng sửa đổi mẩu tin hiển thị bởi điều khiển, mẩu tin đó tự động được cập nhật ngay sau khi người sử dụng di chuyển sang mẩu tin khác. hoặc bằng chương trình ta có thể thao tác với đối tượng Recordset. Ngoài khả năng cho phép duyệt qua RecordSet, điều khiển ADO Data cho phép thi hành các hoạt động trên dữ liệu. Nhiều hoạt động không đòi hỏi lập trình. Ta có thể dùng chương trình với điều khiển dữ liệu để duyệt qua từng mẩu tin, xoá mẩu tin, và tạo mẩu tin mới. Phần lớn chương trình phải viết khi làm việc với cơ sở dữ liệu đều tập trung trên đối tượng Recordset. Một đối tượng Recordset được sẵn sàng khi ta quy địng thuộc tính ConnectionString và RecordSoure của điều khiển. Để truy cập một thuộc tính hay phương thức của đối tượng Recordset của điều khiển dữ liệu trong chương trình, tat ham chiếu đến điều khiển dữ liệu, rồi tham chiếu đến đối tượng Recordset, rồi tham chiếu đến đối tượng hay phương thức của đối tượng Recordset. VD: để chuyển đến mẩu tin cuối cùng của Recordset chứa trong điều khiển dữ liệu dataADO, ta dùng đoạn chương trình sau: dataADO.Recordset.MoveLast

1.2.4.2 Truy xuất dữ liệu sử dụng công nghệ ADO Dữ liệuđối tượng ADO (ActiveX Data Object) là công nghệ truy cập CSDL hướng đối tượng tương tự như DAO và RDO. ADO hiện nay được Microsoft xem là kỹ thuật để truy cập CSDL từ Web Server, sử dụng ADO để làm việc với CSDL Client / Server thì dễ hơn các kỹ thuật khác. Phần lớn các nhà lập trình Visual Basic không tương tác trực tiếp với OLE DB.Thay vào đó, họ lập trình với ADO, mô hình đối tượng cung cấp giao diện với OLE DB. 1. Đối tượng Command : Chạy một câu truy vấn SQL hay chay một thủ tục lưu trữ dữ liệu

Methods Result - Type Discription Cancel Huỷ bỏ việc thực thi của lệnh Ex- ecute hay Open continued on next page 25

CreatParameter Parameter Tạo đối tượng Parameter mới Execute Recordset - Thực thi các câu truy vấn SQL- Thực thi các hàm lưu trữ dữ liệu Properties Result - Type Discription ActiveConnection Variant Chỉ ra đối tượng Connection nào tácd động lên đó CommandText String Chứa lệnh thực thi trên CSDL CommandTimeout Long Khoảng thời gian timeout khi thực thi lệnh CommandType CommandType Kiểu của lệnh trong đối tượng Command Name String Tên của đối tượng Command Prepared Boolean Xác định có lưu hay không 1 bản dịch của lệnh trước khi thực thi State Long Trạng thái của đối tượng Com- mand Collections Result - Type Discription Parameters Parameters Chứa các đối tượng Parameters Properties Properties Chứa các đối tượng Properties

Table 1.13

2. Đối tượng Connection : Tạo liên kết tới kho lưu trữ dữ liệu

Methods Result - Type Discription BeginTrans Integer Bắt đầu một transaction mới Cancel Huỷ bỏ việc thực thi chưa hoàn tất Close Đóng một liên kết đang mở và các đối tượng khác đi kèm CommitTrans Lưu các thay đổi và kết thúc transaction hiện hành Execute Recordset Chạy các truy vấn SQL, cacds hàm, ... continued on next page 26 CHƯƠNG 1. BÀI 1: LẬP TRÌNH HƯỚNG THÀNH PHẦN (HTP)

Open Recordset Mở một liên kết đến Data- SourceCn.Open [connect], [userid], [password] OpenSchema Lấy các thông tin về DataBase schema RollbackTrans Huỷ bỏ các thay đổi của transac- tion và kết thúc nó Properties Result - Type Discription Attributes Long Xác định một hay nhiều kiểu đặc biệt của đối tượng connection CommandTimeout Long Khoảng thời gian chờ khi thực thi lệnh ConnectionString String Chứa thông tin dùng để tạo liên kết tới CSDL ConnectionTimeout Long Khoảng thời gian timeout khi chờ thiết lập liên kết CursorLocation CursorLocationEnum String Trả về vị trí của con trỏ hiện hành DefaultDatabase ? CSDL mặc định cho đối tượng Connection IsolationLevel ? Xác định mức độ tách biệt giữa các transaction Mode ModeEnum Xác định các quyền thay đổi dữ liệu trong cầu nối Provider String Xác định tên nhà cung cấp cho đối tượng Connection State Long Cho biết trạng thái của liên kết Version Srting Cho biết phiên bản của ADO Collections Result - Type Discription Errors Errors Chứa các đối tượng Error sinh ra bởi nhà cung cấp Properties Properties Chứa các đối tượng Properties Events Result - Type Discription continued on next page 27

BegỉnTransComplete Xảy ra ngay sau khi thao tác Be- ginTrans hoàn tất CommitTransComplete Xảy ra ngay sau khi thao tác CommitTrans hoàn tất ConnectionComplete Bắt đầu ngay sau khi liên kết hoạt động Disconnect Bắt đầu ngay sau khi liên kết kết thúc ExecuteComplete Xảy ra sau khi lệnh được thực thi xong InfoMessage Xảy ra khi một thao tác Connec- tionEvent thực hiện thành công RollbackTransComplete Bắt đầu sau khi thao tác Roll- backtrans hoàn tất WillConnect Xảy ra trước khi bắt đầu một liên kết WillExecute Xảy ra trước khi thực thi một lệnh trong liên kết Table 1.14 3. Đối tượng Error : Chứa các lỗi khi truy xuất đến CSDL

Methods Result - Type Discription Clear Xoá tất cả các đối tượng Error ra khỏi tập hợp Refresh Cập nhật lại các thông tin về các đối tượng Error Properties Result - Type Discription Description String Chú thích tương ứng cho lỗi HelpContext Integer Xác định ContexID trong file help chứa các lỗi HelpFile String Tên của file Help NativeError Long Mã lỗi đặc biệt của nhà cung cấp Number Long Số ID của đối tượng Error Source String Cho biết tên của đối tượng hay ứng dụng sinh ra lỗi SQLState String Cho biết trạng thái của SQL cho việc xác định đối tượng Error Collections Result - Type Discription Errors Được tạo ra khi ADO sinh ra lỗi Count Long Cho biết số các đối tượng Error Item Error Lập chỉ mục các đối tượng Error để tham khảo sau này Table 1.15 4. Đối tượng Parameter : Tham số hay đối số được dùng trong đối tượng Command khi gọi các hàm lưu trữ dữ liệu (Store Procedure) 28 CHƯƠNG 1. BÀI 1: LẬP TRÌNH HƯỚNG THÀNH PHẦN (HTP)

Methods Result - Type Discription AppendChunk Đưa dữ liệu vào đối tượng Param- eter dạng nhị phân Properties Result – Type Discription Attributes Long Xác định một hay nhiều kiểu đặc biệt cho đối tượng Parameter Direction ParameterDirectionEnum Cho biết khi nào thí đối tượng Parameter là tham số nhập hay xuất, hoặc là trị trả về từ một hàm lưu trữ dữ liệu Name String Tên của đối tượng Parameter NumericScale Byte Cho biết độ dài của số thập phân (xuất ra màn hình) Precision Byte Xác định độ chính xác của số Size Long Định kích thước lớn nhất của đối tượng Parameter Type DataTypeEnum Xác định kiểu dữ liệu của đối tượng Parameter Value Variant Cho biết các giá trị đã gán cho đối tượng Parameter Collections Result - Type Discription Parameters Append Đưa một đối tượng Parameter vào tập Parameters Delete Xoá một đối tượng Parameter trong tập Refresh Cập nhật đối tượng Parameter trong tập Parameters Count Long Số đối tượng Parameter có trong tập continued on next page 29

Item Field Dùng để đánh chỉ số các đối tượng trong tập Parameters Properties Properties Chứa tất cả các đối tượng Prop- erty trong đối tượng Parameter

Table 1.16

5. Đối tượng Property : Xác định các kiểu riêng biệt (tuỳ thuộc kiểu dữ liệu) của một đối tượng ADO

Properties Result - Type Discription Attributes Long Xác định một hay nhiều kiểu đặc biệt cho đối tượng Property Name String Tên của đối tượng Property Type DataTypeEnum Xác định kiểu dữ liệu của đối tượng Property Value Variant Cho biết các giá trị đã gán cho đối tượng Property

Table 1.17

6. Đối tượng Recordset: Lưu toàn bộ tập các recordset từ một bảng hay từ kết quả thực thi câu lệnh SQL

Methods Result - Type Discription AddNew Tạo một RecordSet mới Cancel Huỷ bỏ thao tác đang thực thi CancelBatch Huỷ bỏ các cập nhật bị treo CancelUpdate Huỷ bỏ các thay đổi đối với Recordset hiện hành Clone Tạo một bản sao của đối tượng Recordset Close Recordset Đóng đối tượng Recordset và các đối tượng liên quan CompareBookmarks CompareEnum So sánh 2 chỗ đánh dấu Delete Xoá Record hay một tập records hiện hành Find Tìm một Record GetRows Lấy nhiều Records đưa vào một mảng continued on next page 30 CHƯƠNG 1. BÀI 1: LẬP TRÌNH HƯỚNG THÀNH PHẦN (HTP)

GetString String Trả Recordset về dưới dạng chuỗi Move Di chuyển vị trí của Recordset hiện hành MoveFirst Di chuyển Recordset về vị trí đầu tiên trong bảng MoveLast Di chuyển Recordset về vị trí cuối cùng trong bảng MoveNext Di chuyển Recordset đến vị trí kế tiếp trong bảng MovePrevious Di chuyển Recordset đến vị trí trước đó trong bảng NextRecordSet Recordset Xoá đối tượng Recordset hiện hành và trả về đối tượng Record- set kế tiếp Open Mở một Recordset Requery Cập nhật lại dữ liệu bằng cách chạy lại truy vấn ban đầu Resync Làm tươi lại dữ liệu trong đối tượng Recordset hiện hành Save Lưu Recordset vào File Seek Tìm chỉ mục của Recordset Suports Boolean Xác định xem đối tượng Record- set có hỗ trợ chức năng gì đặc biệt không Update Cập nhật các thay đổi vào đĩa UpdateBatch Cập nhật các khối thay đổi vào đĩa Properties Result - Type Discription AbsolutePage PositionEnum Chỉ rõ trang nào mà record đang ở đó AbsolutePosition PositionEnum Chỉ rõ vị trí của đối tượng Recordset mà chứa record hiện hành continued on next page 31

ActiveCommand Object Xác định đối tượng Command nào mà Recordset đang phụ thuộc ActiveConnection Variant Xác định đối tượng Connec- tion nào mà Recordset đang phụ thuộc BOF Boolean Cho biết con trỏ có ở vị trí trước bản ghi đầu tiên không BookMark Variant Trả về vị trí record đã được đánh dấu CacheSize Long Xác định số record được lưu trong Cache CursorLocation CursorLocationEnum Vị trí của con trỏ CursorType CursorTypeEnum Cho biết kiểu của con trỏ Record- set được dùng DataMember String Tên của thành phần dữ liệu lấy về từ DataSource DataSource Object Chỉ định đối tượng chứa dữ liệu EditMode EditModeEnum Cho biết trạng thái soạn thảo của record hiện hành EOF Boolean Cho biết con trỏ record có đứng ở sau record cuối cùng hay không Filter Variant Xác định bộ lọc dữ liệu trong Recordset Index String Tên của chỉ mục hiện hành LockType LockTypeEnum Kiểu khoá áp đặt lên record hiện hành MarshalOptions MarshalOptionsEnum Xác định các records sẽ được đưa về Server MaxRecords Long Số records tối đa trả về trong đối tượng Recordset khi dùng truy vấn continued on next page 32 CHƯƠNG 1. BÀI 1: LẬP TRÌNH HƯỚNG THÀNH PHẦN (HTP)

PageCount Long Cho biết số trang dữ liệu chứa trong đối tượng Recordset PageSize Long Xác định số records trong một trang RecordCount Long Cho biết số record hiện hành trong đối tượng Sort String Xác định một hay nhiều Field trong Recordset sẽ được sắp xếp Source String Xác định nguồn dữ liệu trong đối tượng Recordset State Long Cho biết trạng thái của Record- set hiện hành Status Integer Cho biết trạng thái của Record- set hiện hành StayInSync Boolean Xác định trong hệ phân cấp: record cha có thay đổi hay không khi các record con thay đổi Collections Result - Type Discription Fields Fields Chứa tất cả các đối tượng Field Properties Properties Chứa tất cả các đối tượng Prop- erties Events Result - Type Discription EndOfRecordset Xảy ra khi cố di chuyển đến dòng cuối của Recordset FetchComplete Xảy ra khi tất cả các record đều được đưa vào Recordset FetchProgress Cho biết bao nhiêu hàng đang được lấy về từ lúc này FieldChangeComplete Xảy ra khi giá trị của một hay nhiều đối tượng field bị thay đổi MoveComplete Xảy ra khi vị trí hiện hành của Recordset thay đổi xong continued on next page 33

RecordChangeComplete Xảy ra khi 1 hay nhiều record bị thay đổi RecordsetChangeComplete Xảy ra khi Recordset bị thay đổi WillChangeField Xảy ra trước khi thay đổi trị của một hay nhiều đối tượng Fields WillChangeRecord Xảy ra trước khi thay đổi hàng trong Recordset WillChangeRecordset Xảy ra trước khi thay đổi Record- Set WillMove Xảy ra trước khi di chuyển vị trí Recordsaet

Table 1.18

7. Đối tượng Field : Trường dữ liệu trong một kiểu dữ liệu bảng, SQL

Methods Result - Type Discription AppendChunk GetChunk Variant Properties Result - Type Discription ActualSize Long Cho biết độ dài thực tế của giá trị Field Attributes Long Cho biết một hay nhiều thuộc tính của Field DataFormat Variant Cho biết định dạng dữ liệu trong Field DefinedSize Long Cho biết độ lớn của đối tượng Field Name String Xác định tên của đối tượng Field NumerricScale Byte Xác định độ dài của các trị trong đối tượng Field OriginalValue Variant Cho giá trị nguyên thuỷ của đối tượng Field trước khi bị thay đổi Precision Byte Xác định độ chính xác của số Type DataTypeEnum Xác định kiểu dữ liệu của đối tượng Field UnderlyingValue Variant Cho biết giá trị hiện thời của đối tượng Field trong CSDL Value Variant Cho biết các giá trị đã gán cho đối tượng Field Collections Result - Type Discription Properties Properties Chứa các đối tượng Properties Fields Append Đưa một đối tượng Field vào tập hợp Fields Delete Xoá một đối tượng Field trong tập hợp Fields Refresh Cập nhật một đối tượng Field trong tập hợp Fields Count Số đối tượng Fields có trong tập hợp Item Dùng để đánh chỉ số các đối tượng Field trong tập hợp Fields

Table 1.19 34 CHƯƠNG 1. BÀI 1: LẬP TRÌNH HƯỚNG THÀNH PHẦN (HTP)

Cài đặt và thiết lập tham, chiếu đến ADO + Chỉ sử dụng đối tượng truy cập bởi ADO - Trong đề án Visual Basic, chọn Project, Reference - Chọn hộp đánh dấu "Microsoft ActiveX Data Object 2.0 Library" - Chọn OK + Kết hợp với các thư viện đối tượng khác Nếu như bạn tạo ứng dụng có sử dụng nhiều thư viện đối tượng truy cập dữ liệu cùng lúc như ADO kết hợp với DAO, lúc đó cần phải phân biệt rõ đối tượng RecordSet của DAO hay của ADO. Giải pháp rằng bạn thực hiện khai báo tường minh cho các đối tượng dùng tên lớp đầy đủ Ví dụ: ADODB.RecordSet, DAO.RecordSet ...., hoặc bạn thiết lập một thứ tự ưu tiên như sau: Ví dụ để cung cấp thứ tự ưu tiên cho DAO mức ưu tiên cao hơn ADO ta làm như sau: - Trong đề án Visual Basic, chọn Project, Reference - Chọn hộp đánh dấu tham chiếu "Microsoft DAO 3.51 Object Library" và "Microsoft ActiveX Data Object 2.0 Library" - Chọn OK (Giải pháp tốt nhất là chỉ ra tên lớp đầy đủ.) Dùng đối tượng connection của ado để kết nối nguồn dữ liệu Chỉ ra trình cung cấp OLE DB và kết nối bằng thuộc tính ConnectionString Tuỳ thuộc vào trình cung cấp mà ta có chuỗi kết nối khác nhau. Mở kết nối bằng phuơng thức Open của đối tượng ADODB.Connection Ví dụ: Public ado as ADODB.Connection Private sub mbado() Set ado = New ADODB.Connection Dim Str as String Str="Provider=SQLOLEDB.1;Password=vinhhue; User ID=hue;Initial Catalog=QLBH;Data Source=huecm-kcntt" ado.ConnectionString = Srt ado.Open End Sub Mở và đóng kết nối đến nguồn dữ liệu Dùng phương thức Connection.Open để mở kết nối đến nguồn dữ liệu. Cn.Open [connect], [userid], [password] - Toàn bộ các tham số đều là tuỳ chọn, nếu ta không cung cấp các tham số đến phương thức Open, ta có thể cung cấp bởi phương thức ConnectString, hiệu quả như nhau. Dim Cn As Connection Set Cn= New Connection Cn.Open "DN= JetNovelty" - Khi đã hoàn tất với đối tượng Connection của ADO, ta nên luôn luôn đóng nó bằng Close Cn. Close Dùng đối tượng recordset của ADO để thao tác với dữ liệu - Đối tượng ReccorddSet của ADO tương tự như ReccorddSet của DAO và RDO: - Cách tạo đối tượng ReccorddSet của ADO tương tự như RDO chỉ thay đổi là ADO không đòi hỏi đối tượng Connection ngầm. Ví dụ: (Các thao tác của con trỏ ReccorddSet trên ADO tương tự như ReccorddSet trên DAO) Thêm mẩu tin mới + Mở ReccorddSet + Thi hành phương thức AddNew + Gán giá trị mới cho các trường trong đối tượng ReccorddSet + Lưu mẩu tin bằng thi hành phương thức Update 35

+ Đóng ReccorddSet Sửa mẩu tin + Mở ReccorddSet + Khác với Dao đối tượng ADO không có phương thức Edit + Gán giá trị mới cho các trường trong đối tượng ReccorddSet + Lưu mẩu tin bằng thi hành phương thức Update + Đóng ReccorddSet c. Dùng đối tượng Field của ADO để truy cập dữ liệu trong RecordSet VD: Private Sub Form_Load() Set con = New ADODB.Connection con.ConnectionString = "Provider=SQLOLEDB.1;Password=vinhhue; User ID=hue;Initial Cata- log=QLBH;Data Source=huecm-kcntt" con.Open End Sub —————————- Public Sub laydulieu() Dim rs As ADODB.Recordset Set rs = New ADODB.Recordset rs.Source = "Select * from loai" rs.ActiveConnection = con rs.Open Do While Not rs.EOF cbodanhmuc.AddItem rs.Fields(1) ‘cbodanhmuc.AddItem rs!tenloai rs.MoveNext Loop End Sub ————————- Private Sub Form_Unload(Cancel As Integer) con.Close Set rs = Nothing End Sub Làm việc với con trỏ ADO hỗ trợ một số kiểu con trỏ. Ngoài việc cung cấp hỗ trợ duyệt qua từng mẩu tin tại một thời điểm, các kiểu con trỏ khác nhau cho phép ta điều khiển cách quản lý của một Recordset. Quy định vị trí của con trỏ bằng cách gán giá trị cho thuộc tính Recordset. Các kiểu con trỏ của đối tượng connection

Kiểu con trỏ Hằng Mô tả Phía Client adUseClient Tạo con trỏ phía Client Phía Server adUseServer Tạo con trỏ phía Server

Table 1.20

Chọn con trỏ Client nghĩa là ADO và OLEDB xử lý các hoạt động của con trỏ. Con trỏ kiểu Client không có sẵn trên Server. Trong ADO ta có thể tạo một Recordset không kết nối, co phép ta thao tác với các mẩu tin mà không có kết nối thường xuyên đến Server. Khả năng này là một chức năng của thư viện con trỏ phía Client. 36 CHƯƠNG 1. BÀI 1: LẬP TRÌNH HƯỚNG THÀNH PHẦN (HTP)

Trong ADO, thuộc tính CurorLocation áp dụng cho cả đối tượng Recordset và connection. Nếu ta gán thuộc tính CurorLocation của đối tượng conection, tất cả Recordset mà ta tạo từ kết nối đó đều có cùng vị trí con trỏ như đối tượng Connection Ngoài việc chỉ ra vị trí con trỏ, ta có 4 khả năng tạo 4 kiểu con trỏ khác nhau trong ADO. Việc chọn lựa chọn con trỏ tuỳ theo sự cân đối giữa chức năng và khả năng hoạt động. Chỉ ra kiểu con trỏ bằng cách gán thuộc tính CursorType của đối tượng Recordset. Đây là các kiểu con trỏ có thể tạo trong ADO

Kiểu con trỏ Hằng Mô tả Forward-Only adOpenForwardOnly Không dùng con trỏ - ta chỉ có thể chuyển về phía trước trong Recordset, sử dụng phương thức MovePrevious và MoveFirst sẽ sinh lỗi Keyset(trong DAO được gọi là adOpenKeyset Ta không thể thấy các mẩu tin Dynaset) mới do người sử dụng khác thêm và, nhưng khi họ sửa đổi, hay xoá mẩu tin sẽ ảnh hưởng đến Recordset ta đang làm việc; đây là kiểu con trỏ hiệu quả nhất, đặc biệt là khi Recordset khá lớn Dynamic adOpenDynamic Ta có thể thấy toàn bộ thay đổi trên dữ liệu do người sử dụng khác thực hiện trong khi ta đang mở Recordset; đây là kiểu con trỏ ít hiệu quả nhất, nhưng mạnh mẽ Static (trong DAO gọi là snap- adOpenStatic Bản sao của toàn bộ dữ liệu của short) một Recordset; kiểu này đặc biệt hữu dụng khi ta đang tìm kiếm dữ liệu hay ta đang thi hành báo cáo; kiểu con trỏ này rất hữu dụng cho những Recordset nhỏ.

Table 1.21

Dĩ nhiên lý do để chọn con trỏ Forward-Only thay vì các kiểu con trỏ khác là khả năng hoạt động của nó, nếu ta chỉ hiển thị dữ liệu chứa trong cơ sở dữ liệu - con trỏ kiểu Forward-only sẽ làm khả năng hoạt động của ứng dụng trở nên hiệu quả hơn. Chú ý: Nếu trình cung cấp dữ liệu không thể tạo ra kiểu con trỏ mà ta yêu cầu, nó sẽ tạo ra kiểu con trỏ mà nó có thể. Nó sẽ không báo lỗi trừ khi ta cố thi hành một tác vụ nào đó vốn bị cấm đối với kiểu con trỏ này. =∼ Xác định con trỏ và các tính năng khác được hỗ trợ bởi một trình cung cấp OLE DB và ADO được thiết kế để cho phép truy cập đến nguồn dữ liệu, ứng dụng cần xác định các tính năng do một trình cung cấp dữ liệu hỗ trợ, có thể là trong khi một hệ cơ sở dữ liệu quan hệ cho phép tạo một con trỏ Forward-only ở phía Server, hệ cơ sở dữ liệu trên máy cá nhân hoặc cơ sở dữ liệu dựa trên tập tin có thể không có tính năng này. Phương thức Supports của đối tượng ADO Recordset xác định kiểu con trỏ do trình cung cấp dữ liệu cung cấp dữ liệu hỗ trợ. Bảng sau đây liệt kê các giá trị truyền vào phương thức Supports để xác định tính năng được hỗ trợ bởi đối tượng recordset. 37

Hằng Mô tả adAddNew Thêm mẩu tin mới voà Recordset AdapproxPosition Thuộc tính AbsolutePage và AbsolutePosition có sẵn; chúng được dùng để kết hợp thuộc tính Page- Size và PageCount của đối tượng Recordset để cho phép xác định trang chứa mâủ tin hiện hành. adBookmark Có thể quy định đánh dấu trang sách trong Recordser adDelete Mẩu tin được xoá trong recordset adHoldRecords Mẩu tin được trả về từ cơ sở dữ liệu mà không càn ghi các sửa đổi hiện có vào Server adMovePrevious Có thể cuộn tới lui trong Recordset adResync Phương thức Resync có sẵn adUpdate Recordset cập nhật được adUpdateBath Recordset có thể cập nhật được hàng loạt với phương thức UpdateBath. Ta có thể nạp các sửa đổi trên nhiều mẩu tin. Trong một hoạt động duy nhất, cải tiến hiệu quả Client / Server

Table 1.22 38 CHƯƠNG 1. BÀI 1: LẬP TRÌNH HƯỚNG THÀNH PHẦN (HTP) Chương 2

Bài 2: Lập trình đa tầng

2.1 Giới thiệu1

Trong phát triển ứng dụng, để dễ quản lý các thành phần của hệ thống, cũng như không bị ảnh hưởng bởi các thay đổi, người ta hay nhóm các thành phần có cùng chức năng lại với nhau và phân chia trách nhiệm cho từng nhóm để công việc không bị chồng chéo và ảnh hưởng lẫn nhau. Ví dụ: trong một công ty bạn có từng phòng ban, mỗi phòng ban sẽ chịu trách nhiệm một công việc cụ thể nào đó, phòng này không được can thiệp vào công việc nội bộ của phòng kia như. Trong phát triển phần mềm, người ta cũng áp dụng cách phân chia chức năng này. Bạn sẽ nghe nói đến thuật ngữ kiến trúc đa tầng/nhiều lớp, người ta phân chia chương trình ra thành nhiều tầng (lớp), Mỗi tầng (lớp) đảm trách 1 nhiệm vụ nhất định. Đây gọi là kiến trúc đa tầng. Mô hình quen thuộc nhất là mô hình 3 tầng. Chú ý: Các bạn không nên nhầm lẫn khái niệm lớp/tầng(layer) trong phần này với khái niệm lớp(class) của các ngôn ngữ lập trình hướng đối tượng. Lợi ích của mô hình đa tầng:

• Các tầng ít có sự phụ thuộc vào nhau, dễ dàng chỉnh sửa & thay đổi. 1 thay đổi về database chỉ cần viết lại code cho tầng dữ liệu mà ko đụng chạm vào các tầng khác. Hoặc muốn design lại form thì chỉ cần chỉnh tầng giao diện, các tầng khác ko ảnh hưởng. • Việc xây dựng chương trình sẽ nhanh chóng & dễ dàng hơn. Chẳng hạn 2 lập trình viên A & B cùng hợp tác viết chương trình. A được phân công ngồi design các form cho thật đẹp. Điều gì xảy ra nếu lập trình theo mô hình 1 tầng?! B sẽ phải ngồi chờ A thiết kế xong rồi mới tới lượt mình viết code. Theo kiến trúc đa tầng do các tầng có rất ít sự phụ thuộc lẫn nhau nên 2 nguời có thể ngồi làm độc lập, song song với nhau, cuối cùng sẽ ráp lại.

Dễ dàng tái sử dụng lại các tầng đã viết. Như thí dụ trên tầng dữ liệu có chứa các phương thức thêm mới/lấy thông tin thực thể mặt hàng trong database. Giả sử sau này có viết 1 chương trình quản lý nào đó mà cũng có chức năng cần thêm/lấy thông tin thực thể mặt hàng trong database (mà thực thể mặt hàng này cũng chỉ có các trường như mã hàng, tên hàng, giá bán, nói chung là cấu trúc y xì cái mặt hàng ở chương trình cũ), thì lấy tầng dữ liệu của cái cũ đắp qua cho xong.

2.2 Kiến trúc đa tầng2

Mỗi tầng trong kiến trúc đa tầng thực hiện một chức năng nhất định, ở đây chúng ta sẽ xét cụ thể chức năng của các lớp trong mô hình 3 lớp.

1This content is available online at . 2This content is available online at .

39 40 CHƯƠNG 2. BÀI 2: LẬP TRÌNH ĐA TẦNG

Figure 2.1: Mô hình 3 lớp

Theo mô hình 3 lớp, ứng dụng sẽ được chia làm 3 lớp đó là: Presentation, Business Logic, và Data Access. Presentation Layer: Lớp này làm nhiệm vụ giao tiếp với người dùng cuối để thu thập dữ liệu và hiển thị kết quả/dữ liệu thông qua các thành phần trong giao diện người sử dụng. Lớp này sẽ sử dụng các dịch vụ do lớp Business Logic cung cấp. Trong .NET thì bạn có thể dùng Windows Forms, ASP.NET hay Mobile Forms để hiện thực lớp này. Trong lớp này có 2 thành phần chính là User Interface Components và User Interface Process Components.

• UI Components là những phần tử chịu trách nhiệm thu thập và hiển thị thông tin cho người dùng cuối. Trong ASP.NET thì những thành phần này có thể là các TextBox, các Button, DataGrid... • UI Process Components: là thành phần chịu trách nhiệm quản lý các qui trình chuyển đổi giữa các UI Components. Ví dụ chịu trách nhiệm quản lý các màn hình nhập dữ liệu trong một loạt các thao tác định trước như các bước trong một Wizard...

Chú ý : lớp này không nên sử dụng trực tiếp các dịch vụ của lớp Data Access mà nên sử dụng thông qua các dịch vụ của lớp Business Logic vì khi bạn sử dụng trực tiếp như vậy, bạn có thể bỏ qua các ràng buộc, 41 các logic nghiệp vụ mà ứng dụng cần phải có. Business Logic Layer Lớp này thực hiện các nghiệp vụ chính của hệ thống, sử dụng các dịch vụ do lớp Data Access cung cấp, và cung cấp các dịch vụ cho lớp Presentation. Lớp này cũng có thể sử dụng các dịch vụ của các nhà cung cấp thứ 3 (3rd parties) để thực hiện công việc của mình(ví dụ như sử dụng dịch vụ của các cổng thanh tóan trực tuyến như VeriSign, Paypal...). Trong lớp này có các thành phần chính là Business Components, Business Entities và Service Interface.

• Service Interface là giao diện lập trình mà lớp này cung cấp cho lớp Presentation sử dụng. Lớp Presen- tation chỉ cần biết các dịch vụ thông qua giao diện này mà không cần phải quan tâm đến bên trong lớp này được hiện thực như thế nào. • Business Entities là những thực thể mô tả những đối tượng thông tin mà hệ thống xử lý. Trong ứng dụng chúng ta các đối tượng này là các chuyên mục(Category) và bản tin(News). Các business entities này cũng được dùng để trao đổi thông tin giữa lớp Presentation và lớp Data Access. • Business Components là những thành phần chính thực hiện các dịch vụ mà Service Interface cung cấp, chịu trách nhiệm kiểm tra các ràng buộc logic(constraints), các qui tắc nghiệp vụ(business rules), sử dụng các dịch vụ bên ngoài khác để thực hiện các yêu cầu của ứng dụng.

Trong ứng dụng của chúng ta, lớp này sẽ chứa các thành phần là CategoryService và NewsService làm nhiệm vụ cung cấp các dịch vụ quản lý chuyên mục và các bản tin (thêm, xóa, sửa, xem chi tiết, lấy danh sách...). Data Access Layer Lớp này thực hiện các nghiệp vụ liên quan đến lưu trữ và truy xuất dữ liệu của ứng dụng. Thường lớp này sẽ sử dụng các dịch vụ của các hệ quản trị cơ sở dữ liệu như SQL Server, Oracle,... để thực hiện nhiệm vụ của mình. Trong lớp này có các thành phần chính là Data Access Logic, Data Sources, Servive Agents).

• Data Access Logic components (DALC) là thành phần chính chịu trách nhiệm lưu trữ vào và truy xuất dữ liệu từ các nguồn dữ liệu - Data Sources như RDMBS, XML, File systems.... Trong .NET Các DALC này thường được hiện thực bằng cách sử dụng thư viện ADO.NET để giao tiếp với các hệ cơ sở dữ liệu hoặc sử dụng các O/R Mapping Frameworks để thực hiện việc ánh xạ các đối tượng trong bộ nhớ thành dữ liệu lưu trữ trong CSDL. Chúng ta sẽ tìm hiểu các thư viện O/R Mapping này trong một bài viết khác.

Service Agents là những thành phần trợ giúp việc truy xuất các dịch vụ bên ngòai một cách dễ dàng và đơn giản như truy xuất các dịch vụ nội tại.

2.3 Phát triển ứng dụng đa tầng3

Chúng ta đã tìm hiểu qua các lớp của mô hình đa tầng (cụ thể là 3 tầng – 3 lớp). Bây giờ chúng ta thử tìm hiểu một qui trình cụ thể hơn để biết các lớp này giao tiếp với nhau như thế nào. Ví dụ trong ứng dụng của chúng ta có thao tác tạo một chuyên mục mới, thì các lớp sẽ ltương tác với nhau như sau:

2.3.1 Lớp Presentation: • Trình bày một web form, có các text box cho phép người sử dụng nhập tên và mô tả cho chuyên mục. • Khi người dùng nhấn nút tạo trên form này, ứng dụng sẽ thực hiện việc tạo một Business Entity Category mới như đoạn code sau minh họa: public void CreateNewCategory() { Category category = new Category(); category.Name = name.Text;

3This content is available online at . 42 CHƯƠNG 2. BÀI 2: LẬP TRÌNH ĐA TẦNG

category.Description = description.Text; // sử dụng dịch vụ do lớp Business cung cấp để tạo chuyên mục CategoryService.CreateCategory(category); }

2.3.2 Lớp Business Logic • Để cung cấp dịch vụ tạo một chuyên mục, thành phần CategoryService sẽ cung cấp hàm sau:

public static void CreateCategory(Category category) { // kiểm tra xem tên khóa của chuyên mục đã tồn tại chưa? ... // kiểm tra tên khóa của chuyên mục có hợp lệ không? ... // sử dụng DV của lớp Data Access để lưu chuyên mục mới này vào CSDL CategoryDAO categoryDAO = new CategoryDAO(); categoryDAO.CreateCategory(category); }

2.3.3 Lớp Data Access • Tương tự, để cung cấp dịch vụ lưu một chuyên mục mới vào CSDL, thành phần CategoryDAO sẽ cung cấp hàm sau (sử dụng ADO.NET để kết nối với CSDL):

public void CreateCategory(Category category) { // tạo connection ... // tạo command, khởi tạo các tham số... command.Parameters.Add(new SqlParameter("@KeyName", category.KeyName)); command.Parameters.Add(new SqlParameter("@Name", category.Name)); command.Parameters.Add(new SqlParameter("@Description", category.Description)); // lưu dữ liệu command.ExecuteNonQuery(); } Phân tích và thiết kế: Ứng dụng của chúng ta sẽ viết bằng ASP.NET 2.0 và SQL Server 2000/2005. Ngôn ngữ được dùng là C#. Trong ứng dụng tin tức mà chúng ta đã tìm hiểu yêu cầu qua bài viết trước, chúng ta thấy có hai đối tượng thông tin chính mà chúng ta cần quản lý là các chuyên mục(category) và tin tức(news). Ứng dụng quản lý của chúng ta sẽ thu thập những đối tượng dữ liệu này từ người dùng(phóng viên, biên tập viên) và trình bày lại cho người sử dụng khác xem(độc giả). Giờ chúng ta bắt tay vào thiết kế các thành phần Business Entities. Business Entities: Ứng dụng của chúng ta sẽ bao gồm 2 entity chính là Category và News. Category: Một chuyên mục (Category) sẽ gồm những thông tin sau:

• CategoryId: Mã chuyên mục - sẽ được sinh tự động khi tạo mới • Name: Tên chuyên mục. VD: Vi tính, Kinh tế... • KeyName: Tên gợi nhớ dùng để phân biệt chuyên mục với nhau (không được trùng nhau). • Description: Mô tả cho chuyên mục. • Picture: Hình ảnh đại diện cho chuyên mục 43

Trong ứng dụng đơn giản này, chúng ta chỉ thiết kế chuyên mục có một cấp, không có các chuyên mục con, cháu... Và ứng dụng này cũng không có phần quản lý các nhà biên tập viên, nhà báo và cơ chế cấp quyền hạn duyệt bài, gửi bài... News. Mỗi một bản tin sẽ có các thông tin sau:

• NewsId: mã bản tin. Sẽ được sinh tự động khi tạo mới. • Title: tiêu đề chính của bản tin. • Subtitle: tiêu đề phụ của bản tin. • Excerpt: phần giới thiệu ngắn gọn của bản tin • Authors: danh sách tác giả bản tin. VD: Nguyễn Văn A, Hoàng Thị B • Keywords: danh sách từ khóa chính trong bản tin dùng để tìm kiếm. VD: Microsoft, broken • Body: Đây là phần nội dung chính của bản tin. • Picture: Hình ảnh minh họa cho bản tin. • CreationTime: Ngày giờ tạo bản tin • LastModificationTime: Ngày giờ chỉnh sửa cuối cùng của bản tin • PublishedTime: Ngày giờ bản tin được đăng • TotalViews: Tổng số lượt người xem bản tin • TotalRates: Tổng số lượt người đánh giá bản tin • Rate: Điểm đánh giá trung bình của bản tin • Status: Trạng thái hiện tại của bản tin. Có thể là Writting(Đang viết), Approving(Đang chờ duyệt), Published(Đã được đăng)

Business Service Components: Bước tiếp theo chúng ta sẽ phân tích và thiết kế các Business Service Com- ponents. Các thành phần này sẽ làm nhiệm vụ chính cung cấp các dịch vụ cho lớp Presentation dùng để lấy và lưu trữ thông tin. Lớp CategoryService: Chúng ta cần những thao tách chính trên đối tượng dữ liệu Category:

• Tạo mới - CreateCategory(Category category) • Cập nhật - UpdateCategory(Category category) • Xóa - DeleteCategory(int categoryId) • Lấy thông tin chi tiết - GetCategory(int categoryId) • Lấy danh sách các category - GetCategories() • Kiểm tra một Key xem có trong database chưa - CheckKey(string keyName). Thao tác này dùng để kiểm tra xem khi tạo mới một category thì KeyName đã tồn tại trong hệ thống chưa. Thao tác này có thể dùng trên lớp Presentation để kiểm tra và thông báo lỗi cho người dùng khi họ nhập một tên khóa đã có trong hệ thống

Lớp NewsService, dựa trên những gì yêu cầu chúng ta phân tích ở bài viết đầu tiên, chúng ta cần những thao tác chính sau đây trên đối tượng News:

• Tạo mới - CreateNews(News news) • Cập nhật - UpdateNews(News news) • Xóa - DeleteNews(int newsId) • Lấy thông tin chi tiết - GetNews(int newsId) • Lấy danh sách các bản tin thuộc một chuyên mục nào đó, sắp xếp theo tin mới nhất - GetNewsOfCat- egory(int categoryId, int page, int pageSize, out int totalRecords) • Cập nhật số lần xem của một bản tin - UpdateTotalViews(int newsId) • Cập nhật đánh giá cho một bản tin - UpdateRate(int newsId, int rate) • Tìm bài viết dựa trên từ khóa - SearchNews(string keyWords, int page, int pageSize, out int total- Records)

Trong các hàm trên, các bạn chú ý đến hàm GetNewsOfCategory. Trong hàm này có các tham số dùng để phân trang các bản tin. Chúng ta cần đến chức năng này vì khi trình bày trên trang tin, chúng ta chỉ trình 44 CHƯƠNG 2. BÀI 2: LẬP TRÌNH ĐA TẦNG bày một số lượng có hạn các bản tin của một chuyên mục nào đó chứ không thể trình bày tất cả trên màn hình được. Khi người dùng muốn xem thêm, họ có thể chọn trang tiếp theo hoặc nhấp vào link Xem tiếp, lúc đó ứng dụng sẽ trình bày các bản tin ở các trang tiếp theo. Tham số totalRecords cho chúng ta biết được tổng số bản tin thật sự có trong chuyên mục đó. Data Access Components Bây giờ chúng ta sẽ thiết kế các lớp dùng để truy xuất và cập nhật dữ liệu. Các hàm của các lớp DAO cũng khá đơn giản, chỉ làm nhiệm vụ cập nhật dữ liệu vào database và truy xuất dữ liệu từ database. Các bạn cũng thấy chức năng nó giống như trên lớp Business Logic, nhưng ở đây chúng ta không có bất kỳ ràng buộc logic gì, chỉ đơn giản thực hiện việc truy xuất dữ liệu mà thôi. Các business logic đã được kiểm tra trên lớp Business Logic. Hiện thực lớp Business Logic & Data Access Sau khi đã xong bước thiết kế, chúng ta sẽ tiến hành hiện thực 2 lớp Business và Data Access. Các bạn có thể xem source code đính kèm để biết chi tiết cách hiện thực 2 lớp này như thế nào. Lớp Presentation sẽ được thiết kế và hiện thực trong bài viết tiếp theo. Hiện thực Data Access Components Do ứng dụng của chúng ta đơn giản nên được giới hạn sẽ dùng với CSDL SQL Server 2000/2005 nên lớp này không được thiết kế để chạy cùng lúc với nhiều loại database khác nhau. Chúng ta sẽ dùng cái Stored Procedures để truy xuất dữ liệu an toàn và dễ thay đổi hơn, tránh bị các lỗi như SQL Injection(không thể tránh hoàn toàn nếu bạn không hiện thực đúng). Các bạn có thể xem qua một cách hiện thực một hàm cơ bản như thế nào: public void CreateCategory(Category category) { using (SqlConnection connection = GetConnection()) { SqlCommand command = new SqlCommand("spCategoriesCreate", connection); command.CommandType = CommandType.StoredProcedure; command.Parameters.Add(new SqlParameter("@KeyName", category.KeyName)); command.Parameters.Add(new SqlParameter("@Name", category.Name)); command.Parameters.Add(new SqlParameter("@Description", category.Description)); command.Parameters.Add(new SqlParameter("@Picture", category.Picture)); SqlParameter paramCategoryId = new SqlParameter("@CategoryId", SqlDbType.Int, 4); paramCategoryId.Direction = ParameterDirection.Output; command.Parameters.Add(paramCategoryId); connection.Open(); command.ExecuteNonQuery(); if (paramCategoryId.Value != DBNull.Value) category.CategoryId = (int)paramCategoryId.Value; else throw new DataAccessException(String.Format(Resources.Strings.CreateEntityException, "Category")); } } Stored Procedure spCategoriesCreate đơn giản được viết như sau: CREATE PROCEDURE dbo.spCategoriesCreate @Name nvarchar(50), @KeyName varchar(30), @Description ntext, @Picture varchar(256), @CategoryId int output AS INSERT INTO Categories ( 45

Name, KeyName, Description, Picture ) VALUES ( @Name, @KeyName, @Description, @Picture ) SELECT @CategoryId = SCOPE_IDENTITY() Hiện thực lớp Business Logic Hiện thực lớp Business Logic đòi hỏi bạn phải nắm rõ các business logic của ứng dụng. Ví dụ đối với ứng dụng tin tức của chúng ta thì khi tạo một chuyên mục mới, bạn phải kiểm tra xem KeyName của chuyên mục đó đã có trong hệ thống chưa? Nếu có rồi thì phải báo lỗi, và nếu chưa có thì chúng ta kiểm tra KeyName đó có hợp lệ hay không? (Chỉ chứa kí tự alphabet, chữ số, gạch dưới và gạch ngang...). public static void CreateCategory(Category category) { // Has this key name existed? if (!CheckKey(category.KeyName)) throw new BusinessException(String.Format(Resources.Strings.KeyNameExisted, category.KeyName)); // is this key name valid? if (!ValidateKey(category.KeyName)) throw new BusinessException(String.Format(Resources.Strings.InvalidKeyName, category.KeyName)); // ok , now save it to database CategoryDAO categoryDAO = new CategoryDAO(); categoryDAO.CreateCategory(category); } 46 CHƯƠNG 2. BÀI 2: LẬP TRÌNH ĐA TẦNG Chương 3

Bài 3: Lập trình mạng

3.1 Lập trình mạng1

Lập trình mạng là một trong những nhiệm vụ căn bản để phát triển các ứng dụng doanh nghiệp. Một chương trình mạng được viết ra để các chương trình trên các máy tính khác nhau có thể truyền tin với nhau một cách hiệu quả và an toàn cho dù chúng được cài đặt trên mạng LAN, WAN hay mạng toàn cầu Internet, đây là điều căn bản đối với sự thành công của nhiều hệ thống.

3.1.1 Lập trình mạng trong .NET Mạng cục bộ LAN(Local Area Network) là mạng được thiết lập để liên kết các máy tính trong một khu vực như trong một tòa nhà, một khu nhà Microsoft .NET Framework bao gồm một tập các lớp dùng để lập trình mạng thuộc hai không gian tên: System.Net và System.Net.Sockets. Các lớp này hỗ trợ mọi thứ, từ lập trình dựa trên-socket với TCP/IP cho đến download file và trang HTML từ web thông qua HTTP. Hai không gian tên này cung là nền tảng cho hai nền networking cấp cao hơn - Remoting và dịch vụ Web XML.

3.1.1.1 Giới thiệu về Socket SocKet là một giao diện lập trình (API – Application Program Interface) ứng dụng mạng thông qua giao diện này có thể lập trình điều khiển việc truyền thông giữa 2 máy sử dụng các giao thức mức thấp như TCP,UDP... , Socket là một sự trừu tượng hóa ở mức cao, có thể tưởng tượng nó như một thiết bị truyền thông 2 chiều tương tự như tệp tin, chúng ta gửi/nhận dữ liệu giữa 2 máy, tương tự như việc đọc ghi trên tệp tin Để liên lạc thông qua socket, ta cần tiến hành các thao tác sau: - Tạo hay mở một socket + Gắn một socket với một địa chỉ, địa chỉ này chính là địa chỉ của máy cần liên lạc. + Thực hiện việc liên lạc tuỳ thuộc vào chế độ kết nối: * Liên lạc theo chế độ không kết nối (UDP): Hai tiến trình liên lạc với nhau không kết nối trực tiếp, mỗi thông điệp gửi đi phải kèm theo địa chỉ người nhận, Hình thức liên lạc này có đặc điểm:

• Người gửi không chắc chắn thông điệp của họ có đến tay người nhận hay không? • Một thông điệp có thể gửi nhiều lần.

1This content is available online at .

47 48 CHƯƠNG 3. BÀI 3: LẬP TRÌNH MẠNG

• Thông điệp gửi sau có thể đến đích trước thông điệp gửi trước đó.

* Liên lạc trong chế độ kết nối (TCP): Có một đường kết nối ảo được thành lập giữa 2 tiến trình, truớc khi một kết nối được thành lập thì một trong 2 tiến trình đó phải đợi tiến trình kia yêu cầu kết nối, có thể sử dụng theo mô hình kết nối Client/Server. Trong đó mô hình server sử dụng lời kêu gọi listen và accept để lắng nghe và chấp nhận một yêu cầu kết nối. Trong phần này chúng ta học cách thao tác kết nối socket bằng .NET Compact Framework.

3.1.1.2 Lập trình Socket với .NET Compact Framework Lớp System.Net.Sockets.Socket. Thủ tục để nhận một lớp Socket kết nối với máy ở xa phụ thuộc vào máy tính đó, tuy nhiên quá trình xử lý để đọc và ghi dữ liệu là giống nhau. Để sử dụng các lớp xử lý mạng trong .NET Compact Framework, chúng ta phải khai báo không gian tên System.Net. Ví dụ: using System.Net. Tạo kết nối từ máy khách tới máy chủ (client) Để tạo một kết nối thành công, trước tiên chúng ta phải tìm hiểu lớp System.Net.EndPoint. Để lưu giữ thông tin về điểm cuối nơi mà kết nối đến: địa chỉ IP của máy chủ và số hiệu cổng mong muốn. Để thiết lập đúng điểm cuối và sử dụng nó để kết nối socket tới máy chủ, chúng ta làm theo các bước sau: Bước 1: Khai báo biến điểm cuối (EndPoint) và biến Socket. Bước 2: Điểm cuối gồm thông tin địa chỉ và số hiệu cổng. Có hai cách để làm điều này, phụ thuộc vào địa chỉ của máy chủ, giống như là: 192.168.4.3, hoặc tên DSN của máy chủ, như là www.mycomputer.net2 . Tìm địa chỉ IP của một máy chủ: Nếu chúng ta biết địa chỉ IP của máy chủ, sử dụng IPAddress trong cấu trúc. Ví dụ sau mô tả khởi tạo một điểm cuối, máy chủ có địa chỉ IP là 192.168.4.3, và cổng 2000: EndPoint l_EndPoint = new IPEndPoint( IPAddress.Parse("192.168.4.3"), Convert.ToInt16(2000)); Nếu chúng ta không biết địa chỉ IP, chúng ta phải dùng DSN để tìm địa chỉ IP của máy chủ thông qua tên. DSN tìm kiếm trả lại địa chỉ IP tương ứng với tên. Đoạn mã sau là một trường hợp: IPHostEntry l_IPHostEntry = Dns.Resolve("www.mycomputer.net"); EndPoint l_EndPoint = new IPEndpoint(l_IPHostEntry.AddressList[0], 9981); Bước 3: Sử dụng điểm cuối (EndPoint) để thử kết nối socket tới máy chủ. Chúng ta phải sử dụng mệnh đề try/catch ở đây, bởi vì thử kết nối sẽ đưa ra một ngoại lệ nếu có vấn đề, như máy chủ từ chối không chấp nhận kết nối hoặc máy chủ không tồn tại,... Ví dụ sau mô tả ba bước ở trên: try { Socketl_Socket =new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); l_Socket.Connect(l_EndPoint); if (l_Socket.Connected){ // l_Socket bầy giờ có thể gửi và nhận dữ liệu } } catch (SocketException e) { /* Đưa ra thông báo lỗi,... */ } Tạo kết nối từ máy chủ lằng nghe từ máy khách (Host) Chúng ta có thể thu được một kết nối socket từ máy tính ở xa bằng cách đảm nhiệm như là máy chủ. Khi một thiết bị như máy chủ, nó đợi nhận kết nối từ các máy khách. Để tạo kết nối để thiết bị của chúng ta như là máy chủ, chúng ta phải thiết lập một socket lắng nghe trên một cổng đến khi một ai đó gửi một yêu cầu kết nối đến thiết bị của chúng ta. Sau đây là các bước tạo socket lắng nghe trên một cổng để cho máy khác kết nối tới:

2http://www.mycomputer.net/ 49

Bước 1: Tạo một socket để lắng nghe kết nối. Bước 2: Ràng buộc socket lắng nghe trên một cổng. Nó chỉ lắng nghe kết nối trên một cổng. Bước 3: Gọi Accept() trên socket lắng nghe nhận được từ socket khác khi một ai đó kết nối tới. Đoạn mã có thể đọc và ghi socket nhận được, và socket tiếp tục đợi kết nối mới. Ví dụ sau mô tả ba bước ở trên: m_listenSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); m_listenSocket.Bind(new IPEndPoint(IPAddress.Any, 8758)); m_listenSocket.Listen((int)SocketOptionName.MaxConnections); m_connectedSocket = m_listenSocket.Accept(); if (m_connectedSocket != null) { if (m_connectedSocket.Connected) { // Someone has connected to us. } } Gửi và nhận trên Socket đã kết nối Một socket được kết nối tới máy tính ở xa. Nó có thể sử dụng gửi và nhận dữ liệu. Cách đơn giản nhất để làm việc này là gọi Socket.Send() để gửi dữ liệu và Socket.Receive() nhận dữ liệu. Gửi dữ liệu vào một Socket cùng với Socket.Send Socket.Send() có bốn thành phần nạp chồng, mỗi thành phần là một mức khác nhau của điều khiển thông qua cái được gửi: - Send(Byte[] buffer): Gửi tất cả mội thứ bên trong mảng byte buffer. - Send(Byte[] buffer, SocketFlags socketFlags) Gửi tất cả mọi thứ trong buffer cùng với sự hạn chế riêng thông qua cách dữ liệu đi như thế nào. - Send(Byte[] buffer, Int32 size, SocketFlags socketFlags): Gửi tất cả dữ liệu trong buffer tuỳ theo kích cỡ size. Nếu chúng ta muốn gửi chỉ một phần của một buffer, sau đó có thể chỉ rõ SocketFlags.None sử dụng mặc định hành vi gửi. Ví dụ, để gửi 16 byte đầu tiền của mảng, chúng ta có thể sử dụng l_Socket.Send(l_buffer, 16, SocketFlags.None). - Send(Byte[]buffer,Int32 offset Int32 size, SocketFlags socketFlags): Giống như thành phần trên chỉ khác là chúng ta có thể chỉ rõ chỉ số bắt đầu của mảng. Ví dụ, để gửi từ byte tứ 3 đến bute thứ 7 của mảng, chúng ta có thể sử dụng như sau: l_Socket.Send(l_buffer, 2, 6, SocketFlags.None); Phương thức Send trả về số byte gửi thành công. Vấn đề này cùng với phương thức send() dường như giống nhau rất nhiều việc biến đổi tất cả mọi cái chúng ta muốn gửi vào mảng các byte để gửi thông qua socket. .NET Compact Framework hỗ trợ hai lớp rất hữu ích, System.Text.Encoding và System.Convert, hai lớp này giúp chuyển đổi kiểu dữ liệu cơ bản thành mảng các byte để có thể gửi qua socket. Cách dễ nhất để tìm hiểu cách sử dụng lớp Encoding và Convert là xem ví dụ. Sau đây là ví dụ socket có tên là l_Socket đã tồn tại và đã được kết nối: Gửi một chuỗi sử dụng mã hoá ASCII : l_Socket.Send(Encoding.ASCII.GetBytes("Send me") Gửi một chuỗi sử dụng mã hoá Unicode: l_Socket.Send(Encoding.Unicode.GetBytes("Send me") Gửi một số nguyên có giá trị 2003: l_Socket.Send(Encoding.ASCII.GetBytes(Convert.ToString(2003)) Gửi một số thực có giá trị 2.7: l_Socket.Send(Encoding.ASCII.GetBytes(Convert.ToString(2.7)) Nhận dữ liệu từ từ socket bằng Socket.Receive Nhận dữ liệu từ một socket thông qua phương thức Socket.Receive. Receive có bốn thành phần nạp chồng, giống như thành phần nạp chồng của Socket.Send. Mỗi thành phần nạp chồng trả về số byte đọc thành công: 50 CHƯƠNG 3. BÀI 3: LẬP TRÌNH MẠNG

- Receive (Byte[] buffer): Thành phần này nhận dữ liệu trong bộ đệm. - Receive (Byte[] buffer, SocketFlags socketFlags) Thành phần này nhận dữ liệu trong bộ đệm bằng cách sử dụng cờ để chỉ ra dữ liệu được lấy như thế nào. - Receive (Byte[] buffer, Int32 size, SocketFlags socketFlags) Thành phần này nhận tuỳ theo kích cỡ của dữ liệu trong bộ đệm. Nếu dữ liệu nhiều hơn dữ liệu sẵn sàng, nó được bỏ qua. Chúng ta có thể nhận dữ liệu còn lại bằng cách gọi lại Receive. Nếu chúng ta chỉ muốn nhận những byte mà chúng ta không nhận được, sau đó chúng ta có thể chỉ SocketFlags.None để sử dụng mặc định cho hành động gửi. Ví dụ để nhận 16 byte đầu tiên của dữ liệu sẵn sàng, sử dụng l_Socket.Receive(l_buffer, 16, SocketFlags.None) - Receive (Byte[]buffer, Int32 offset Int32 size, SocketFlags socketFlags) Thành phần này giống như thành phần trước, chỉ khác là chúng ta có thể chỉ ra chỉ số trong mảng để sử dụng bắt đầu ghi dữ liệu vào mảng. Ví dụ, để nhận 7 byte dữ liệu trong bộ đệm bắt đầu từ vị trí thứ 3 trong bộ đệm, sử dụng đoạn mã sau: l_Socket.Receive(l_buffer, 2, 6, SocketFlags.None); Có kỹ thuật cho phép chuyển đổi dữ liệu để gửi từ socket ra mảng, kỹ thuật đơn giản nhấtlà chuyển đổi mảng byte trong kiểu dữ liệu cơ bản. Như phần trước, lớp Encoding và Convert cung cấp phương tiện cho chuyển đổi, và chúng ta sẽ xem trong ví dụ. Đầy là ví dụ thừa nhận dữ liệu đã được nhận trong mảng Byte có tên là l_Buffer: Chuyển đổi các byte nhận được trong một chuỗi ASCII : string l_ASCII = Encoding.ASCII.GetString(l_Buffer); Chuyển đổi các nhận được trong một chuỗi Unicode: string l_ASCII = Encoding.Unicode.GetString(l_Buffer); Chuyển đổi các byte nhận được, cái đó là mã ASCII text integer: int l_Integer = Convert.ToInt32(Encoding.ASCII.GetString(l_Buffer)); Chuyển đổi các byte nhận được, cái đó là mã ASCII text integer, into a Double: Double l_Double = Convert.ToInt32(Encoding.ASCII.GetString(l_Double));

Phương thức Tên của các kiểu dữ liệu đầu vào được chấp nhận ToBoolean object, bool, sbyte, char, byte, short, ushort, int, uint, long, String, float, double, decimal ToChar object, char, sbyte, byte, short, ushort, int, uint, long, ulong, String, float, double, decimal ToSByte object, bool, sbyte, char, byte, short, ushort, int, uint, long, ulong, float, double, decimal, String ToByte object, bool, sbyte, char, byte, short, ushort, int, uint, long, ulong, float, double, decimal, String ToInt16 object, bool, char, sbyte, byte, ushort, int, uint, short, long, ulong, float, double, decimal, String ToUInt16 object, bool, char, sbyte, byte, ushort, int, uint, short, long, ulong, float, double, decimal, String continued on next page 51

ToInt32 object, bool, char, sbyte, byte, short, ushort, uint, int, long, ulong, float, double, decimal, String ToUInt32 object, bool, char, sbyte, byte, short, ushort, uint, int, long, ulong, float, double, decimal, String ToInt64 object, bool, char, sbyte, byte, short, ushort, int, uint, ulong, long, float, double, decimal, String ToUInt64 object, bool, char, sbyte, byte, short, ushort, int, uint, ulong, long, float, double, decimal, String ToSingle object, sbyte, byte, char, short, ushort, int, uint, long, ulong, float, double, decimal, String, bool ToDouble object, sbyte, byte, short, char, ushort, int, uint, long, ulong, float, double, decimal, String, bool ToDecimal object, sbyte, byte, char, short, ushort, int, uint, long, ulong, float, double, String, decimal, bool, DateTime ToDateTime object, String ToString Object, bool, char, sbyte, byte, short, ushort, int, uint, long, ulong, float, double, decimal, Decimal, DateTime ToBase64String byte[] Byte[]FromBase64String String ToBase64CharArray byte[] Byte[]FromInt64CharArray char[]

Table 3.1: Kiểu dữ liệu đầu vào được chấp nhận

3.1.1.3 Tuần tự hóa đối tượng để truyền qua Socket Phiển bản desktop của .NET Framework cho phép tuần tự hóa hầu hết kiểu đối tượng thành mảng các byte, để có thể gửi qua socket. Các đối tượng phức tạp, người phát triển thực thi giao diện ISerializable, cùng với mã tuần tự (serialize) và hồi phục (deserialize) đối tượng dữ liệu. .NET Compact Framework không hỗ trợ những chức năng này. Lớp DataSet là lớp duy nhất có thể tự tuần tự hóa. Thông thường lớp DataSet được sử dụng như là một cơ sở dữ liệu quan hệ trong bộ nhớ. Nó là một ý tưởng cho bộ đệm dữ liệu nhỏ dựa vào máy chủ ở xa trong khi duy trì cấu trúc quan hệ của dữ liệu. DataSet có thể lưu trữ tất cả các kiểu dữ liệu cơ bản trên .NET Compact Framework.

3.1.1.4 Sử dụng gói UDP và gói TCP Như đã đề cập, có hai kiểu gói tin thường được sử dụng để truyền tin trên mạng. Kiểu chung nhất, gói TCP phải chọn cho gần như tất cả các trường hợp bởi vì nó đảm bảo rằng dữ liệu đến không bị hư hỏng hoặc ngược lại trả lại tín hiệu lỗi nếu có một vấn đề gì mà không thể sửa chữa. Gói tin UDP rất hữu ích cho các ứng dụng dòng thời gian thực. Gói tin UDP khác gói tin TCP trong cách mà chúng kết nối, giao thức TCP là giao thức hướng kết nối, điều này có nghĩa là chúng ta cần kết nối với một socket trên máy tính ở xa trước khi chúng ta có thể gửi hoặc nhận dữ liệu bằng socket. Giao thức kết nối không yêu cầu bất kỳ kết nối nào được thiết lập trước khi có gắn gửi hoặc nhận dữ liệu. Nếu không có một lắng nghe rên địa chỉ IP và cổng nơi mà gói UDP được gửi, sau đó gói tin đơn giản là bị mất. 52 CHƯƠNG 3. BÀI 3: LẬP TRÌNH MẠNG

Cách đơn giản nhất đển làm việc với gói UDP là sử dụng lớp UdpClient, lớp này được .NET Compact Framework hỗ trợ. Lớp UdpClient cho phép các lập trình viên gửi các byte tới nhóm ở xa. UdpClient cho phép người phát triển nhận byte từ nhóm ở xa hoặc từ bất kỳ người nào cố gắng gửi dữ liệu tới cổng mà UdpClient lắng nghe. Quan tâm đến các cấu trúc và phương thức được UdpClient sử dụng sau: - void Connect(String hostname, Int32 port) Thiết lập kết nối tới một máy tính có địa chỉ IP tương ứng được chỉ ra bởi tên máy chủ (hostname) và số hiệu cổng (port). Sau đó sử dụng phương thức Send(Byte[] dgram, Int32 bytes) sẽ gửi dữ liệu đến vị trí được chỉ ra trong phân kết nối. Phương thức này trả về kiểu void bởi vì không có khái niệm kết nối thành công khi sử dụng gói UDP. Phương thức này chỉ đơn thuần là tạo để gửi dữ liệu tới một địa chỉ IP và số hiệu cổng. - void Connect(IPAddress addr, Int32 port) Giống như phương thức trước, ngoại trừ cho phép bạn chỉ ra máy tính ở xa bằng IPAddress và port. Đoạn mã ví dụ: l_UdpClient.Connect(IPAddress.Parse("172.68.25.34"), 9999) - void Connect(IPEndpoint endPoint) Kết nối với máy xa bằng cách chỉ ra endPoint. - Int32 Send(Byte[] dgram, Int32 bytes, IPEndPoint endPoint) Gửi tất cả bytes của bộ đệm dgram tới máy tính có địa chỉ IP và cổng được chỉ ra trong endPoint. - Send(Byte[] dgram, Int32 bytes, String hostname, Int32 port) Gửi tất cả các bytes của bộ đệm dgram tới máy tính có địa chỉ IP tương ứng với hostname và cổng, như trong đoạn mã ví dụ sau: Send(aBuffer, aBuffer.Length, "www.mycomputer.net", 9999) Phương thức trên trả về số byte gửi. - Send(Byte[] dgram, Int32 bytes) Gửi tổng số byte của bộ đệm tới máy chủ ở xa đươc chỉ ra trong phương thức kết nối. Để sử dụng thành phần nạp chồng, chúng ta trước tiền phải gọi Connect, vì vậy UdpClient biết nơi gửi gói UDP. Phương thức này trả về số byte gửi được. - Receive(ref IPEndPoint remoteEP) Đợi để nhận dữ liệu từ EndPoint. Chúng ta có thể tạo một EndPoint tham chiếu đến một địa chỉ IP và cổng, hoặc chúng ta có thể thiết lập EndPoint để nhận dữ liệu từ bất kỳ địa chỉ IP và port. EndPoint được cập nhật sau khi dữ liệu được nhận cho biết nơi dữ liệu đến. Viết mã cho UdpClient Đoạn mã này mô tả cách thiết lập một UdpClient, sau đó gửi gói tin UDP tới máy tính có địa chỉ IP là 192.168.0.200, cổng 8888. Chú ý là thông qua gọi phương thức UdpClient.Connect(). UdpClient biết nơi gửi gói tin UDP khi UdpClient.Send() được gọi, nhưng không có kết nối liên tục. IPEndPoint senderIP = new IPEndPoint(IPAddress.Parse("192.168.0.200"), Convert.ToInt32(8888)); UdpClient l_UdpClient = new UdpClient(); l_UdpClient.Connect(senderIP); for (int i = 0; i < 20; i++) { l_UdpClient.Send(Encoding.ASCII.GetBytes("Hello_UDP_1"), Encoding.ASCII.GetBytes("Hello_UDP_1").Length); System.Threading.Thread.Sleep(1000); } l_UdpClient.Close(); Sau đây đoạn mã tạo một vòng lặp. Mỗi lần lặp của khối lặp và lắng nghe trên cổng 8888 đến khi nó nhận một gói tin từ bất kỳ địa chỉ IP nào. IPEndPoint listenerIP = new IPEndPoint(IPAddress.Any, 8888); UdpClient listener = new UdpClient(listenerIP); for (int i = 0; i < Convert.ToInt16(this.txtMaxPackets.Text); i++) { // Now receive the three datagrams from the listener IPEndPoint receivedIPInfo = new IPEndPoint(IPAddress.Any, 0); byte[] data = listener.Receive(ref receivedIPInfo); this.textBox1.Text += ("GOT: " + Encoding.ASCII.GetString(data, 0, data.Length) + " FROM: " + receivedIPInfo.ToString()); 53

} Mục đích của lớp UDPClient ở trên là dùng cho lập trình với giao thức UDP, với giao thức này thì hai bên không cần phải thiết lập kết nối trước khi gửi do vậy mức độ tin cậy không cao. Để đảm bảo độ tin cậy trong các ứng dụng mạng, người ta còn dùng một giao thức khác, gọi là giao thức có kết nối : TCP (Transport Control Protocol). Trên Internet chủ yếu là dùng loại giao thức này, ví dụ như Telnet, HTTP, SMTP, POP3... Để lập trình theo giao thức TCP, MS.NET cung cấp hai lớp có tên là TCPClient và TCPListener. Các thành viên của lớp TCPClient

Constructor Method Name Description TcpClient () 9 Tạo một đối tượng TcpClient. Chưa đặt thông số gỡ. TcpClient (IPEndPoint) 10 Tạo một TcpClient và gắn cho nú một EndPoint cục bộ. (Gán địa chỉ máy cục bộ và số hiệu cổng để sử dụng trao đổi thông tin về sau) TcpClient (RemoteHost: String, RemotePort: Tạo một đối tượng TcpClient và kết nối đến một Int32) 11 máy có địa chỉ và số hiệu cổng được truyền vào.. RemoteHost có thể là địa chỉ IP chuẩn hoặc tên máy.

Table 3.2

Public Properties (see also Protected Properties 12 )

Name Description

Available13 Cho biết số byte đó nhận về từ mạng và cú sẵn để đọc.

Client14 Trả về Socket ứng với TCPClient hiện hành.

Connected15 Trạng thái cho biết đó kết nối được đến Server hay chưa ?

Table 3.3

Public Methods (see also Protected Methods 16 )

Name Description Close25 Giải phóng đối tượng TcpClient nhưng không đóng kết nối.

continued on next page

9http://voer.edu.vn/content/m18875/latest/ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.NETDEVFX.v20.en/cpref10/html/C_System_Net_Sockets_TcpClient_ctor.htm 10http://voer.edu.vn/content/m18875/latest/ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.NETDEVFX.v20.en/cpref10/html/C_System_Net_Sockets_TcpClient_ctor_1_0de96836.htm 11http://voer.edu.vn/content/m18875/latest/ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.NETDEVFX.v20.en/cpref10/html/C_System_Net_Sockets_TcpClient_ctor_1_a896f3dd.htm 12http://voer.edu.vn/content/m18875/latest/ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.NETDEVFX.v20.en/cpref10/html/T_System_Net_Sockets_TcpClient_Members.htm#FamilyPropertiesToggle#FamilyPropertiesToggle 13http://voer.edu.vn/content/m18875/latest/ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.NETDEVFX.v20.en/cpref10/html/P_System_Net_Sockets_TcpClient_Available.htm 14http://voer.edu.vn/content/m18875/latest/ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.NETDEVFX.v20.en/cpref10/html/P_System_Net_Sockets_TcpClient_Client.htm 15http://voer.edu.vn/content/m18875/latest/ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.NETDEVFX.v20.en/cpref10/html/P_System_Net_Sockets_TcpClient_Connected.htm 16http://voer.edu.vn/content/m18875/latest/ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.NETDEVFX.v20.en/cpref10/html/T_System_Net_Sockets_TcpClient_Members.htm#FamilyMethodsToggle#FamilyMethodsToggle 54 CHƯƠNG 3. BÀI 3: LẬP TRÌNH MẠNG

Connect26 (RemoteHost, Re- Kết nối đến một máy TCP khác motePort) có Tên và số hiệu cổng.

GetStream27 Trả về NetworkStream28 để từ đó giúp ta gửi hay nhận dữ liệu. (Thường làm tham số khi tạo StreamReader và StreamWriter để gửi và nhận dữ liệu dưới dạng xâu ký tự) .Khi đó gắn vào StreamReader và StreamWriter rồi thỡ ta cú thể gửi và nhận dữ liệu thụng qua cỏc phương thức Readline, writeline tương ứng của các lớp này.

Table 3.4: Các phương thức của lớp TCPClient Từ các thành viên của lớp TCPClient ở trên ta thấy rằng, việc kết nối và thực hiện gửi nhận rất đơn giản. Theo các trình tự sau: B1: Tạo một đối tượng TCPClient B2: Kết nối đến máy chủ (Server) dùng phương thức Connect B3: Tạo 2 đối tượng StreamReader (Receive)và StreamWriter (Send) và "nối" với GetStream của TCP- Client B4: - Dùng đối tượng StreamWriter.Writeline/write vừa tạo ở trên để gửi dữ liệu đi. - Dùng đối tượng StreamReader.Readline/Read vừa tạo ở trên để đọc dữ liệu về. B5: Đóng kết nối. *** Nếu muốn gửi/nhận dữ liệu ở mức byte (nhị phân) thì sử dụng NetworkStream. (truyền GetStream cho NetworkStream) TCPListerner là một lớp cho phép người lập trình có thể xây dựng các ứng dụng Server (Ví dụ như SMTP Server, FTP Server, DNS Server, POP3 Server hay server tự định nghĩa ....). Ứng dụng server khác với ứng dụng Client ở chỗ nó luôn luôn thực hiện lắng nghe và chấp nhận các kết nối đến từ Client. Các thành viên của lớp TCPListerner

Constructor method Name Description TcpListener (Port: Int32) 35 Tạo một TcpListener và lắng nghe tại cổng chỉ định. TcpListener (IPEndPoint) 36 Tạo một TcpListener với giỏ trị Endpoint truyền vào. TcpListener (IPAddress, Port: Int32) 37 Tạo một TcpListener và lắng nghe các kết nối đến tại địa chỉ IP và cổng chỉ định.

Table 3.5: Các thành viên của lớp TCPListerner Public Methods (see also Protected Methods 38 )

25http://voer.edu.vn/content/m18875/latest/ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.NETDEVFX.v20.en/cpref10/html/M_System_Net_Sockets_TcpClient_Close.htm 26http://voer.edu.vn/content/m18875/latest/ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.NETDEVFX.v20.en/cpref10/html/O_T_System_Net_Sockets_TcpClient_Connect.htm 27http://voer.edu.vn/content/m18875/latest/ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.NETDEVFX.v20.en/cpref10/html/M_System_Net_Sockets_TcpClient_GetStream.htm 28http://voer.edu.vn/content/m18875/latest/ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.NETDEVFX.v20.en/cpref10/html/T_System_Net_Sockets_NetworkStream.htm 35http://voer.edu.vn/content/m18875/latest/ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.NETDEVFX.v20.en/cpref10/html/C_System_Net_Sockets_TcpListener_ctor_1_f865e12f.htm 36http://voer.edu.vn/content/m18875/latest/ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.NETDEVFX.v20.en/cpref10/html/C_System_Net_Sockets_TcpListener_ctor_1_0de96836.htm 37http://voer.edu.vn/content/m18875/latest/ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.NETDEVFX.v20.en/cpref10/html/C_System_Net_Sockets_TcpListener_ctor_1_7fcfd676.htm 38http://voer.edu.vn/content/m18875/latest/ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.NETDEVFX.v20.en/cpref10/html/T_System_Net_Sockets_TcpListener_Members.htm#FamilyMethodsToggle#FamilyMethodsToggle 55

Name Description AcceptSocket49 Chấp nhận một yêu cầu kết nối đang chờ.

AcceptTcpClient50 Chấp nhận một yêu cầu kết nối đang chờ. (Ứng dụng sẽ dừng tại lệnh này cho đến khi nào có một kết nối đến – “Blocking”) Pending51 Cho biết liệu có kết nối nào đang chờ đợi không ? (True = có).

Start52 Bắt đầu lắng nghe các yêu cầu kết nối.

Stop53 Dừng việc nghe.

Table 3.6: Các phương thức của lớp TCPListerner

3.1.2 Ứng dụng lập trình mạng 3.1.2.1 Thi trắc nghiệm – Hình thức E-Learning Khái niệm E-Learning nhằm chỉ đến phương pháp đào tạo, học tập, soạn giáo án, soạn đề thi và tổ chức thi thông qua hệ thống mạng máy tính. Đặc điểm của phương pháp này là không cần tổ chức lớp học tập trung, bài giảng trực quan sinh động. Chỉ với một máy tính được nối mạng, học viên có thể gặp “thầy giáo” bất cứ lúc nào. Với sự ra đời của E-Learning, phương pháp dạy học truyền thống đã không còn chiếm ưu thế tuyệt đối và đang dần bộc lộ các mặt hạn chế của nó. Trong giáo dục nói chung và trong hoạt động giảng dạy nói riêng, phương pháp kiểm tra, đánh giá bằng thi trắc nghiệm có những ưu điểm vượt trội ở một số nội dung môn học và trong những yêu cầu đánh giá khách quan so với phương pháp kiểm tra đánh giá truyền thống. Việc áp dụng thi trắc nghiệm để đảm bảo tính khách quan trong mọi cấp học đang thu hút được sự chú ý của nhiều người. Ở các nước phát triển, việc áp dụng thi trắc nghiệm được quan tâm phát triển đúng mức. Ở Việt Nam trong những năm gần đây, phần mềm phục vụ E-Learning đã và đang xuất hiện ngày càng nhiều. Tuy nhiên, hệ thống phần mềm thi trắc nghiệm của chúng ta còn nhiều hạn chế. Các phần mềm hiện có trên thị trường chủ yếu mới chỉ chạy trên máy đơn, việc soạn câu hỏi, tạo đề thi còn nhiều bất cập và chưa đễ dàng, thuận tiện cho giáo viên. Thị trường cũng dang có phần mềm thi trắc nghiệm trên mạng LAN, nhưng những phần mềm này còn khá cứng nhắc, vai trò của giáo viên không được đề cao. Cụ thể như không thêm được môn học, không quan tâm tới việc lưu trữ các câu hỏi để tạo ngân hàng câu hỏi cho các giáo viên khác tham khảo và học sinh dùng để tự kiểm tra kiến thức của mình

49http://voer.edu.vn/content/m18875/latest/ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.NETDEVFX.v20.en/cpref10/html/M_System_Net_Sockets_TcpListener_AcceptSocket.htm 50http://voer.edu.vn/content/m18875/latest/ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.NETDEVFX.v20.en/cpref10/html/M_System_Net_Sockets_TcpListener_AcceptTcpClient.htm 51http://voer.edu.vn/content/m18875/latest/ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.NETDEVFX.v20.en/cpref10/html/M_System_Net_Sockets_TcpListener_Pending.htm 52http://voer.edu.vn/content/m18875/latest/ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.NETDEVFX.v20.en/cpref10/html/O_T_System_Net_Sockets_TcpListener_Start.htm 53http://voer.edu.vn/content/m18875/latest/ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.NETDEVFX.v20.en/cpref10/html/M_System_Net_Sockets_TcpListener_Stop.htm 56 CHƯƠNG 3. BÀI 3: LẬP TRÌNH MẠNG

3.1.2.2 Hình thức thi trắc nghiệm Theo nghĩa chữ Hán54 , "trắc" có nghĩa là "đo lường", "nghiệm" là "suy xét", "chứng thực". Trắc nghiệm xuất hiện từ thế kỉ 1955 , do một nhà khoa học người Mỹ56 nghĩ ra nhằm thủ đánh giá trí thông minh57 của con người. Sau đó, hai nhà tâm lý học58 người Pháp59 soạn ra bộ giáo án trắc nghiệm. Lợi ích của trắc nghiệm:

• Khảo sát được số lượng lớn thí sinh • Kết quả nhanh • Điểm số đáng tin cậy • Công bằng, chính xác, vô tư • Ngăn ngừa "học tủ"

Hạn chế của trắc nghiệm

• Thí sinh có khuynh hướng đoán mò đáp án. (Độ may rủi: là xác suất thí sinh đoán mò và làm đúng) • Không thấy rõ diễn biến tư duy của thí sinh • Khó soạn đề và tốn công sức • Theo quan điểm của nhiều người, việc áp dụng thi trắc nghiệm trong kỳ thi tuyển sinh Đại học ở Việt Nam là không thích hợp trong tình hình hiện nay. Về sâu sa, thi trắc nghiệm thực sự có hiệu quả khi cần sàng lọc ở cấp thấp về tri thức

Các loại hình thi trắc nghiệm

• Lựa chọn: Gồm hai phần: Phần gốc là một câu hỏi hay một câu được bỏ lửng. Phần trả lời: bao gồm từ bốn đến sáu phương án nhưng chỉ có một và chỉ một phương án tối ưu, các phương án còn lại chỉ là "mồi nhử". Độ may rủi: 25% • Ghép hợp: Chia làm hai phần:

Phần 1: Nội dung kiểm tra Phần 2: Các câu trả lời có liên hệ đến phần 1 (nhưng bị xáo trộn vị trí) Khi làm bài, thí sinh phải ghép hai phần thành từng cặp sao cho đúng nhất. Độ may rủi: Gọi n là số câu hỏi có ở phần 1, m là số phương án trả lời ở phần 2 (thông thường thì m gấp 2, 3 lần n), quy tắc xác suất: độ may rủi=n!/m! (rất thấp) Điền vào chỗ trống: Là một câu hỏi hay một câu phát biểu có chừa trống, thí sinh tự điền vào từ và cụm từ phù hợp. Độ may rủi: không có So sánh phương pháp trắc nghiệm với phương pháp luận đề

• Một câu hỏi luận đề60 đòi hỏi thí sinh phải tự suy nghĩ ra câu trả lời rồi diễn đạt bằng ngôn ngữ riêng của bản thân, câu hỏi trắc nghiệm buộc thí sinh phải chọn duy nhất một câu đúng nhất. • Một bài luận đề có rất ít câu hỏi nhưng thí sinh phải diễn đạt bằng lời lẽ dài dòng, còn một bài trắc nghiệm có rất nhiều câu hỏi nhưng chỉ đòi hỏi trả lời ngắn gọn nhất. • Làm bài luận đề cần nhiều thời gian để suy nghĩ và diễn đạt, còn khi làm trắc nghiệm thời gian đó cần để đọc và suy nghĩ. • Chất lượng bài luận đề phụ thuộc vào kỹ năng người chấm bài, còn chất lượng bài trắc nghiệm phụ thuộc vào kỹ năng người ra đề.

54http://vi.wikipedia.org/wiki/Chữ_Hán 55http://vi.wikipedia.org/wiki/Thế_kỉ_19 56http://vi.wikipedia.org/w/index.php?title=Người_Mỹ&action=edit&redlink=1 57http://vi.wikipedia.org/w/index.php?title=Thông_minh&action=edit&redlink=1 58http://vi.wikipedia.org/wiki/Tâm_lý_học 59http://vi.wikipedia.org/w/index.php?title=Người_Pháp&action=edit&redlink=1 60http://vi.wikipedia.org/w/index.php?title=Phương_pháp_luận_đề&action=edit&redlink=1 57

• Một đề bài luận đề tương đối dễ soạn nhưng khó chấm điểm, còn trắc nghiệm thì khó soạn nhưng dễ chấm điểm. • Với bài luận đề, thí sinh tự do bộc lộ suy nghĩ cá nhân, người chấm tự do cho điểm theo xu hướng riêng; bài trắc nghiệm chỉ chứng tỏ kiến thức thông qua tỉ lệ câu trả lời đúng, người ra đề tự bộc lộ kiến thức thông qua việc đặt câu hỏi.

Một bài trắc nghiệm cho phép và đôi khi khuyến khích sự "phỏng đoán" đáp án, nhưng một bài luận đề cho phép sử dụng ngôn từ hoa mỹ, khó có bằng chứng để "lừa phỉnh" đáp án. Chúng ta có thể xây dựng hệ thống thi trắc nghiệm trên mạng LAN, ứng dụng công cụ của lập trình mạng trên .NET. 58 CHƯƠNG 3. BÀI 3: LẬP TRÌNH MẠNG Chương 4

Bài 4: Kiến trúc hướng dịch vụ (webservice)

4.1 Kiến trúc hướng dịch vụ (webservice)1

4.1.1 Giới thiệu Trong khi các nhà quản lý công nghệ thông tin đang phải đối đầu với việc giảm giá thành và tối đa lợi ích của các công nghệ hiện có, họ vẫn phải liên tục cố gắng để phục vụ khách hàng được tốt hơn, trở nên cạnh tranh hơn và phản ứng nhanh hơn với chiến lược cửa doanh nghiệp. Có hai yếu tố chính ẩn sau những áp lực này, đó là tính không đồng nhất của các hệ thống, ứng dụng và kiến trúc khác nhau với thời gian tồn tại và công nghệ khác nhau. Việc tích hợp nhiều sản phẩm từ nhiều nhà cung cấp và nhiều nền tảng thực sự là điều khó khăn. nhưng chúng ta cũng không thể cố gắng tiếp cận theo kiểu một nhà cung cấp công nghệ thông tin vì các bộ ứng dụng và kiến trúc hỗ trợ rất không mềm dẻo. Sự thay đổi về mặt công nghệ là yếu tố thứ hai mà các nhà quản lý công nghệ thông tin phải đối mặt. Sự toàn cầu hoá và kinh doanh điện tử đang làm tăng tốc sự thay đổi và dẫn đến sự cạnh tranh gay gắt trong việc rút ngắn chu kỳ sản xuất để có thể chiếm ưu thế đối với đối thủ cạnh tranh. Các thay đổi về yêu cầu và nhu cầu của khách hàng nhanh chóng hơn do tác động của phân phối cạnh tranh và sự phong phú về thông tin sản phẩm và dịch vụ diễn ra nhanh hơn. Các cải tiến trong công nghệ tiếp tục tăng nhanh, làm tăng sự thay đổi yêu cầu của khách hàng. Doanh nghiệp phải nhanh chóng thích nghi để tồn tại, chưa kể đến việc phải thành công trong môi trường cạnh tranh đông ngày nay, và hạ tầng công nghệ thông tin phải đem lại khả năng thích nghi cho các doanh nghiệp. Vì vậy, các tổ chức kinh doanh đang phát triển từ sự phân chia doanh nghiệp theo chiều dọc, cô lập của những năm 1980 về trước thành các cấu trúc chú trọng quy trình kinh doanh theo chiều ngang của những năm 1980, 1990, tới mô hình kinh doanh mới trong đó các doanh nghiệp có tác động lẫn nhau. Các dịch vụ doanh nghiệp hiện nay cần phải được thành phần hoá và phân tán. Cần trú trọng vào dây chuyền cung cấp mở rộng, cho phép khách hàng và đối tác truy cập tới các dịch vụ kinh doanh. Làm thế nào để môi trường công nghệ thông tin trở nên linh hoạt và nhạy bén hơn đối với sự thay đổi của các yêu cầu kinh doanh? Làm thế nào để các hệ thống và ứng dụng không đồng nhất trao đổi với nhau một cách liền mạch? Làm thế nào để đạt mục tiêu kinh doanh mà không bị phá sản các doanh nghiệp? Đã có nhiều giải pháp được đề ra song song với sự phát triển của các vấn đề kinh doanh: kiến trúc các đơn vị riêng lẻ,có cấu trúc, mô hình khách chủ, mô hình ba lớp, mô hình đa lớp, mô hình đối tượng phân tán, các thành phần, dịch vụ. Hiện nay, nhiều nhà quản lý và các chuyên gia công nghệ thông tin tin rằng chúng ta đang tiến ngày một gần hơn tới câu trả lời với kiến trúc hướng dịch vụ (SOA).

1This content is available online at .

59 60 CHƯƠNG 4. BÀI 4: KIẾN TRÚC HƯỚNG DỊCH VỤ (WEBSERVICE)

Để đáp ứng được các yêu cầu về sự không đồng nhất, tính liên thông và sự thay đổi yêu cầu không ngừng, một kiến trúc như vậy phải đem lại một nền tảng cho việc xây dựng dịch vụ ứng dụng các đặc tính sau: - Liên kết lỏng lẻo (Loosely Couple). - Vị trí trong suốt (Location Transparent). - Độc lập về giao thức (Protocol Independent) Dựa trên một kiến trúc hướng dịch vụ như vậy, người dùng dịch vụ thậm chí không cần quan tâm tới một dịch vụ cụ thể mà mình đang trao đổi thông tin vì hạ tầng cơ sở, hay là tuyến dịch vụ (Services bus), sẽ tạo ra một lựa chọn thích hợp cho người dùng. Các đặc tả kỹ thuật cụ thể từ các công nghệ cài đặt khác nhau như J2EE hay .NET không làm ảnh hưởng tới người dùng SOA. Người dùng cũng có thể cân nhắc và thay thế một cài đặt dịch vụ tốt hơn nếu tồn tại một dịch vụ khác có chất lượng tốt hơn.

4.1.2 Định nghĩa về kiến trúc hướng dịch vụ (HDV) Thuật ngữ kiến trúc hướng dịch vụ (SOA–Service Oriented Architectural) tuy không mới nhưng gần đây được nói đến rất nhiều, đặc biệt khi Microsoft cho ra đời công nghệ .NET, mà ở đó việc phát triển các dịch vụ (Service) trở nên dễ dàng hơn bao giờ hết. Tùy theo quan điểm người dùng, hiện có rất nhiều định nghĩa khác nhau về kiến trúc hướng dịch vụ. Ví dụ về một định nghĩa của kiến trúc hướng dịch vụ: "Kiến trúc hướng dịch vụ là một cách tiếp cận để tổ chức các tài nguyên công nghệ thông tin mà ở đó dữ liệu, logic và nguồn lực hạ tầng được truy cập thông qua các giao diện (interface) và thông điệp (Message)." Xét về khía cạnh sử dụng thì có thể hiểu đơn giản như sau: "Dịch vụ là một tập các chương trình con (thư viện) cho phép các chương trình chạy trên các máy tính khác trong mạng có thể triệu gọi và sử dụng..." Nói tóm lại, SOA có thể được hiểu là một hướng tiếp cận để xây dựng các hệ thống phân tán cung cấp các chức ứng dụng dưới các dạng dịch vụ tới các ứng dụng người cuối cùng hoặc các dịch vụ khác: SOA là một kiến trúc dùng trong các chuẩn mở để biểu diễn các thành phần mềm như là các dịch vụ. Cung cấp một cách thức chuẩn hoá cho việc biểu diễn và tương tác với các thành phần phần mềm. Các thành phần phần mềm riêng lẻ trở thành các khối cơ bản để có thể sử dụng lại để xây dựng các ứng dụng khác. Được sử dụng để tích hợp các ứng dụng bên trong và bên ngoài tổ chức. Dịch vụ là yếu tố then chốt trong SOA. Có thể hiểu dịch vụ như là hàm chức năng (modul phần mềm) thực hiện theo quy trình nghiệp vụ nào đó. Các dịch vụ trong SOA có đặc điểm sau:

1. Các dịch vụ là có thể tìm kiếm được. 2. Các dịch vụ có tính liên thông. 3. Các dịch vụ không được gắn kết chặt chẽ với nhau. 4. Các dịch vụ là phức hợp, bao gồm nhiều thành phần, được đóng gói ở mức cao. 5. Các dịch vụ trong suốt về vị trí. 6. Các dịch vụ có khả năng tự hàn gắn.

Một cách cơ bản, SOA là tập hợp các dịch vụ kết nối “ mềm dẻo ” với nhau (nghĩa là một ứng dụng có khả năng giao tiếp với một ứng dụng khác mà không cần biết các chi tiết hệ thống bên trong), có giao diện được định nghĩa rõ ràng và độc lập với nền tảng của hệ thống, và có thể tái sử dụng. SOA là cấp độ cao hơn của sự phát triển ứng dụng, chú trọng đến quy trình nghiệp vụ và dùng giao diện chuẩn để che dấu sự phức tạp kỹ thuật bên dưới. Thiết kế SOA tách riêng phần thực hiện dịch vụ (phần mềm) với giao diện gọi dịch vụ. Điều này tạo nên một giao diện nhất quán cho ứng dụng sử dụng dịch vụ mà không cần quan tâm tới công nghệ thực hiện dịch vụ. Thay vì xây dựng các ứng dụng đơn lẻ và đồ sộ, nhà phát triển sẽ xây dựng các dịch vụ tinh gọn hơn có thể triển khai và tái tạo sử dụng trong toàn bộ quy trình nghiệp vụ. Điều này cho phép tái sử dụng phần mềm tốt hơn, cũng như tăng sự mềm dẻo vì các nhà phát triển có thể cải tiến dịch vụ mà không làm ảnh hưởng đến ứng dụng sử dụng dịch vụ. Tríêt lý SOA không hoàn toàn mới, DCOM và CORBA cũng có kiến trúc tương tự. Tuy nhiên, các kiến trúc cũ ràng buộc các thành phần với nhau quá chặt ví dụ như các ứng dụng phân tán muốn làm việc với 61 nhau phải được thoả thuận về chi tiết tập hàm API, một thay đổi mã lệnh trong thành phần COM sẽ yêu cầu những thay đổi tương ứng đối với mã lệnh truy cập thành phần DCOM này. Ưu điểm lớn nhất của SOA là khả năng kết nối mềm dẻo và tái sử dụng. Các dịch vụ có thể được sử dụng trên nền tảng bất kỳ và được viết với ngôn ngữ bất kỳ (ví dụ, ứng dụng có thể liên kết với dịch vụ mạng. NET và ngược lại). SOA dựa trên hai nguyên tắc thiết kế quan trọng : - Modul: tách vấn đề lớn thành nhiều vấn đề nhỏ. - Đóng gói: che dấu dữ liệu và logic trong từng modul đối với truy cập từ bên ngoài. Một thiết kế kiến trúc phù hợp với khái niệm của SOA cần tuân theo những tính chất sau: Một dịch vụ là một đơn vị phần mềm gồm các hoạt động nghiệp vụ có tính chứa đựng và mức độ đóng gói cao (coarse-grained). Một dịch vụ có thể dùng lại được, cho phép có thể xây dựng được một dịch vụ mới từ các dịch vụ hiện có. Do đó, việc quan sát các hàm ý có thể có của các thuộc tính phi chức năng như tính giao dịch là rất quan trọng. Một giao diện dịch vụ là một điểm cuối mạng (Network Endpoint) đảm bảo tính độc lập và trong suốt về vị trí. Một dịch vụ cần có khả năng được phát hiện ra một cách công khai bằng cách sử dụng một nơi đăng ký dịch vụ nhằm cho phép các liên kết động tới dịch vụ. Một dịch vụ cần đảm bảo tính liên thông bằng cách hỗ trợ các giao thức truyền thông được chuẩn hoá và các định dạng dữ liệu rõ ràng. Các đặc điểm trên đảm bảo cho một kiến trúc hướng dịch vụ khả năng gắn kết lỏng lẻo của các dịch vụ phân tán và có tính modul bằng cách sử dụng các giao ước dịch vụ để mô tả các định dạng thông điệp cần thiết.

4.1.3 Các thành phần và mô hình trong kiến trúc HDV Với mục tiêu là xây dựng một kiến trúc dịch vụ thực sự đơn giản và tính tương thích cao, SOA được xây dựng dựa trên các chuẩn rất phổ biến là SOAP (Simple Object Access Protocol – giao thức truy xuất đối tượng đơn giản) và XML (eXtensible Makup Language – ngôn ngữ đánh dấu mở rộng). Hai chuẩn này đóng vai trò là thành phần xương sống để truyền nhận các thông điệp giữa các đối tượng truyền thông. Tức là, bất kỳ thành phần nào nếu hiểu được giao thức này thì hoàn toàn có thể sử dụng các dịch vụ mà không phụ thuộc vào ngôn ngữ lập trình hay hệ điều hành đang sử dụng. Mô hình của kiến trúc có thể mô tả như sau: 62 CHƯƠNG 4. BÀI 4: KIẾN TRÚC HƯỚNG DỊCH VỤ (WEBSERVICE)

Figure 4.1: Mô hình kiến trúc hướng dịch vụ

Các thực thể trong kiến trúc hướng dịch vụ bao gồm:

1. Dịch vụ (Services). 2. Thành phần sử dụng dịch vụ (Services consumer/ Client / Request). 3. Thành phần cung cấp dịch vụ (Services Provider). 4. Thành phần đăng ký dịch vụ (Services Registry). 5. Giao ước dịch vụ (Contract). 6. Uỷ nhiệm dịch vụ. 7. Ràng buộc sử dụng dụng dịch vụ (Services lease).

Dịch vụ: Dịch vụ chứa một chức năng rõ ràng, tự chứa đựng và không phụ thuộc vào ngữ cảnh hay trạng thái của các dịch vụ khác. Các thành phần sử dụng dịch vụ có thể truy cập tới dịch vụ thông qua giao diện dịch vụ được xuất bản. Dịch vụ có các tính chất sau:

1. Dịch vụ có tính chất rõ ràng, là một đơn vị chức năng nghiệp vụ có thể được triệu gọi 2. Có khả năng triệu gọi thông qua các giao thức truyền thông chung. 3. Có tính liên thông và vị trí trong suốt. 4. Dịch vụ được định nghĩa bằng các giao diện tường minh. 5. Các giao diện độc lập với cài đặt. 6. Cung cấp giao ước giữa các thành phần cung cấp và sử dụng dịch vụ. 7. Dịch vụ là các modul phức tạp, bao gồm nhiều thành phần. Mức độ đóng gói của dịch vụ càng cao thì dịch vụu càng có khả năng tái sử dụng và linh hoạt.

Thành phần sử dụng dịch vụ(Web Services Customer): 63

Thành phần sử dụng dịch vụ là một ứng dụng, một dịch vụ, hoặc một loại modul phần mềm khác có yêu cầu sử dụng dịch vụ. Đây là thực thể khởi tạo việc định vị định vụ tại một kho đăng ký dịch vụ, liên kết tới dịch vụ qua một kênh truyền thông và thực thi các chức năng của dịch vụ. Thành phần náy thực thi nhiệm vụ bằng cách gửi tới dịch vụ một yêu cầu được định dạng theo đúng giao ước. Thành phần cung cấp dịch vụ(Web Services Implementation): Thành phần cung cấp dịch vụ là một thực thể có khả năng được địa chỉ hoá qua mạng, nó có thể chấp nhận và thực thi các yêu cầu từ những thành phần sử dụng dịch vụ. Thành phần cung cấp dịch vụ có thể là một hệ thôngs máy tính lớn, một thành phần, hoặc một loại hệ thống phần mềm khác có thể thực thi các yêu cầu dịch vụ. Thực thể này xuất bản giao ước dịch vụ của nó trong một kho đăng ký dịch vụ để các thành phần sử dụng dịch vụ có thể truy cập. Thành phần đăng ký dịch vụ(UDDI): Thành phần đăng ký dịch vụ là một thư mục trên mạng có chứa các dịch vụ sẵn dùng. Đây là một thực thể chấp nhận và lưu trữ các giao ước từ các thành phần cung cấp dịch vụ và cung cấp các giao ước đó cho các thành phần sử dụng dịch vụ. Dịch vụ UDDI, đóng vai trò như người chỉ đường cho các thành phần sử dụng dịch vụ, tạo sự trong suốt về vị trí đối với thành phần cung cấp dịch vụ; để khi thành phần này thay đổi thì thành phần sử dụng dịch vụ không cần phải biên dịch hay cấu hình lại. Giữa ba thành phần: cung cấp dịch vụ, sử dụng dịch vụ, đăng ký dịch vụ, việc trao đổi dữ liệu hoàn toàn dùng giao thức SOAP và nội dung bên trong được định dạng bằng XML. Giao ước dịch vụ: Một giao ước là một bản đặc tả cách thức để thành phần sử dụng dịch vụ có thể tương tác với thành phần cung cấp dịch vụ. Nó chỉ ra khuôn dạng của thông điệp yêu càu và thôgn điệp đáp ứng từ các dịch vụ. Giao ước dịch vụ có thể đòi hỏi một tập các điều kiện tiên quyết và điều kiện sau. Các điều kiện này xác định trạng thái cần thiết của dịch vụ để thực thi một chức năng cụ thể. Bản giao ước này cũng có thể bao gồm các mức độ chất lượng của dịch vụ, các đặc tả cho các khoá chạnh phi chức năng của dịch vụ. Uỷ nhiệm dịch vụ: Thành phần cung cấp dịch vụ cung cấp một uỷ nhiệm dịch vụ cho thành phần sử dụng dịch vụ. Thành phần sử dụng dịch vụ thực thi các yêu cầu bằng cách gọi một hàm API trên nó. Uỷ nhiệm dịch vụ (hình 1.9) sẽ tìm một giao ước và một tham chiếu tới thành phần cung cấp dịch vụ trong nơi đăng ký. Sau đó, nó định dạng thông điệp yêu cầu và thực thi yêu cầu trên danh nghĩa của thành phần sử dụng dịch vụ. Uỷ nhiệm dịch vụ là một thực thể không bắt buộc, nó chỉ đơn giản hoá cho thành phần sử dụng dịch vụ và thành phần sử dụng dịch vụ hoàn toàn có thể viết phần mềm để truy cập tới dịch vụ. Một thành phần cung cấp dịch vụ sẽ cung cấp nhiều uỷ nhiệm cho các môi trường khác nhau, mỗi uỷ nhiệm dịch vụ được viết bằng ngôn ngôn ngữ của các thành phần sử dụng dịch vụ. Ví dụ, một thành phần cung cấp dịch vụ có thể cung cấp các uỷ nhiệm dịch vụ cho Java, Visual Basic, Delphi nếu đó là các nền tảng của các thành phần sử dụng dịch vụ. Mặc dù uỷ nhiệm dịch vụ là không bắt buộc nhưng có thể cải thiện một cách đáng kể hiệu năng và tính tiện dụng cho các thành phần sử dụng dịch vụ. 64 CHƯƠNG 4. BÀI 4: KIẾN TRÚC HƯỚNG DỊCH VỤ (WEBSERVICE)

Figure 4.2: Uỷ nhiệm dich vụ

Ràng buộc sử dụng dịch vụ: Ràng buộc sử dụng dịch vụ mà các thành phần đăng ký dịch vụ gán cho thành phần sử dụng dịch vụ rất cần thiết để dịch vụ bảo trì được thông tin trạng thái liên kết giữa thành phần sử dụng và thành phần cung cấp. Nó tạo ra sự gắn kết không chặt chẽ giữa các thành phần này bằng cách giới hạn khoảng thời gian mà chúng được liên kết với nhau. Không ràng buộc, một thành phần sử dụng dịch vụ có thể liên kết với một dịch vụ mãi mãi và không bao giờ liên kết lại với các giao ước của nó. Các thao tác trong kiến trúc hướng dịch vụ bao gồm: Xuất bản dịch vụ: để có thể truy cập được, mô tả dịch vụ phải được xuất bản để nó có thể được tìm thấy và triệu gọi bởi một người dùng dịch vụ. Tìm kiếm dịch vụ: một người yêu cầu dịch vụ định vị một dịch vụ bằng cách yêu cầu nơi đăng ký dịch vụ một dịch vụ phù hợp với các tiêu chí đặt ra. Liên kết và thực thi dịch vụ: sau khi nhận được mô tả dịch vụ, người dùng sẽ gọi dịch vụ theo các thông tin mô tả. Như hình 5.2, đầu tiên thành phần cung cấp dịch vụ sẽ đăng ký dịch vụ của mình với một UDDI service (thông tin đăng ký được đặc tả theo định dạng gọi là ngôn ngữ đặc tả dịch vụ – WSDL), khi đã đăng ký rồi thì thành phần sử dụng dịch vụ nếu muốn sử dụng thì sẽ truy xuất UDDI Service để lấy thông tin về vị trí service hiện đang đặt trên địa chỉ nào, sau đó thực hiện request service mong muốn và sau khi chạy service đó sẽ response kết quả về cho phía sử dụng dịch vụ.

4.1.4 Xây dựng ứng dụng theo kiến trúc HDV. Trong sự tiến hoá của các kỹ thuật xây dựng phần mềm, kỹ thuật lập trình hướng đối tượng thích hợp để cài đặt các thành phần. Trong khi các thành phần lại là cách thích hợp nhất để cài đặt các dịch vụ, mặc dù cần hiểu rằng một ứng dụng dựa thành phần tốt không cần thiết là một ứng dụng dịch vụ tốt. Khi vai trò của dịch vụ trong kiến trúc ứng dụng được hiểu rõ, chúng ta có thể tích hợp các thành phần mới và các thành phần hiện có. Hình 1.14 minh hoạ cách cài đặt ở mức độ đóng gói cao hơn khi tiến gần tới người sử dụng, nó cũng cho thấy dịch vụ là cách thích hợp để thể hiện khung nhìn ngoài của hệ thống với sự tái sử dụng bên trong có sử dụng thiết kế thành phần truyền thống. 65

Figure 4.3: Các tầng cài đặt trong thiết kế: đối tượng, thành phần, dịch vụ

4.1.4.1 Các nguyên tắc trong thiết kế hướng dịch vụ Việc tiếp cận xây dựng các hệ thống dựa trên mô hình hướng dịch vụ phải tuân theo bốn nguyên tắc sau: Nguyên tắc 1: Giao diện của dịch vụ phải rõ ràng. Các dịch vụ tương tác qua việc truyền đi các thông điệp tường minh. Chúng ta không cần biết về không gian nằm sau giao diện của dịch vụ. Vượt qua các giao diện của dịch vụ có thể tốn nhiều công sức và chi phí. Các giao diện rõ ràng cho phép cài đặt các tương tác độc lập- nghĩa là không cần biết về nền tảng hay ngôn ngữ lập trình được lựa chọn để cài đặt. Nguyên tắc 2: Dịch vụ là tự trị. Các dịch vụ hoạt động như là các thực thể độc lập. Không có quyền làm chủ trong một môi trường hướng dịch vụ. Các dịch vụ được triển khai, thay đổi, quản lý một cách độc lập. Nguyên tắc 3:Các dịch vụ chia sẻ giao diện và giao ước không chia sẻ cài đặt. Các dịch vụ tương tác với nhau chỉ dựa vào giao diện và giao ước sử dụng dịch vụ. Giao ước của dịch vụ mô tả cấu trúc của thông điệp và các ràng buộc giữa các thông điệp, điều này cho phép chúng ta bảo toàn được tính toàn vẹn của dịch vụ. Các giao ước và giao diện phải được duy trì tính ổn định với thời gian. Vì vậy việc xây dựng chúng một cách mềm dẻo là rất quan trọng. Nguyên tắc 4: Tính tương thích của dịch vụ phải dựa trên chính sách. Cả người cung cấp và người dùng dịch vụ sẽ phải có các chính sách để tương tác qua các giao diện của dịch vụ. Một ví dụ đơn giản về chính sách phía người cung cấp là một dịch vụ có thể đòi hỏi người gọi phải có một tài khoản hợp lệ với người cung cấp dịch vụ. Về phía người dùng dịch vụ, một tổ chức có thể đòi hỏi các lời kêu gọi qua Internet phải được mã hoá.

4.1.4.2 Các quyết định thiết kế và kiến trúc trong kiến trúc hướng dịch vụ Có rất nhiều quyết định thiết kế và kiến trúc là nền tảng cho SOA để đạt được các mục tiêu và lợi ích mà kiến trúc này đã nêu ra. Các quyết định kiến trúc thường liên quan tới việc chọn lựa các công nghệ và sản 66 CHƯƠNG 4. BÀI 4: KIẾN TRÚC HƯỚNG DỊCH VỤ (WEBSERVICE) phẩm cần thiết kế để đáp ứng chất lượng cho các thuộc tính dịch vụ được yêu cầu bởi một quy trình nghiệp vụ. Các quyết định thiết kế tập trung vào các lựa chọn dịch vụ sử dụng kỹ thuật được mô tả sau trong phân tích và thiết kế hướng đối tượng. Một số các quyết định chính là:

1. Xác định dịch vụ: các quyết định thiết kế quyết định thành công một kiến trúc hướng dịch vụ. 2. Thiết kế cài đặt thành phần chứa: các quyết định thiết kế và kiến trúc rất quan trọng để một dịch vụ cung cấp các chức năng cho việc mở rộng và bảo trì. 3. Mức độ đóng gói : các lựa chọn thiết kế về dịch vụ phải phù hợp với mức độ tái sử dụng và mềm dẻo được yêu cầu trong ngữ cảnh cụ thể. Các dịch vụ có mức độ đóng gói cao hơn có thể trợ giúp việc đóng gói các thay đổi trong các dịch vụ kỹ thuật có mức độ đóng gói thấp hơn (các dịch vụ này thường có xu hướng thay đổi thường xuyên hơn so với các nghiệp vụ ở ở mức cao hơn). Các nhân tố của tính mềm dẻo sẽ là các tiêu chuẩn chính cho việc đóng gói hơn là việc chỉ đơn thuần đóng gói chức năng. 4. Tính gắn kết không chặt chẽ và cấu hình lại động là một quyết định thiết kế yêu cầu việc tách giao diện khỏi cài đặt giao thức thông qua các chuẩn mở. Kết nối giữa các thành phần cung cấp và sử dụng dịch vụ cần phải bền vững và được cấu trúc rõ ràng, có khả năng cấu hình lại linh hoạt. Có khả năng cấu hình lại có nghĩa là các thành phần sử dụng dịch vụ và các thành phần cung cấp dịch vụ hiện có thể được lắp ghép lại với các chức năng không bị thay đổi để đạt được các giải pháp nghiệp vụ trong các môi trường kỹ thuật khác nhau và với các ràng buộc thao tác khác nhau của các đối tác kinh doanh mới.

Các tầng SOA: Các thành phần của một kiến trúc hướng dịch vụ. Danh mục dịch vụ: mô tả các dịch vụ nghiệp vụ trogn SOA, bao gồm một danh sách, phân loại và cấu trúc của các dịch vụ được xác định thông qua kỹ thuật phân tích và thiết kế hướng dịch vụ. Các thành phần: cung cấp các cài đặt chức năng cuả dịch vụ. Thành phần sử dụng dịch vụ, thành phần cung cấp dịch vụ và thành phần môi giới dịch vụ với các kho đăng ký dịch vụ, ở đó, các định nghĩa và mô tả dịch vụ được xuất bản. Các tầng của SOA: vị trí của các thành phần và dịch vụ. Hình 5.4 mô tả các tầng của SOA. Với mỗi tầng, các quyết định thiết kế và kiến trúc được tiến hành. 67

Figure 4.4: Các tầng của SOA.

Tầng 1: tầng dưới cùng, mô tả các hệ thống vận hành. Tầng này chứa các hệ thống hoặc các ứng dụng hiện có, bao gồm các ứng dụng được đóng gói, các ứng dụng đang có, và các cài đặt hệ thống hướng đối tượng theo kiểu cũ cũng như các ứng dụng thu thập nghiệp vụ. Kiến trúc theo tầng của một kiến trúc hướng đối tượng có thể thúc đẩy các hệ thống hiện có, tích hợp chúng bằng cách sử dụng tích hợp hướng dịch vụ. Tầng 2: tầng thành phần, sử dụng các kỹ thuật và thiết kế dựa đối tượng chứa trong phát triển hướng thành phần truyền thống. Tầng 3: cung cấp các cơ chế để lấy các thành phần ở quy mô doanh nghiệp, các thành phần cho từng đơn vị doanh nghiệp cụ thể, và trong một số trường hợp là các thành phần của từng dự án và cung cấp các dịch vụ thông qua các giao diện của chúng. Trong tầng này, các giao diện được thể hiện ra ngoài thông qua các đặc tả dịch vụ, ở đó, các dịch vụ tồn tại một cách độc lập hoặc là tổng hợp của một số dịch vụ. Tầng 4: là một sự tiến hoá của việc tổng hợp dịch vụ các luồng hoặc sắp đặt các nhiệm vụ đượcc phân nhóm vào một luồng để hoạt động như một ứng dụng. Các ứng dụng này hỗ trợ các trường hợp sử dụng các quy trình nghiệp vụ cụ thể. ở đây, các công cụ tổng hợp luồng trực quan có thể được sử dụng để thiết kế luồng ứng dụng. Tầng 5: Tầng trình diễn thường nằm ngoài phạm vi của một kiến trúc hướng dịch vụ. Tầng 6: cho phép sự tích hợp của các dịch vụ thông qua việc định tuyến tin cậy và thông minh, giao thức trung gian, và một số cơ chế chuyển đổi khác, thường đựơc mô tả như là một tuyến dịch vụ doanh nghiệp (ESB- Enterprise Services Bus). Tầng 7: đảm bảo chất lượng dịch vụ thông qua các cơ chế cảm biến và đáp ứng các công cụ kiểm soát các ứng dụng SOA. 68 CHƯƠNG 4. BÀI 4: KIẾN TRÚC HƯỚNG DỊCH VỤ (WEBSERVICE)

4.1.4.3 Các mức độ chấp nhận kiến trúc hướng dịch vụ Việc sử dụng kiến trúc hướng dịch vụ không bị giới hạn cho các tổ chức hơn. Trong thực tế, kiến trúc này tạo ra cơ hội cho các tổ chức vừa và nhỏ. Một ví dụ về việc các doanh nghiệp nhỏ có thể sử dụng dịch vụ là việc nhận các hoá đơn: chúng ta có thể dùng dịch vụ mạng để tạo ra một dịch vụ nhận hoá đơn. Các hoá đơn này sẽ được lưu trữ bởi dịch vụ cho đến khi hệ thống kế toán trên máy PC của người dùng kết nối đến nó để nhận hoá đơn về bằng cách sử dụng dịch vụ mạng. Các hoá đơn sau đó có thể cập nhận một cách tự động trên PC... Bằng cách này, bất kỳ tổ chức nào, không phụ thuộc vào quy mô lớn hay nhỏ, đều có thể nhận được lợi ích từ việc sử dụng kiến trúc hướng dịch vụ. Một tổ chức có thể dùng nhiều cách khác nhau để tiếp nhận được kiến trúc hướng dịch vụ, tuỳ thuộc vào mục tiêu và các ràng buộc công nghệ thông tin.

Figure 4.5: Các mức độ thực hiện kiến trúc hướng dịch vụ

Mức độ 1: Cài đặt các dịch vụ riếng lẻ. Mức độ này tạo ra các dịch vụ từ các nhiệm vụ có trong các ứng dụng mới hoặc các ứng dụng hiện có. Kiến trúc hướng dịch vụ đem lại khả năng thiết kế các ứng dụng và các hệ thống cung cấp dịch vụ cho các ứng dụng khác thông qua các giao diện được xuất bản. Cách tạo ra các ứng dụng này có thể đưa đến một mô hình lập trình manh hơn, linh hoạt hơn, giảm chi phí cả trong phát triển và bảo trì. Mức độ 2: Tích hợp hướng dịch vụ các chức năng nghiệp vụ Mức độ tiếp theo là tích hợp hướng dịch vụ. Bước này bao gồm việc tích hợp các dịch vụ từ nhiều ứng dụng khác nhau cả bên trong lẫn bên ngoài doanh nghiệp để phục vụ cho mục đích nghiệp vụ. Mức độ này cũng phảI hỗ trợ nhiều kiểu tích hợp, bao gồm: Tích hợp ứng dụng: gồm cả sự phát triển các giao diện mới để thể hiện các ứng dụng hiện có. Tích hợp thông tin: gồm cả dữ liệu doanh nghiệp và dữ liệu phòng ban. Tích hợp thông tin : gồm tích hợp qua sự tích hợp, sắp xếp các ứng dụng và dịch vụ với nhiều giao diện. Tích hợp hệ thống: gồm sự kết nối các hệ thống không đồng nhất, các hệ thống hiện có và tích hợp ứng dụng. 69

Mức độ 3: Chuyển đổi doanh nghiệp công nghệ thông tin có quy mô lớn. Mức cài đặt SOA rộng hơn là một cài đặt được kiến trúc hoá cho phép tích hợp nhiều chức năng nghiệp vụ trogn toàn doanh nghiệp. Mức dộ 4: Chuyển đổi nghiệp vụ theo yêu cầu. Đây là mức độ cuối cùng trong phát triển theo kiến trúc hướng dịch vụ. Mức độ này là sự định hướng chiến lược hướng tới sự chuyển đổi rộng của các mô hình nghiệp vụ hiện có hoặc sự triển khai của các mô hình nghiệp vụ mới.

4.1.4.4 Các bước trong quy trình phát triển phần mềm theo định hướng dịch vụ Hiện nay chưa có một quy trình cụ thể để phát triển các ứng dụng theo kiến trúc hướng dịch vụ, tuy nhiên, dựa trên thực tế, 12 bước sau đã được đưa ra nhằm tham khảo quyết định chuyển sang hướng dịch vụ. Mười hai bước trong quy trình phát triển phần mềm theo kiến trúc hướng dịch vụ: Hiểu nghiệp vụ. Xác định phạm vi (miền) của vấn đề. Hiểu tất cả ngữ nghĩa của ứng dụng trong miền đó. Hiểu tất cả các dịch vụ hiện có trong miền. Hiểu tất cả các nguồn và đích của thông tin có trong miền. Hiểu tất cả các quy trình trong miền. Xác định và phân loại tất cả các giao diện bên ngoài miền cần thiết cho việc xây dựng ứng dụng (các dịch vụ và thông tin). Định nghĩa các dịch vụ mới và các ràng buộc thông tin của các ứng dụng dịch vụ đó. Định nghĩa các dịch vụ mới, cũng như các dịch vụ và ràng buộc thông tin cho các quy trình này. Lựa chọn tập công nghệ. Triển khai công nghệ SOA. Kiểm thử và đánh giá. Bước 1: Hiểu các mục đích nghiệp vụ, và xác định thành công. Đây là nhiệm vụ thu thập các yêu cầu cơ bản. Nó đòi hỏi phảI tiếp xúc với tài liệu, nhân sự và hệ thống để xác định thông tin cho phép việc tích hợp ứng dụng được xác định đúng để có thể phân tích, mô hình hoá và cải tiến. Chỉ sau khi thực hiện bước này thì thực thu tập giảI pháp thích hợp mới được ra đời. Cần lưu ý rằng có cả lợi ích hữu hình và vô hình từ việc cài đặt bất kỳ loại công nghệ nào. Lợi ích hữu hình bao gồm việc tiết kiệm chi phí tức thì, như việc tự động hoá một hệ thống bán theo đơn đặt hàng thay cho việc bán hàng thủ công. Lợi ích vô hình thì khó nhận biết hơn, như sự thoả mãn của khách hàng dẫn tới việc tăng doanh số bán hàng, hoặc cộng tác chặt chẽ hơn tăng cường chất lượng và cho phép cac nhân công trao đổi thông tin tốt hơn. Bước 2: Xác định miền vấn đề. Phải xác định phạm vi của việc ứng dụng SOA trong một tổ chức. Hãy chia nhỏ tổ chức để áp dụng SOA thay vì áp dụng vào toàn bộ tổ chức. Cùng với thời gian, những thành công nhỏ sẽ dẫn tới các chiến lược thành công lớn hơn, phải thiết lập các đường ranh giới khi bắt đầu dự án có thể tiến hành xây dựng ứng dụng một cách trọng tâm hơn. Bước 3: Hiểu tất cả các ngữ nghĩa ứng dụng trong miền vấn đề. Chúng ta không thể giải quyết các vấn đề mà bản thân mình không hiểu rõ. Vì vậy, bước tiếp theo này là cực kỳ quan trọng để xác định tất cả các siêu dữ liệu ngữ nghĩa tồn tại trong miền ứng dụng nhằm giải quyết các vấn đề một cách hoàn hảo. Sự hiểu biết về ngữ nghĩa ứng dụng thiết lập cách thức và khuôn dạng trong đó ứng dụng tham khảo cac thuộc tính của quy trình nghiệp vụ. Ví dụ, cùng một số hiệu khách hàng nhưng trong một ứng dụng này có một giá trị và ý nghĩa hoàn toàn khác trong một ứng dụng khác. Việc hiểu ngữ nghĩa của ứng dụng đảm bảo rằng sẽ không có bất kỳ sự xung đột thông tin nào khi nó được tích hợp với các ứng dụng khác ở mức độ thông tin hoặc dịch vụ. Xác định ngữ nghĩa của ứng dụng là một công việc khó khăn vì có thể nhiều hệ thống mà chúng ta đang phân tích đã cũ hoặc mang tính độc quyền. Bước đầu tiên trong việc xác định và định vị ngữ nghĩa là tạo ra một danh sách các hệ thống ứng viên. Danh sách này sẽ cho phép chúng ta có thể xác định những kho chứa dữ liệu nào tồn tại trong các hệ thống đó. Bất kỳ công nghệ nào có thể xây dựng lại các lược đồ dữ liệu vật lý và logic cũng sẽ có ích trong việc xác định dữ 70 CHƯƠNG 4. BÀI 4: KIẾN TRÚC HƯỚNG DỊCH VỤ (WEBSERVICE) liệu trong các miền vấn đề. Tuy nhiên, trong khi lược đồ và mô hình dữ liệu có thể cho phép nhìn vào cấu trúc của cơ sở dữ liệu thì chúng lại không thể xác định những thông tin đó được sử dụng như thế nào trong ngữ cảnh của dịch vụ hoặc ứng dụng; đó là lý do chúng ta cần tới các bước tiếp theo, Bằng việc hiểu rõ các ngữ nghĩa của ứng dụng, và đảm bảo rằng tất cả các hệ thống nguồn và đích trong và giữa các tổ chức được tích hợp một cách hoàn hảo. Bước 4: Hiểu tất cả các dịch vụ hiện có trong miền. Tìm hiểu các thông tin về dịch vụ, bao gồm:

1. Vị trí của dịch vụ. 2. Mục đích của dịch vụ. 3. Thông tin ràng buộc của dịch vụ. 4. Các phụ thuộc (nếu đó là một dịch vụ phức hợp). 5. Các vấn đề bảo mật.

Vị trí tốt nhất để bắt đầu tìm hiểu là thư mục dịch vụ. Giống như các thư mục khác, đây là một kho chứa các thông tin được thu nhập về các dịch vụ hiện có, cùng với các tài liệu về mỗi dịch vụ, bao gồm mục đích của dịch vụ, các thông tin vào/ra.. Thư mục này được sử dụng cùng với những hiểu biết về ngữ nghĩa của ứng dụng để xác định các điểm tích hợp trong tất cả các hệ thống của miền vấn đề. Bước 5: Hiểu tất cả các nguồn và đích thông tin hiện có trong miền vấn đề. Bước này xác định các giao diện xử lý các thông tin đơn giản. Chúng có thể thực hiện một trong hai vai trò: sử dụng thông tin (đích) hoặc cung cấp thông tin ( nguồn). Chúng ta cần phải hiểu rõ khía cạnh sau: Vị trí của chúng. Cấu trúc của luồng thông tin vào/ra. Các ràng buộc tích hợp. Các phụ thuộc (các nguồn và đích khác, cũng có thể là các dịch vụ). Các vấn đề bảo mật. Bước 6: Hiểu tất cả các quy trình. Chúng ta cần xác định và liệt kê tất cả các quy trình nghiệp vụ tồn tại trong miền vấn đề, có thể là tự động hoá hoặc không phải là tự động hoá. Việc này rất quan trọng vì chúng ta đã biết dịch các dịch vụ và nguồn/đích thông nào hiện có, chúng ta cần xác định các cơ chế tương tác cao hơn, bao gồm tất cả các quy trình ở mức độ cao, mức trung bình và mức thấp. Trong nhiều trường hợp, những quy trình này vẫn chưa được tự động hoá hoặc chỉ có một phần được tự động hóa. Ví dụ, nếu một kiến trúc sư tích hợp ứng dụng cần hiểu tất cả các quy trình hiện có trong một ứng dụng kiểm kê, anh ta sẽ hoặc là đọc tài liệu hoặc là đọc mã nguồn để xác định quy trình nào đang được thực hiện. Sau đó, anh ta sẽ đưa quy trình nghiệp vụ vào phân loại và xác định mục đích của quy trình, ai là người sở hữu nó, nó chính xác là gì, và công nghệ thực hiện nó (Java hoặc C++...). Những quy trình này sau đó được gán với các quy trình mới để đáp ứng được các yêu cầu nghiệp vụ. Chúng ta cần phải xem xét khái niệm quy trình chia sẻ và quy trình riêng. Một số quy trình là quy trình riêng, và do đó, chúng không chia sẻ với các thực thể bên ngoài( trong một số trường hợp, chúng thậm chí còn không chia sẻ với các phần khác của tôt chức). Các quy trình chia sẻ và quy trình riêng có thể tồn tại trong cùng một không gian quy trình với công nghệ tích hợp quy trình quản lý bảo mật giữa các người dùng. Một số thông tin có thể được bảo trì trong phân loại, đó là thông tin bao gồm các biến được sử dụng trong các quy trình, các lược đồ đối tượng, các yêu cầu bảo mật, và/ hoặc các đặc điểm hiệu suất. Mỗi phân lịa quy trình phải duy trì tập thuộc tính riêng của nó, được xây dựng tuỳ biến cho mỗi yêu cầu tích hợp ứng dụng cụ thể. Bước 7: Xác định và phân loại tất cả các giao diện bên ngoài miền cần thiết cho việc xây dựng ứng dụng. Chúng ta cần xác định tất cả các giao diện bên ngoài mà các hệ thống trong miền của vẩn đề của chúng ta có tương tác với hoặc cần tương tác với để đem lại giá trị tối đa. Điều quan trọng ở đây là phải chắc chắn rằng tất cả các giao diện cần thiết đều được xác định, bao gồm khả năng thể hiện các dịch vụ của miền đề 71 ra bên ngoài cho các đối tác, cũng như khả năng nhận biết và thúc đẩy dịch vụ của họ. Các hệ thống của đối tác và của chúng ta cần hoạt động cùng nhau để hỗ trợ các quy trình chia sẻ chung. Bước 8: Xác định các dịch vụ mới, các dịch vụ phức hợp và thông tin buộc đối với các dịch vụ đó. Chúng ta cần xác định tất cả các dịch vụ tạo thành SOA; những dịch vụ này được chia làm 3 loại/ Bước 9: Xác định các quy trình mới, cũng như các dịch vụ và thông tin ràng buộc với các quy trình đó. Đến bước này, chúng ta cần hiểu phần lớn những thành phần cần thiết để xác định các quy trình mới cũng như liên kết chúng với các quy trình hiện có tự động hoá các quy trình mà trước chưa được tự động hoá. Bước 10: Lựa chọn tập công nghệ. Có rất nhiều các công nghệ để lựa chọn, gồm các máy chủ ứng dụng, các đối tượng phân tán, và các máy chủ tích hợp. Sự lựa chọn công nghệ sẽ giống như một sự tổng hợp các sản phẩm và các nhà cung cấp để đáp ứng yêu cầu cho SOA. Rất hiếm có trường hợp một nhà cung cấp duy nhất có khả năng giải quyết được vấn đề. Lựa chọn công nghệ là một công việc khó khăn yêu cầu một lượng thời gian và công sức đáng kể. Việc tạo ra tiêu chuẩn cho công nghệ và sản phẩm, việc hiểu rõ ràng các giải pháp được đưa ra, và sau đó nối các tiêu chuẩn với các sản phẩm đó là một công việc không dễ dàng. Đê thành công, việc kết nối tiêu chuẩn với sản phẩm thường đòi hỏi một dự án thử nghiệm để chứng minh rằng nó sẽ hoạt động. Thời gian cần thiết để lựa chọn các công nghệ phù hợp có thể dài bằng thời gian phát triển SOA, nhưng nếu nản chí, có thể dẫn tới việc lựa chọn các công nghệ không phù hợp dẫn đến phá hỏng hệ thống. Bước 11: Triển khai công nghệ SOA. Đến bước này, chúng ta đã hiểu tất cả những gì cần thiết phải hiểu, đã xác định được các dịch vụ và quy trình mới, đã lựa chọn được tập công nghệ thích hợp, và bây giờ là thời gian để xây dựng hệ thống. Bước 12: Kiểm thử và đánh giá. Để đảm bảo cho việc kiểm thử cần xây dựng kế hoạch kiểm thử. Cần phải hiểu rằng 12 bước trên không phải là quy trình bắt buộc xây dựng một dự án SOA thành công. Trong một số trường hợp, chúng ta cần thêm vào hoặc loại bỏ đi một số bước để phù hợp vói yêu cầu cụ thể. Kiến trúc hướng dịch vụ được đưa ra nhằm loại bỏ sự trùng lặp và dư thừa qua việc tái sử dụng và tích hợp. Cách đơn giản nhất là để bắt đầu vói SOA là thử với một dịch vụ mà chúng ta biết rằng có nhiều cài đặt trong nhiều ứng dụng khác nhau, sau đó bắt đầu xây dựng kế hoạch và chiến lược để loại bỏ các dịch vụ dư thừa. Quy trình cài đặt này sẽ giúp chúng ta đáp ứng được các yêu cầu cơ bản của tổ chức ẩn sau bước chuyển đổi thành công sang SOA. Khi chúng ta đã thực hiện được quy trình này, chúng ta sẽ có các công cụ và hiểu biết để mở rộng quy mô áp dụng SOA trong tổ chức của mình.

4.1.5 Vòng đời phát triển của dịch vụ Việc đảm bảo rằng chỉ có các dịch vụ nghiệp vụ chuẩn hoá và có mức trừu tượng cao trong xây dựng và triển khai là mối quan tâm chính trong việc xây dựng các dịch vụ trong kiến trúc hướng dịch vụ. Chỉ với việc tập trung chú ý vào quy trình xác định dịch vụ mới đảm bảo việc cài đặt SOA trở lên hiên hiệu quả như mong đợi. Dưới đây là một vòng đời phát triển và định nghĩa dịch vụ cho phép tiến hành thực hiện việc xem xét và các điểm kiểm tra từ sớm trong quy trình định nghĩa dịch vụ. Điều này sẽ giúp loại bỏ lỗi trước khi chúng làm cho chi phí khắc phục lỗi tăng vọt khi dịch vụ được tiến hành phát triển và triển khai. 72 CHƯƠNG 4. BÀI 4: KIẾN TRÚC HƯỚNG DỊCH VỤ (WEBSERVICE)

Figure 4.6: Vòng đời phát triển dịch vụ

Hình trên mô tả vòng đời phát triển dịch vụ, mỗi trạng thái được định nghĩa như sau: Khởi tạo: một dịch vụ tiềm năng được xác định từ việc phân tích các yêu cầu của doanh nghiệp từ trên xuống (top – down) và việc mô hình hoá quy trình nghiệp vụ. Thu nhận: đội ngũ kiến trúc dịch vụ thông báo là đã nhận được yêu cầu dịch vụ và bắt đầu đánh giá nó. Chứng nhận: đội ngũ kiến trúc dịch vụ đã đánh giá dịch vụ và thống nhất giao diện chức năng của nó. Phân loại: dịch vụ được xác định và được chuyển giao cho đội phát triển. Cài đặt: đội ngũ phát triển dịch vụ cài đặt dịch vụ theo các quy tắc và hướng dẫn phát triển được định nghĩa bởi framework. Kiểm thử: đội ngũ kiểm thử dịch vụ kiểm chứng tính năng cũng như các đặc tính chất lượng của dịch vụ. Xuất bản: dịch vụ được xuất bản để có thể được sử dụng bởi các dịch vụ khác hoặc các ứng dụng định hướng quy trình.

4.1.6 Các công nghệ hướng dịch vụ 4.1.6.1 Sun JINI Công nghệ Jini cho phép xây dựng một hệ thống là một mạng của các dịch vụ. Các dịch vụ có thể được thêm vào và xoá bỏ khỏi mạng, và người dùng mới có thể tìm kiếm các dịch vụ hiện có. Tất cả đều xảy ra động, không có sự quản lý. Dịch vụ được dựa trên các giao diện đã được viết trong ngôn ngữ lập trình Java. Nó không quan tâm đến việc dịch vụ cài bằng phần cứng hay phần mềm. Đối tượng dịch vụ mà người dùng tải về được cung 73 cấp bởi các thành phần cung cấp dịch vụ. Client chỉ cần biết rằng họ đang làm việc với một cài đặt của một giao diện được viết bằng ngôn ngữ lập trình Java. Việc thiết kế dựa trên các giao diện dịch vụ cho phép xây dựng các hệ thống với tính sẵn dùng cao. Một thành phần có thể sử dụng bất kỳ dịch vụ nào phù hợp với giao diện, thay vì được cấu hình tĩnh để giao tiếp với một thành phần nhất định nào đó. Công nghệ Jini được xây dựng phía trên công nghệ Java (xem hình dưới). Phương thức triệu gọi từ xa của Java (RMI) cung cấp cơ chế thu rác từ xa của các đối tượng từ xa và khả năng chuyển trạng thái của đối tượng cũng như mã đối tượng qua mạng.

Figure 4.7: Mô hình kiến trúc Jini

Kiến trúc Jini bao gồm: Dịch vụ tra cứu (Looup Services): Dịch vụ tra cứu lưu trữ các dịch vụ Jini và cung cấp các uỷ nhiệm để truyền thông với dịch vụ, bản thân nó cũng là một dịch vụ Jini. Dịch vụ Jini(Jini services): Dịch vụ Jini được đăng ký với dịch vụ tra cứu và có khả năng được triệu gọi thông qua giao diện công khai của mình (giao diện này được định nghĩa thông qua một giao diện từ xa). Hệ thống nền tảng truyền thông của Jini là RMI. Thành phần sử dụng dịch vụ Jini (Jini Client): Thành phần sử dụng dịch vụ Jini là một phần mềm yêu cầu đối tượng uỷ nhiệm từ dịch vụ tra cứu để gọi dịch vụ Jini. Jini có một số các dịch vụ được xây dựng sẵn, bao gồm: Dịch vụ tìm kiếm tra cứu (Lookup Discovery Services): Dịch vụ tìm kiếm tra cứu thông báo cho các thành phần sử dụng dịch vụ về các thay đổi trong mạng Jini. Các dịch vụ có thể kết hợp hoặc tách ra khỏi mạng bất kỳ thời điểm nào. Dịch vụ tái tạo ràng buộc(Lease Renewal Services): Khái niệm tái tạo ràng buộc hỗ trợ mạng dịch vụ Jini tính naưng tự hàn gắn và khắc phục lỗi. Dịch vụ phải tái tạo ràng buộc không được tái tạo, dịch vụ sẽ là một ứng viên bị loại bỏ khỏi mạng lưới dịch vụ. 74 CHƯƠNG 4. BÀI 4: KIẾN TRÚC HƯỚNG DỊCH VỤ (WEBSERVICE)

Trách nhiệm của những người quản trị trong lĩnh vực này được giảm tới mức tối thiểu nhờ tính năng tự hàn gắn của hệ thống. Dịch vụ giao dịch (Transactor Services): Dịch vụ cho phép sử dụng các giao dịch trong một hệ thống phân tán. Thông thường, các tổ chức sử dụng cơ sở dữ liệu để tạo các hệ thống giao dịch. Dịch vụ giao dịch của Jini đưa tính năng giao dịch của cơ sở dữ liệu lên mạng. Các dịch vụ có thể tham gia vào các giao dịch để đảm bảo các thuộc tính ACID (Atomicity- Consistency- Isolation- Durability) gắn liền với giao dịch. Dịch vụ hộp thư sự kiện (Event MailBox Services): Các thay đổi trong mạng dịch vụ Jini đựơc truyền đi trogn hệ thống bằng cách sử dụng các sự kiện phân tán. dịch vụ hộp thư sự kiện hỗ trợ tính năng thông báo các sự sự kiện cho các dịch vụ ngay cả khi dịch vụ không được kích hoạt tại thời điểm hiện tại.

4.1.6.2 Openwings Openwings là một khung kiến trúc hướng dịch vụ cho việc xây dựng các hệ thống các siêu hệ thống (hệ thống của hệ thống). Mặc dù không bị ràng buộc cụ thể với Jini, nó cho phép xây dựng dựa trên các khải niệm của Java và Jini để cung cấp một giải pháp hoàn thiện hơn. Openwings có hàng loạt các dịch vụ cốt lõi hỗ trợ tính toán hướng đối tượng. Component Services (Các dịch vụ thành phần): cung cấp các kỹ thuật cho việc đưa ra công bố một dịch vụ trong hệ thống đảm bảo cho quá trình tìm kiếm phát hiện (discover), thông qua sử dụng component cung các thư viện cho phép: Tạo ra các khả năng cung cấp, định vị và sử dụng các dịch vụ nói chung trong hệ thống mà không phụ thuộc vào bất cứ kỹ thuật định vị/ tìm kiếm (location/lookup) nào. Ví dụ các kỹ thuật định vị/tìm kiếm như Jini, UDDI với mô hình Web-services, giao thức phát hiện (discovery) Bluetooth. Quá trình giao tiếp giữa các thành phần hay dịch vụ được định nghĩa với các API chuẩn cho các dịch vụ thông qua việc thiết kế thừa từ những giao diện chuẩn mà openwings đề xuất. Cung cấp các component API cho giao thức tương tác giữa các dịch vụ qua mạng mà không phụ thuộc vào tính năng đồng bộ hay không đồng bộ của các dịch vụ. Cung cấp khả năng điều khiển các dịch vụ thành phần ngay trong thời điểm dịch vụ đó đang được gọi thực thi. Hỗ trợ việc đưa ra các báo cáo về trạng thái của các thành phần tham gia vào hệ thống. Cho phép thiết lập môi trường thực tho động dựa theo yêu cầu tại thời điểm sử dụng. Qua hình vẽ minh hoạ sau, ta có thể thấy được vị trí trung tâm của các dịch vụ thành phần trong mô hình khung mà Openwings đề xuất: 75

Figure 4.8: Mô hình khung của Openwings

Install services (Các dịch vụ cài đặt): là một thành phần dịch vụ của framework cho phép thực hiện cài đặt các thành phần mới vào hệ thống. Để cài đặt được thì các thành phần này cần phải thông qua các quy trình chuẩn mà openwings đề xuất. Cung cấp các khả năng cài đặt thêm những dịch vụ mới để hạn chế tối đa các tương tác bằng tay cho người sử dụng. Đảm bảo không gây ảnh hưởng tới các thành phần hay dịch vụ đã được cài đặt trước đó. Cung cấp các khả năng tự động dò tìm và cho phép gọi thực hiện với các thành phần được lưu trữ trong các thiết bị lưu trữ tự động. Có cơ chế thẩm định quyền và độ ưu tiên cho việc cài đặt và gọi thực hiện. Có cơ chế huỷ cài đặt an toàn cho hệ thông khi cần thiết. Context Services (Các dịch vụ ngữ cảnh): là các thành phần cho hỗ trợ việc kết hợp các dịch vụ trong môi trường hệ thống để có được một dịch vụ lớn hơn. Đồng thời còn hỗ trợ việc kết hợp các dịch vụ được chia sẻ trong một mạng WAN. Management Services (các dịch vụ quản lý): cung cấp các phương thức cơ bản hỗ trợ việc quản lý các thành phần và dịch vụ trong hệ thống. Với các hỗ trợ từ dạng quản lý hệ thống qua can thiệp bầng 76 CHƯƠNG 4. BÀI 4: KIẾN TRÚC HƯỚNG DỊCH VỤ (WEBSERVICE)

tay hay thông qua việc cài đặt các cơ chế quản lý tự động. Các hỗ trợ này được đóng gói trong Mbean. Security Services (các dịch vụ kết bảo mật): cung cấp các phương thức cho việc mã hoá, truyền tải dữ liệu trong hệ thống, các hỗ trợ cơ bản cho việc cấp quyền, thẩm định quyền, đảm bảo an toàn khi truyền tin, tính toàn vẹn, khả năng phát hiện tấn công và đáp trả các tấn công vào hệ thống. Connector Services (các dịch vụ kết nối): cung cấp các kỹ thuật cho việc giao tiếp giữa các thành phần hay dịch vụ trong hệ thống. Hỗ trợ trực tiếp cho các kỹ thuật giao tiếp thông qua một đối tượng chuyển tiếp trung gian như CORBA, RMI, giao tiếp từ một giao diện dịch vụ được định hướng trước theo các kỹ thuật chuyển tiếp trung gian chuẩn với các cơ chế động ngay tại thời điểm diễn ra giao tiếp tuỳ theo yêu cầu sử dụng. Với đầy đủ các hỗ trợ cho việc giao tiếp theo phiên hay theo dạng giao tiếp không duy trì kết nối. Hỗ trợ đầy đủ các hàm cơ bản cho phép làm việc với RMI, CORBA, JMS, SOAP... Container Services (các dịch vụ chứa đựng): cung cấp môi trường tương ứng cho việc thực hiện các dịch vụ trong mô hình openwings. Đây là một thành phần quan trọng trong việc tạo nên khả năng vận hành động không phụ thuộc vào nền tảng hay môi trường vận hành phân tán của hệ thống. Cung cấp các khả năng gọi chạy dịch vụ trên máy hiện tại qua một nền hệ thống từ xa. Hỗ trợ việc quản lý vòng đời của các tiến trình dịch vụ, các phương thức cho phép tự động khởi động lại, tạm dừng hay huỷ dịch vụ. Cung cấp khả năng gán hay thiết lập cho một số tiến trình xây dựng bằng Java có thể hoạt động độc lập trên các máy ảo Java mà không ảnh hưởng tới các thành phần khác. Hỗ trọ việc gọi khởi động các dịch vụ không được xây dựng trên nền Java. Cung cấp các phương thức cho ohép theo dõi tài nguyên hệ thống như theo dõi các thông tin về độ dung lượng trong bộ nhớ, khả năng hoạt động của bộ vi xử lý hay khả năng đáp ứng lưu lượng của đường truyền tải dữ liệu.

4.1.6.3 Dịch vụ web Mặc dù các khái niệm nền tảng cho kiến trúc hướng dịch vụ đã được thiết lập từ trước khi dịch vụ mạng xuất hiện nhưng dịch vụ mạng vẫn đóng một vai trò quan trọng trong một kiến trúc hướng dịch vụ. Đó là bởi vì dịch vụ mạng được xây dựng trên một tập các giao thức được biết tớí nhiều và độc lập về nền tảng. Các giao thức này bao gồm HTTP, XML, UDDI, và SOAP. Chính sự kết hợp của các giao thức này đã làm dịch vụ mạng đáp ứng đựơc các yêu cầu của chính kiến trúc hướng dịch vụ: SOA yêu cầu dịch vụ phải được phát hiện và triệu gọi động, yêu cầu này được thoả mãn bằng UDDI, WSDL, và SOAP; SOA yêu cầu dịch vụ có một giao ước giao diện độc lập nền tảng, yêu cầu này được thoả mãn bởi XML; SOA nhấn mạnh tới tính liên thông, yêu cầu này được thoả mãn bởi HTTP. Đây là lý do tại sao các dịch vụ mạng mang lại có vai trò trung tâm trong kiến trúc hướng dịch vụ. Chi tiết hơn về dịch vụ mạng sẽ được đề cập trong chương sau.

4.1.6.4 Enterprise Services Bus (ESB) Các công nghệ dựa trên nền dịch vụ mạng ngày càng được ứng dụng rộng rãi trong phát triển và tích hợp ứng dụng trong các tổ chức. Một trong những vấn đề nổi lên hiện nay là việc tìm kiếm các phương pháp hiệu quả hơn trong việc thiết kế, phát triển và triển khai dịch vụ mạng dựa trên các hệ thống kinh doanh; quan trọng hơn nữa là việc chuyển kiểu truyền thông dịch vụ mạng điểm tới điểm tới các ứng dụng lớn hơn của các công nghệ này thành các quy trình kinh doanh ở mức xí nghiệp. Trong bối cảnh này, mô hình ESB đang xuất hiện như một bước tiến mới trong sự phát triển của dịch vụ mạng và kiến trúc hướng đối tượng. 77

Figure 4.9: Mô hình ESB

Dịch vụ mạng cơ bản: Dịch vụ mạng cơ bản (SOAP/HTTP điểm tới điểm) cung cấp một nền tảng vững trắc cho việc cài đặt một kiến trúc hướng dịch vụ, nhưng có những vấn đề ảnh hưởng tới tính mềm dẻo và khả năng bảo trì của chúng trong các kiến trúc ở quy mô xí nghiệp. Thứ nhất, bản chất điểm tới điểm của dịch vụ mạng cơ bản có nghĩa là người dùng dịch vụ thường cần phải được sửa đổi bất kỳ khi nào giao diện người cugn cấp dịch vụ thay đổi. Điều này không thành vấn đề trên quy mô nhỏ, nhưng trong các xí nghiệp lớn chúng ta sẽ phải phải thay đổi đối với các trình khách đã có. Thứ hai chúng ta có thể kết thúc bằng một kiến trúc dễ đổ vỡ và không linh hoạt khi một số dung lượng lớn người dùng dịch vụ và người cung cấp dịch vụ liên lạc với nhau sử dụng các kết nối kiểu điểm tới điểm hỗn loạn. Cuối cùng, dịch vụ mạng cơ bản đòi hỏi mỗi người dùng phải có một bộ điều hợp giao thức thích hợp với mỗi nhà cung cấp dịch vụ. Việc phải triển khai nhiều bộ điều hợp giao thức trên nhiều ứng dụng khách làm tăng giá thành và chi phí bảo trì. Cách tiếp cậu ESB sẽ giải quyết được những vấn đề này. Vậy ESB là gì ? Khái niệm ESB không phải là một sản phẩm, nhưng là một thực tiễn kiến trúc tốt nhất cho việc cài đặt một kiến trúc hướng dịch vụ. Như chỉ ra trong hình dưới, nó thiết lập một đường bus thông điệp lớp xí nghiệp kết hợp hạ tầng thông điệp với sự chuyển đổi thông điệp và đinh tuyến dựa vào nội dung trong một tâng tích hợp logic giữa những người dùng và người cung cấp dịch vụ. Mục đích của ESB là cung cấp một sự trừu tượng hoá về các nguồn tài nguyên của doanh nghiệp, cho phép các nghiệp vụ của doanh nghiệp có thể được phát triển và quản lý độc lập với hạ tầng, mạng và có sự có mặt của các dịch vụ doanh nghiệp khác. Các nguồn tài nguyên trong ESB được mô hình như những dịch vụ có một hay nhiều thao tác. 78 CHƯƠNG 4. BÀI 4: KIẾN TRÚC HƯỚNG DỊCH VỤ (WEBSERVICE)

Cài đặt một ESB đòi hỏi một tập hợp được tích hợp của các dịch vụ phần giữa hỗ trợ các kiểu kiến trúc như sau: Các kiến trúc hướng dịch vụ: ở đây, các ứng dụng phân tán bao gồm các dịch vụ có thể sử dụng lại được với các giao diện rõ ràng, có thể được xuất bản và tương thích với các chuẩn. Các kiến trúc hướng thông điệp: ở đây, các ứng dụng gửi thông điệp qua ESB tới các ứng dụng nhận thông điệp. Các kiến trúc hướng sự kiện: ở đây, các ứng dụng tạo mới và sử dụng các thông điệp độc lập lẫn nhau. Các dịch vụ phần giữa(middleware): đựơc cung cấp bởi một ESB cần chứa: Phần giữa truyền thông hỗ trợ nhiều mô hình truyền thông (như đồng bộ, không đồng bộ, yêu cầu/ trả lời, một chiều...), chất lượng dịch vụ (bảo mật, hiệu năng...), các API, nền tảng và các giao thức độc lập. Một cơ chế cho việc chèn xử lý thông minh của các lần yêu cầu và đáp ứng dịch vụ trong mạng. Các công cụ dựa theo chuẩn để cho phép sự tích hợp nhanh chóng của các dịch vụ. Hệ thống quản lý cho các ứng dụng liên kết lỏng và các tương tác của chúng. Kiến trúc hướng dịch vụ xác định một kiến trúc hướng dịch vụ trừu tượng nhằm mục đích xây dựng các hệ thốn phần mềm bằng cách liên kết và kết tập các dịch vụ cục bộ và từ xa một cách mềm dẻo. Trong khi các mô hình kiến trúc trước đó kiểm soát tính phức tạp bằng cách gom nhóm các chức chung, SOA lại cố gắng thực hiện việc xác định các yêu cầu kiến trúc cụ thể đảm bảo rằng các công nghệ hỗ trợ đảm nhiệm trách nhiệm công nghệ chính. Bằng cách này, SOA đạt được một kiểu kiến trúc trừu tượng mà tập trung chính vào việc lắp ráp các hoạt động nghiệp vụ theo các yêu cầu. Công nghệ dịch vụ mạng hiện tại đang là một công nghệ hỗ trợ nổi bật nhất cho SOA. Nó cung cấp khả các giải pháp kỹ thuật cho phép thực hiện hoá các thành phần của hệ thống phần mềm theo kiến trúc hướng dịch vụ. Với sự chú trọng tập trung vào việc thiết kế các quy trình nghiệp vụ, SOA yêu cầu việc phát triển phần mềm tương tác chặt chẽ với môi trường nghiệp vụ. Một sự tham gia tích cực của các nhà quản lý và phân tích nghiệp vụ có thể cải tiến một cách đáng kể kết quả của việc thiết kế hệ thống. Chương 5

Bài 5: Thiết kế mẫu (Design Pattern)

5.1 Thiết kế mẫu (Design Pattern)1

5.1.1 Giới thiệu và phân loại thiết kế mẫu Trong phát triển phần mềm hiện đại, kiến trúc tổng thể của dự án đóng một vai trò quan trọng, đặc biệt với bộ khung (framework) và mẫu thiết kế (design pattern). Bài viết này sẽ giúp các bạn hiểu được một cách tổng quan về pattern cũng như cách thức thiết kế một số pattern tiêu biểu. PATTERN là gì? Pattern mô tả một giải pháp chung đối với một vấn đề nào đó trong thiết kế thường được “lặp lại” trong nhiều dự án. Nói một cách khác, một pattern có thể được xem như một “khuôn mẫu” có sẵn áp dụng được cho nhiều tình huống khác nhau để giải quyết một vấn đề cụ thể. Trong bất kỳ hệ thống phần mềm hướng đối tượng nào chúng ta cũng có thể bắt gặp các vấn đề lặp lại. Đặc điểm chung: • Pattern được hiểu theo nghĩa tái sử dụng ý tưởng hơn là mã lệnh. Pattern cho phép các nhà thiết kế có thể cùng ngồi lại với nhau và cùng giải quyết một vấn đề nào đó mà không phải mất nhiều thời gian tranh cãi. Trong rất nhiều trường hợp, dự án phần mềm thất bại là do các nhà phát triển không có được sự hiểu biết chung trong các vấn đề về kiến trúc phần mềm. Ngoài ra, pattern cũng cung cấp những thuật ngữ và khái niệm chung trong thiết kế. Nói một cách đơn giản, khi đề cập đến một pattern nào đấy, bất kỳ ai biết pattern đó đều có thể nhanh chóng hình dung ra “bức tranh” của giải pháp. Và cuối cùng, nếu áp dụng pattern hiệu quả thì việc bảo trì phần mềm cũng được tiến hành thuận lợi hơn, nắm bắt kiến trúc hệ thống nhanh hơn. • Pattern hỗ trợ tái sử dụng kiến trúc và mô hình thiết kế phần mềm theo quy mô lớn. Cần phân biệt design pattern với framework. Framework hỗ trợ tái sử dụng mô hình thiết kế và mã nguồn ở mức chi tiết hơn. Trong khi đó, design pattern được vận dụng ở mức tổng quát hơn, giúp các nhà phát triển hình dung và ghi nhận các cấu trúc tĩnh và động cũng như quan hệ tương tác giữa các giải pháp trong quá trình thiết kế ứng dụng đối với một chuyên khu riêng biệt. • Pattern đa tương thích. Pattern không phụ thuộc vào ngôn ngữ lập trình, công nghệ hoặc các nền tảng lớn như J2EE của Sun hay Microsoft .NET Framework. Tiềm năng ứng dụng của pattern là rất lớn. Các thiết kế dựa trên pattern được sử dụng khá nhiều ở các phần mềm mã nguồn mở, trong nền tảng J2EE hoặc .NET... Trong các dạng ứng dụng này, có thể dễ dàng nhận ra một số tên lớp chứa các tiền tố hoặc hậu tố như Factory, Proxy, Adapter... Phân loại pattern Pattern được phân loại ra làm 3 nhóm chính sau đây: • Nhóm cấu thành (Creational Pattern): Gồm Factory, Abstract Factory, Singleton, Prototype, Builder... Liên quan đến quá trình khởi tạo đối tượng cụ thể từ một định nghĩa trừu tượng (abstract class,

1This content is available online at .

79 80 CHƯƠNG 5. BÀI 5: THIẾT KẾ MẪU (DESIGN PATTERN)

interface). • Nhóm cấu trúc tĩnh (Structural Pattern): Gồm Proxy, Adapter, Wrapper, Bridge, Facade, Flyweight, Visitor... Liên quan đến vấn đề làm thế nào để các lớp và đối tượng kết hợp với nhau tạo thành các cấu trúc lớn hơn. • Nhóm tương tác động (Behavioral Pattern): Gồm Observer, State, Command, Iterator... Mô tả cách thức để các lớp hoặc đối tượng có thể giao tiếp với nhau. Trong phần này ta sẽ tìm hiểu về các mẫu thiết kế trong nhóm mẫu kiến tạo (Creational Pattern).Mẫu kiến tạo (Creational Pattern) Những mẫu này hỗ trợ cho một trong những nhiệm vụ của lập trình hướng đối tượng – khởi tạo đối tượng trong hệ thống. Hầu hết các hệ thống hướng đối tượng phức tạp yêu cầu nhiều đối tượng được thể hiện theo thời gian, và các mẫu này hỗ trợ cho việc tạo các tiến trình bằng việc cung cấp các khả năng: - Sự thể hiện chung – Điều này cho phép các đối tượng được tạo ra trong hệ thống không cần phải định nghĩa một đặc tả kiểu lớp trong mã nguồn - Đơn giản – Một vài mẫu làm cho việc khởi tạo đối tượng trở nên dễ dàng, vì vậy lớp “gọi” khởi tạo đối tượng không phải viết mã nhiều cũng như phức tạp.

5.1.1.1 Abstract Factory Method Pattern

- Ý nghĩa Đóng gói một nhóm những lớp đóng vai trò “sản xuất” (Factory) trong ứng dụng, đây là những lớp được dùng để tạo lập các đối tượng. Các lớp sản xuất này có chung một giao diện lập trình được kế thừa từ một lớp cha thuần ảo gọi là “lớp sản xuất ảo”. - Cấu trúc mẫu

Figure 5.1

Trong đó: + AbstractFactory: là lớp trừu tượng, tạo ra các đối tượng thuộc 2 lớp trừu tượng là: AbstractProductA và AbstractProductB 81

+ ConcreteFactoryX: là lớp kế thừa từ AbstractFatory, lớp này sẽ tạo ra một đối tượng cụ thể. + AbstractProduct: là các lớp trừu tượng, các đối tượng cụ thể sẽ là các thể hiện của các lớp dẫn xuất từ lớp này.- Tình huống áp dụng + Phía trình khách sẽ không phụ thuộc vào việc những sản phẩm được tạo ra như thế nào. + Ứng dụng sẽ được cấu hình với một hoặc nhiều họ sản phẩm. + Các đối tượng cần phải được tạo ra như một tập hợp để có thể tương thích với nhau. + Chúng ta muốn cung cấp một tập các lớp và chúng ta muốn thể hiện các ràng buộc, các mối quan hệ giữa chúng mà không phải là các thực thi của chúng(interface).Ví dụ 6.1 Giả sử ta cần viết một ứng dụng quản lý địa chỉ và số điện thoại cho các quốc gia trên thế giới. Điạ chỉ và số địa thoại của mỗi quốc gia sẽ có 1 số điểm giống nhau và 1 số điểm khác nhau. Ta xây dựng sơ đồ lớp như sau:

Figure 5.2

Ta sẽ xây dựng các phương thức tạo Address, và PhoneNumber cụ thể trong các lớp USAAddressPho- neFactory, FrechAddressPhoneFactory. Với phương thực createProductAddress() của lớp AAddressPhoneFactory sẽ trả về đối tượng của lớp USAAddress. Với phương thực createProductAddress() của lớp FrechAddressPhoneFactory sẽ trả về đối tượng của lớp FrechAddressTương tự với PhoneNumber. AddressFactory.java public interface AddressFactory { 82 CHƯƠNG 5. BÀI 5: THIẾT KẾ MẪU (DESIGN PATTERN)

public Address createAddress(); public PhoneNumber createPhoneNumber(); } Address.java public abstract class Address { private String street; private String city; private String region; private String postalCode; public static final String EOL_STRING = System.getProperty("line.separator"); public static final String SPACE = " "; public String getStreet() { return street; } public String getCity() { return city; } public String getPostalCode() { return postalCode; } public String getRegion() { return region; } public abstract String getCountry(); public String getFullAddress() { return street + EOL_STRING + city + SPACE + postalCode + EOL_STRING; } public void setStreet(String newStreet) { street = newStreet; } public void setCity(String newCity) { city = newCity; } public void setRegion(String newRegion) { region = newRegion; } public void setPostalCode(String newPostalCode) { postalCode = newPostalCode; } } USAddressFactory.java public class USAddressFactory implements AddressFactory{ public Address createAddress(){ return new USAddress(); } public PhoneNumber createPhoneNumber(){ return new USPhoneNumber(); } } USAddress.java public class USAddress extends Address{ private static final String COUNTRY = "UNITED STATES"; private static final String COMMA = ","; public String getCountry(){ return COUNTRY; } public String getFullAddress(){ return getStreet() + EOL_STRING + getCity() + COMMA + SPACE + getRegion() + SPACE + getPostalCode() + EOL_STRING + COUNTRY + EOL_STRING; } 83

} Tương tự cho lớp PhoneNumber và USAPhoneNumber

5.1.1.2 Builder Pattern - Ý nghĩa Phân tách những khởi tạo các thành phần của một đối tượng phức hợp, để có thể cùng một khởi tạo mà có thể tạo nên nhiều định dạng khác nhau. - Cấu trúc mẫu

Figure 5.3

Trong đó: + Director: là lớp điều khiển tạo ra một đối tượng Product. + Builder: là lớp trừu tượng cho phép tạo ra đối tượng Product từ các phương thức nhỏ khởi tạo từng thành phần của Product + ConcreteBuilder: là lớp dẫn xuất của Builder, khởi tạo từng đối tượng cụ thể, lớp này sẽ khởi tạo đối tượng. - Tình huống áp dụng + Có cấu trúc bên trong phức tạp (đặc biệt là một biến là một tập các đối tượng liên quan với nhau). 84 CHƯƠNG 5. BÀI 5: THIẾT KẾ MẪU (DESIGN PATTERN)

+ Có các thuộc tính phụ thuộc vào các thuộc tính kháco Sử dụng các đối tượng khác trong hệ thống mà có thể khó khởi tạo hoặc khởi tạo phức tạp. - Ví dụ 6.2 Ta lại xét đối tượng Address, có các thành phần sau: Street, City và Region. Ta phân tách việc khởi tạo 1 đối tượng Address thành các phần : buildStreet, buildCity và buildRegion.

Figure 5.4

Trong đó: + AddressDirector: là lớp tạo ra đối tượng Address. + AddressBuilder: là lớp trừu tượng cho phép tạo ra 1 đối tượng Address bằng các phương thức khởi tạo từng thành phần của Addresso USAddressBuilder: là lớp tạo ra các Address. USAddressBuilder sẽ tạo ra địa chỉ theo chuẩn của USA. Address.java class Address(){ private String street; private String city; private String region; /** * @return the city */ public String getCity() { return city; } /** * @param city the city to set 85

*/ public void setCity(String city) { this.city = city; } /** * @return the region */ public String getRegion() { return region; } /** * @param region the region to set */ public void setRegion(String region) { this.region = region; } /** * @return the street */ public String getStreet() { return street; } /** @param street the street to set **/ public void setStreet(String street) { this.street = street; } } AddressBuilder.java abstract class AddressBuilder{ abstract public void buildStreet(String street){} abstract public void buildCity(String city){} abstract public void buildRegion(String region){} } USAddressBuilder.java class USAddressBuilder extends AddressBuilder { private Address add; public void buildStreet(String street){ add.setStreet(street); } public void buildCity(String city){ add.setCity(city); } public void buildRegion(String region){ add.setRegion(region); } public Address getAddress(){ return add; }} AddressDirector.java class AddressDirector{ public void Contruct(AddressBuilder builder, String street, String city, String region){ 86 CHƯƠNG 5. BÀI 5: THIẾT KẾ MẪU (DESIGN PATTERN)

builder.buildStreet(street); builder.buildCity(city); builder.buildRegion(region); } } Client.java class Client{ AddressDirector director = new AddressDirector(); USAddressBuilder b = new USAddressBuilder(); director.Contruct(b. “Street 01”, “City 01”, “Region 01”); Address add = b.getAddress(); }

5.1.2 Một số patten khác Chúng ta quy ước với nhau rằng “giao diện lớp” được hiểu như interface hoặc abstract class vì đây đơn thuần là các định nghĩa lớp.

5.1.2.1 Factory pattern Định nghĩa Factory Pattern định nghĩa một lớp (interface, abstract, class) đóng vai trò như một “nhà xưởng” có nhiệm vụ khởi tạo đối tượng “cụ thể” khi ứng dụng chạy. Tại thời điểm thiết kế đối tượng này được định nghĩa trừu tượng. - Ý nghĩa Định nghĩa một phương thức chuẩn để khởi tạo đối tượng, như là một phần của phương thức tạo, nhưng việc quyết định kiểu đối tượng nào được tạo ra thì phụ thuộc vào các lớp con. - Cấu trúc mẫu 87

Figure 5.5

Trong đó: + Creator là lớp trừu tượng, khai báo phương thức factoryMethod() nhưng không cài đặt. + Product cũng là lớp trừu tượng. + ConcreteCreatorA và ConcreteCreatorB là 2 lớp kế thừa từ lớp Creator để tạo ra các đối tượng riêng biệt. + ConcreteProductA và ConcreteProductB là các lớp kế thừa của lớp Product, các đối tượng của 2 lớp này sẽ do 2 lớp ConcreteCreatorA và ConcreteCreatorB tạo ra.- Tình huống áp dụng + Khi bạn muốn tạo ra một framework có thể mở rộng, có nghĩa là nó cho phép tính mềm dẻo trong một số quyết định như chỉ ra loại đối tượng nào được tạo ra. + Khi bạn muốn 1 lớp con, mở rộng từ 1 lớp cha, quyết định lại đối tượng được khởi tạo. + Khi bạn biết khi nào thì khởi tạo một đối tượng nhưng không biết loại đối tượng nào được khởi tạo. + Bạn cần một vài khai báo chồng phương thức tạo với danh sách các tham số như nhau, điều mà Java không cho phép. Thay vì điều đó ta sử dụng các Factory Method với các tên khác nhau.- Ví dụ 6.3 Ta xét lại ví dụ về các địa chỉ ở phần Abstract Pattern 88 CHƯƠNG 5. BÀI 5: THIẾT KẾ MẪU (DESIGN PATTERN)

Figure 5.6

Phân loại Factory Pattern được thiết kế theo một trong hai cách sau đây: - Based-class Factory Pattern: Mẫu này sử dụng tính chất thừa kế để phân loại các đối tượng được tạo ra. - Based-object Factory Pattern: Sử dụng mối quan hệ kết hợp để tham chiếu tới một đối tượng sẽ được tạo ra. Đối tượng được tạo ra sẽ trở thành một phần hay thuộc tính của lớp Factory. Chúng ta thường hay gặp loại này trong Abstract Factory Pattern được trình bày ở phần tiếp theo.

5.1.2.2 Abstract factory pattern Định nghĩa Abstract Factory cung cấp một giao diện lớp có chức năng tạo ra một tập hợp các đối tượng liên quan hoặc phụ thuộc lẫn nhau mà không chỉ ra đó là những lớp cụ thể nào tại thời điểm thiết kế. Về bản chất, Abstract Factory Pattern chỉ khác Factory Pattern ở chỗ bản thân đối tượng Factory không được chỉ ra cụ thể tại thời điểm thiết kế, tức nó là một giao diện hoặc lớp trừu tượng (interface, abstract). Nếu như Factory Patttern phân loại đối tượng dựa trên tham số đầu vào thì đối với Abstract Factory Pattern, thủ tục createObject() còn phụ thuộc thêm vào các yếu tố phụ khác như môi trường hệ điều hành chẳng hạn. Ứng với mỗi yếu tố phụ thứ hai ta có một lớp Factory cụ thể. Thiết kế động với Abstract Factory 89

Một trong những vấn đề gặp phải là khung giao diện Abstract Factory thường hay bị sửa đổi, thí dụ như bổ sung thủ tục chẳng hạn, khi đó các lớp cụ thể thực thi giao diện này sẽ phải được dịch và triển khai lại. Để giảm nhẹ vấn đề này người ta thường thiết kế giao diện Abstract Factory một cách linh động.

5.1.2.3 Singleton pattern (Static Factory Pattern) Định nghĩa Singleton Pattern đảm bảo một lớp chỉ có một thực thể (instance) duy nhất được tạo ra và đồng thời cung cấp một truy cập toàn cục đến đối tượng được tạo ra. Chúng ta xét trường hợp có nhiều đối tượng có cùng chung một số tính chất nào đó được tạo ra ứng với mỗi một yêu cầu từ các đối tượng khách (client), lúc này độ phức tạp sẽ tăng lên và ứng dụng sẽ chiếm dụng nhiều vùng nhớ hơn. Singleton Pattern là một giải pháp đặc biệt của Factory Pattern ở chỗ đối tượng sinh ra là điểm truy cập toàn cục “duy nhất” đối với mọi chương trình gọi đến, hay nói một cách khác tất cả các đối tượng khách gọi đến đều chia sẻ đối tượng được tạo ra. Ứng dụng rõ rệt nhất của Singleton Pattern có thể thấy trong dịch vụ web khi triệu gọi các đối tượng từ xa, ở đó đối tượng nằm trên server hoặc sẽ phục vụ chung cho tất cả các ứng dụng khách (singleton) hoặc sẽ chỉ đáp ứng một ứng dụng khách riêng lẻ nào đó rồi tự bị phá huỷ sau đó (single call). Về các mẫu thiết kế tiêu biểu trong nhóm cấu thành: Factory, Abstract Factory và Singleton, các bạn có thể tham khảo thêm tài liệu về phương pháp xây dựng cụ thể cũng như mã nguồn chương trình viết bằng C#.NET tại địa chỉ: http://www.codeproject.com/gen/desig...assFactory.asp2 Proxy pattern Định nghĩa Proxy Pattern là mẫu thiết kế mà ở đó tất cả các truy cập trực tiếp một đối tượng nào đó sẽ được chuyển hướng vào một đối tượng trung gian (Proxy Class). Nếu như Factory Pattern giúp quản lý đối tượng tốt hơn thì Proxy Pattern lại có nhiệm vụ bảo vệ việc truy cập một đối tượng thông qua Proxy, hay còn gọi là truy cập gián tiếp. Proxy được ủy quyền về phía ứng dụng khách cho phép tương tác với đối tượng đích theo những cách khác nhau; như gửi yêu cầu một dịch vụ nào đó, theo dõi trạng thái và vòng đời đối tượng, xây dựng lớp vỏ bảo vệ đối tượng... Thí dụ chúng ta phát hiện ra một đối tượng trong một thư viện DLL có thể bị khai thác truy cập vào một số trường quan trọng, khi đó chúng ta không thể mở mã nguồn thư viện đã được dịch để vá lỗ hổng, giải pháp lúc này là xây dựng một proxy ngăn chặn truy cập các trường đó và cuối cùng biên dịch lại thành một DLL mới. Phân loại Độ phức tạp của giải pháp sử dụng Proxy Pattern phụ thuộc vào tình huống bài toán đưa ra, chúng ta sẽ lần lượt tìm hiểu nguyên tắc làm việc của các proxy dưới đây: - Remote Proxy: Client truy cập qua remote proxy để tham chiếu tới một đối tượng được bảo vệ nằm bên ngoài ứng dụng (trên cùng máy hoặc máy khác) như dịch vụ Windows, dịch vụ web, ứng dụng ở xa... Mô hình này "che giấu" đối tượng được triệu gọi đang nằm ở rất xa đâu đó và client có vẻ như truy cập vào đối tượng nằm trên cùng một chuyên khu làm việc (domain). - Virtual Proxy: Virtual Proxy tạo ra một đối tượng trung gian mỗi khi có yêu cầu tại thời điểm thực thi ứng dụng, nhờ đó làm tăng hiệu suất của ứng dụng. - Monitor Proxy: Monitor Proxy sẽ thiết lập các ràng buộc bảo mật trên đối tượng cần bảo vệ, ngăn không cho client truy cập một số trường quan trọng của đối tượng. - Protection Proxy: Đối với proxy này thì phạm vi truy cập của các client khác nhau sẽ khác nhau. Protection Proxy sẽ kiểm tra các quyền truy cập của client khi có một dịch vụ được yêu cầu. - Cache Proxy: Cung cấp không gian lưu trữ tạm thời cho các kết quả trả về từ đối tượng nào đó, kết quả này sẽ được tái sử dụng cho các client chia sẻ chung một yêu cầu gửi đến và do đó làm tăng đáng kể hiệu suất chương trình. - Firewall Proxy: Bảo vệ đối tượng từ chối các yêu cầu xuất xứ từ các client không tín nhiệm. - Smart Reference Proxy: Là nơi kiểm soát các hoạt động bổ sung mỗi khi đối tượng được tham chiếu, ví dụ như kiểm soát vòng đời của đối tượng, lưu lại số lần tham chiếu vào đối tượng...

2http://www.codeproject.com/gen/design/CSharpClassFactory.asp 90 CHƯƠNG 5. BÀI 5: THIẾT KẾ MẪU (DESIGN PATTERN)

- Synchronization Proxy: Đảm bảo nhiều client có thể truy cập vào cùng một đối tượng mà không gây ra xung đột. Thực tế có rất nhiều tình huống khiến chúng ta phải nghĩ đến thiết kế này. Một synchronization proxy được thiết lập có thể kiểm soát được nhiều yêu cầu cập nhật dữ liệu một cách đồng thời, tại thời điểm bắt đầu cập nhật chỉ có một client với mức ưu tiên cao nhất giành được khoá để đánh dấu rằng các client khác cần phải chờ đến lượt. Synchronization proxy hoạt động rất hiệu quả và phổ biến trong thiết kế các bài toán đa tuyến. Một hiện tượng hay xảy ra với thiết kế này là khi một client nào đó chiếm dụng khoá khá lâu (và thậm chí là mãi mãi) khiến cho số lượng các client trong danh sách hàng đợi cứ tăng lên, và do đó hoạt động của hệ thống bị ngừng trệ, có thể dẫn đến hiện tượng “tắt nghẽn” là hiện tượng khoá được giữ vô thời hạn bởi một đối tượng nào đó. Trong trường hợp này người ta cải tiến thành mẫu thiết kế phức tạp hơn, đó là Copy-On-Write Proxy. - Copy-On-Write Proxy: Cope-On-Write Proxy đảm bảo rằng sẽ không có client nào phải chờ vô thời hạn. Thiết kế này rất phức tạp do đó chỉ nên ứng dụng Copy-On-Write Proxy thay thế Synchronization Proxy khi hệ thống được dự đoán sẽ thường xuyên bị ngừng trệ hoặc có hiện tượng “tắt nghẽn” xảy ra. Đặc điểm chung Proxy Pattern có những đặc điểm chung sau đây: • Cung cấp mức truy cập gián tiếp vào một đối tượng. • Tham chiếu vào đối tượng đích và chuyển tiếp các yêu cầu đến đối tượng đó. • Cả proxy và đối tượng đích đều kế thừa hoặc thực thi chung một lớp giao diện. Mã máy dịch cho lớp giao diện thường “nhẹ” hơn các lớp cụ thể và do đó có thể giảm được thời gian tải dữ liệu giữa server và client.

5.1.2.4 Adapter pattern Định nghĩa Adapter Pattern biến đổi giao diện của một lớp thành một giao diện khác mà các đối tượng client có thể hiểu được. Lớp với giao diện được tạo ra đó gọi là Adapter. Nguyên tắc cơ bản của Adapter Pattern nằm ở chỗ làm thế nào để các lớp với các giao diện không tương thích có thể làm việc được với nhau. Nguyên lý xây dựng Adapter Pattern khá đơn giản: chúng ta xây dựng một lớp với một giao diện mong muốn sao cho lớp đó giao tiếp được với một lớp cho trước ứng với một giao diện khác. Adapter Pattern không quản lý tập trung các đối tượng gần giống nhau như Factory Pattern, mà kết nối với nhiều lớp không có liên quan gì với nhau. Ví dụ lớp A sau khi thực thi giao diện của nó và vẫn muốn bổ sung các phương thức từ một lớp B nào đó, chúng ta có thể kết nối A với B thông qua hình thức kế thừa hoặc liên kết đối tượng như một thành phần. Adapter Pattern có sự giống nhau một chút với Proxy Pattern ở chỗ nó tận dụng tối đa tính chất “uỷ quyền” (delegation); lớp Adapter sẽ kết nối với một đối tượng nào đó gọi là Adaptee và Adapter sẽ được uỷ quyền truy cập vào Adaptee, lớp Adapter đóng vai trò như một kênh trung gian để client truy cập vào một số các thành phần quan trọng của lớp Adaptee. Đặc điểm • Adapter Pattern hướng tập trung vào giải quyết sự tương thích giữa hai giao diện đang tồn tại, giảm công sức viết lại mã lệnh xuống mức tối thiểu có thể được. • Tái sử dụng giao diện cũ và Adapter Pattern chỉ thực sự cần thiết khi mọi thứ đã được thiết kế từ trước. Phạm vi ứng dụng Adapter Pattern được ứng dụng trong các trường hợp: • Cần tích hợp một vài module vào chương trình. • Không thể sát nhập trực tiếp module vào chương trình (ví dụ như module thư viện đã được dịch ra .DLL, .CLASS...). • Module đang tồn tại không có giao diện mong muốn như:

• Cần nhiều hơn phương thức cho module đó. 91

5.1.2.5 Wrapper pattern Wrapper Pattern là một trường hợp đặc biệt của Adapter Pattern. Nếu một Adapter chỉ đơn thuần là “nhúng” (wrap) các lớp với các giao diện không tương thích với nhau để chúng có thể hoạt động cùng nhau thì có thể được gọi bằng tên riêng Wrapper Pattern. Khi đó lớp Adapter còn được gọi là lớp Wrapper. Đây là quan hệ “có một”, tức là một giao diện không tương thích có thể được nhúng vào thành một phần của một giao diện khác. Đặc điểm Đối tượng Wrapper mô phỏng tất cả các hành vi (hàm, thủ tục) của giao diện được nhúng bởi các hành vi với tên y hệt. Thí dụ nếu lớp được nhúng A có thủ tục SpecificRequest() thì lớp Wrapper cũng phải có thủ tục SpecificRequest() tham chiếu đến thủ tục cùng tên của A. (Ngoài ra đối tượng Wraper có thể được bổ sung các phương thức khác nếu cần thiết). Đặc điểm này được đưa ra dựa trên nguyên tắc thiết kế “Law of Demeter” nói rằng không nên tham chiếu một đối tượng sâu hơn một lớp. Các phương thức trong Adaptee được “nhúng” trong Wrapper bằng cách truyền lời gọi cùng với các tham số tới phương thức tương ứng trong Adaptee, và trả về kết quả giống như vậy. Các thành viên (thuộc tính, trường, sự kiện) được nhúng trong Wrapper có tính chất giống hệt như trong các lớp được nhúng (tên, kiểu dữ liệu, phạm vi truy cập...). Từ các đặc điểm ở trên, có thể thấy rằng Wrapper Pattern cho phép một module chương trình tương tác được trong một môi trường khác biệt với môi trường phát triển của module đó (ví dụ C++ và Java). Khác biệt giữa Wrapper Pattern và Adapter Pattern Sự khác biệt giữa Wrapper và Adapter nằm ở mục đích sử dụng: Adapter Pattern định hướng cho một đối tượng đang tồn tại có thể làm việc được với các đối tượng khác và biến đổi logic theo một cách thức nào đó, trong khi Wrapper Pattern chỉ đơn thuần cung cấp một giao diện kết hợp các đối tượng được xây dựng từ cùng một ngôn ngữ hoặc khác ngôn ngữ, trên cùng một hệ điều hành hoặc trên những hệ điều hành khác nhau. Proxy Adapter Pattern Nếu một lớp Adapter đóng thêm vai trò như một proxy bảo vệ cho Adaptee thì ta có mô hình Proxy Adapter Pattern, trong trường hợp này chúng ta có thể đặt tên lớp với nghĩa kết hợp, ví dụ BankProx- yAdapter. Bài này đưa ra một số mẫu thiết kế tiêu biểu giúp các bạn thấy được tầm quan trọng của design pattern trong việc nâng cao chất lượng phần mềm ở các yếu tố: hiệu suất ứng dụng, độ ổn định, tái sử dụng, tính bảo mật... Các bạn có thể tìm hiểu thêm về các mẫu thiết kế cao cấp khác ở rất nhiều tài liệu thiết kế phần mềm.

5.1.2.6 Prototype

- Ý nghĩa Giúp khởi tạo đối tượng bằng cách copy một đối tượng khác đã tồn tại (đối tượng này là “prototype” – nguyên mẫu).- Cấu trúc mẫu 92 CHƯƠNG 5. BÀI 5: THIẾT KẾ MẪU (DESIGN PATTERN)

Figure 5.7

Trong đó: + Prototype là lớp trừu tượng cài đặt phương thức myClone() là phương thức copy bản thân đối tượng đã tồn tại. + ConcretePrototype1 và ConcretePrototype2 là các lớp kế thừa lớp Prototype.- Tình huống áp dụng + Khi bạn muốn khởi tạo một đối tượng bằng cách sao chép từ một đối tượng đã tồn tại. - Ví dụ 6.4 93

Figure 5.8 94 CHƯƠNG 5. BÀI 5: THIẾT KẾ MẪU (DESIGN PATTERN) Chương 6

Bài 6: Công nghệ Hibernate

6.1 Công nghệ Hibernate1 6.1.1 Giới thiệu Trước khi tìm hiểu Hibernate là gì, chúng ta cần chuẩn bị một số kiến thức để làm nền tảng. Đầu tiên, chúng ta cần tìm hiểu "framework" là gì? Framework ngày nay được "lạm dụng" rất nhiều. Nhiều người hay gán một vài thứ là "framework" nhưng gán gọi như vậy có đúng không lại là một chuyện khác. Theo cộng đồng wikipedia, từ framework dùng trong phát triển phần mềm là một khái niệm dùng để chỉ những "cấu trúc hỗ trợ được định nghĩa" mà trong đó những dự án phần mềm khác có thể được sắp xếp vào đó và phát triển. Thông thường, một framework bao gồm những program hỗ trợ, code libs và một ngôn ngữ scripting nằm giữa các chương trình phần mềm khác để giúp phát triển và gắn những thành phần khác nhau trong dự án phần mềm lại với nhau. Tiếp theo, chúng ta cần tìm hiểu về "persistence layer". Như bạn đã biết, kiến trúc ứng dụng dụng phần mềm có nhiều loại. Có loại chỉ chạy trên một máy là đủ. Có chương trình muốn chạy được phải kết nối sang một máy khác (client-server). Một máy đóng vai trò như là người yêu cầu (client) và máy khác đóng vai trò kẻ phục vụ (server). Người ta sử dụng thuật ngữ "tier" để chỉ mỗi loại máy có vai trò khác nhau đó. Tier client để chỉ các máy đóng vai trò client và tier server để chỉ các máy đóng vai trò server. Và loại ứng dụng client-server là ứng dụng 2-tier (vì chỉ có 2 tier thôi). Tương tự như vậy theo sự phát triển như vũ bão của công nghệ phần cứng và phần mềm cộng với nhu cầu của các người dùng, doanh nghiệp và xã hội ngày càng lớn, chúng ta thấy có các ứng dụng 3-tier và n-tier để khắc phục nhược điểm của ứng dụng 2-tier và nhằm tăng sức mạnh xử lý cho ứng dụng. "Layer" là một khái niệm khác với "tier". Và chúng ta đừng lầm lẫn giữa "tier" và "layer". Tier thường gắn với phần cứng máy tính (về mặt physically) còn "layer" thì dính với vấn đề cách thức tổ chức bên trong của ứng dụng. Việc phân chia tier là "trong suốt" (transparent) đối với ứng dụng xét về mặt luận lý (logically). Điều này có nghĩa là khi chúng ta phát triển một ứng dụng, chúng ta không bận tâm đến các thành phần (component) sẽ triển khai (deploy) ra sao mà chỉ chú ý là chúng ta sẽ tổ chức ứng dụng thành những layer như thế nào. Ví dụ, một ứng dụng có thể chia làm 3 phần như sau: phần giao diện người dùng (UI layer), phần xử lý nghiệp vụ (business layer) và phần chứa dữ liệu (data layer). Cụ thể ra, business layer sẽ có thể chia nhỏ thành 2 layer con là business logic layer (chỉ quan tâm đến ý nghĩa của các nghiệp vụ, các tính toán mang nhằm thoả mãn yêu cầu của người dùng) và persitence layer. Persistence layer chịu trách nhiệm giao tiếp với data layer (thường là một hệ quản trị cơ sở dữ liệu quan hệ - Relational DBMS). Persistence layer sẽ đảm nhiệm các nhiệm vụ mở kết nối, truy xuất và lưu trữ dữ liệu vào các Relational DBMS. Việc phân chia như vậy có lợi ích là công việc sẽ được tách bạch ra. Người nào lo thiết kế và xử lý UI thì chỉ việc chú tâm vào công việc đó. Người lo business layer thì chỉ cần tập trung vào thiết kế và phát triển làm sao thoả mãn các requirement của khách hàng mà không phải chú tâm đến các khía cạnh hiện thực

1This content is available online at .

95 96 CHƯƠNG 6. BÀI 6: CÔNG NGHỆ HIBERNATE bên dưới thông thường liên quan đến technical issues. Còn người lo persistence layer thì chỉ việc chú trọng đến các khía cạnh hiện thực và giải quyết các technical issues mà thôi. Cũng như sẽ có những DBA (DB Administrators) lo việc cài đặt và tạo các objects trong các relational database. Như vậy, bạn đã hiểu ứng dụng được chia một cách logically thành các "layer" và bạn cũng hiểu được là persistence layer là một layer có nhiệm vụ kết nối Relational DBMSs và truy xuất, thao tác trên dữ liệu đã được lưu trữ cũng như lưu trữ dữ liệu mới vào chúng. Hibernate framework là một framework cho persistence layer. Và bạn có thể thấy rằng nhờ có Hibernate framework mà giờ đây khi bạn phát triển một ứng dụng bạn chỉ còn chú tâm vào những layer khác mà không phải bận tâm nhiều về persistence layer nữa. Tương tự như vậy nếu bạn có một UI framework, bạn sẽ không phải bận tâm nhiều về UI layer nữa. Và xét đến cùng, việc bạn quan tâm duy nhất là business logic layer của bạn có đáp ứng yêu cầu của khách hàng không hay thôi. Và đây là thông tin về Hibernate framework từ website chính thức của Hibernate: Hibernate là một dịch vụ lưu trữ và truy vấn dữ liệu quan hệ mạnh mẽ và nhanh. Hibernate giúp bạn phát triển các class dùng để lưu trữ dữ liệu theo cách thức rất là hướng đối tượng: association, inheritance, polymorphism, composition và collections. Hibernate cho phép bạn 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 khỏi bạn mà Hibernate còn đảm bảo cho bạn việc bạ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). Hibernate là một dự án open source chuyên nghiệp và là một thành phần cốt tuỷ của bộ sản phẩm JBoss Enterprise Middleware System (JEMS). JBoss, như chúng ta đã biết là một đơn vị của Red Hat, chuyên cung cấp các dịch vụ 24x7 về hỗ trợ chuyên nghiệp, tư vấn và huyấn luyện sẵn sàng hỗ trợ bạn trong việc dùng Hibernate.

6.1.2 Xây dựng ứng dụng với Hibernate. “Tier” và “Layer”: tier thường được gắn với phần cứng về mặt vật lý (physical) còn layer thì dính đến vấn đề cách thức tổ chức bên trong của ứng dụng. Việc phân chia tier là “trong suốt” (transparent) đối với ứng dụng về mặt luận lý (logical). Điều này có nghĩa là khi ta phát triển một ứng dụng, chúng ta không bận tâm đến các thành phần (component) sẽ triển khai (deploy) ra sao mà chỉ chú ý là chúng ta sẽ tổ chức ứng dụng thành những layer như thế nào. Một ứng dụng có thể được chia làm 3 phần như sau: giao diện người dùng (presentation layer), phần xử lý nghiệp vụ (business layer) và phần chứa dữ liệu (data layer). Cụ thể ra, business layer có thể được chia nhỏ thành hai layer con là business logic layer (các tính toán nhằm thỏa mãn yêu cầu người dùng) và persistence layer. Persistence layer chịu trách nhiệm giao tiếp với data layer (thường là một hệ quản trị cơ sở dữ liệu quan hệ - Relational DBMS). Persistence sẽ đảm nhiệm các nhiệm vụ mở kết nối, truy xuất và lưu trữ dữ liệu vào các Relational DBMS. 97

Figure 6.1: Kiến trúc của Hibernate

6.1.2.1 Dự án Hibernate Hibernate là một dự án open source chuyên nghiệp và là một thành phần cốt tuỷ của bộ sản phẩm JBoss Enterprise Middleware System (JEMS). JBoss, như chúng ta đã biết là một đơn vị của Red Hat, chuyên cung cấp các dịch vụ 24x7 về hỗ trợ chuyên nghiệp, tư vấn và huấn luyện sẵn sàng hỗ trợ bạn trong việc dùng Hibernate. Các thành phần của Hibernate project - Hibernate Core: Cung cấp các chức năng cơ bản của một persistence layer cho các ứng dụng Java với các APIs và hỗ trợ XML mapping metadata. 98 CHƯƠNG 6. BÀI 6: CÔNG NGHỆ HIBERNATE

- Hibernate Annotations: Các map class với JDK 5.0 annotations, bao gồm Hibernate Validator. - Hibernate EntityManager: Sử dụng EJB 3.0 EntityManager API trong JSE hoặc với bất kỳ JEE server nào. - Hibernate Tools: Các tool tích hợp với Eclipse và Ant dùng cho việc sinh ra các persistence object từ một schema có sẵn trong database (reverse-engineering) và từ các file hbm sinh ra các class java để hiện thực các persistence object, rồi Hibernate tự tạo các object trong database (forward-engineering). - NHibernate: Hibernate cho .Net framework. - JBoss Seam: Một Java EE 5.0 framework cho phát triển các ứng dụng JSF, Ajax và EJB 3.0 với sự hỗ trợ của Hibernate. Seam hiện rất mới và tỏ ra rất mạnh để phát triển các ứng dụng Web 2.0. Nó tích hợp đầy đủ tất cả các công nghệ "hot" nhất hiện nay. Thư viện: bạn có thể tìm ở lib của Hibernate Core 3.2.6 GA antlr.jarcglib.jarasm.jarasm-attrs.jarscommons-collections.jarcommons-logging.jarhibernate3.jarjta.jardom4j.jarlog4j.jarhsqldb.jarjtds- 1.2.jarservlet-2.3.1.jar Các bạn có thể vào địa chỉ: www.hibernate.org2 để download Hibernate Core 3.2.6 GA

6.1.2.2 Cấu hình Hibernate Hibernate được cấu hình theo hai bước: - Cấu hình service bao gồm: tham số kết nối CSDL, caching và tập các lớp persistent. - Cung cấp cho Hibernate các thông tin về các lớp được persist. Để giải quyết hai bước theo yêu cầu của Hibernate, chúng ta sẽ thảo luận từng vấn đề sau: - Tạo file cấu hình hibernate.cfg.xml. - Xây dựng các file định nghĩa ánh xạ để cung cấp cho Hibetnate các thông tin về các lớp persistent. - Các lớp được sử dụng để persist và rút trích các lớp. - Cấu hình nâng cao bao gồm: object caching và quản lý giao dịch.

• Cấu hình cơ bản

Hibernate cung cấp 2 phương pháp cấu hình: file properties theo chuẩn của Java được gọi là hiber- nate.properties và file có định dạng XML gọi là hibernate.cfg.xml. Chúng ta sẽ sử dụng file cấu hình XML để cấu hình các service của Hibernate. Nếu cả hai file hibernate.properties và hibernate.cfg.xml được tìm thấy trong classpath của ứng dụng thì hibernate.cfg.xml sẽ override lên các thiết lập được tìm thấy trong hibernate.properties. Trước khi cấu hình Hibernate, đầu tiên bạn nên xác định service giữ kết nối đến CSDL như thế nào. Kết nối đến CSDL có thể được cung cấp bởi Hibernate hoặc từ JNDI DataSource. Một phương pháp thứ ba là kết nối JDBC được cung cấp bởi người dùng.

6.1.2.3 Sử dụng kết nối JDBC được quản lý bởi Hibernate: Sau đây là file cấu hình mẫu sử dụng loại kết nối JDBC được quản lý bởi Hibernate:

1. 2. 5. 6. 7. uid 8. pwd 9. jdbc:mysql://localhost/db 10. com.mysql.jdbc.Driver

2http://www.hibernate.org/ 99

11. org.hibernate.dialect.MySQLDialect 12. 13. 14. 15. 16. 17.

Để sử dụng JDBC connection được cung cấp bởi Hibernate, file cấu hình yêu cầu 5 thuộc tính: connec- tion.driver_class, connection.url, connection.username, connection.password, dialect. Thuộc tính dialect bảo cho Hibernate biết SQL dialect nào được sử dụng để thao tác. Nó được sử dụng để đảm bảo các câu Hibernate Query Language (HQL) được chuyển đổi đúng với SQL dialect dưới CSDL. Hibernate cũng cần biết vị trí (đường dẫn tương đối so với classpath của ứng dụng) và tên của các mapping file - mô tả persistent classs.

6.1.2.4 Sử dụng JNDI DataSource Để sử dụng Hibernate với kết nối CSDL được cung cấp bởi JNDI DataSource, bạn cần thay đổi một vài chỗ trong file cấu hình như sau:

1. 2. 5. 6. 7. jdbc/myDataSource 8. org.hibernate.dialect.MySQLDialect 9. 10. 11. 12. 13. 14.

Bạn chỉ sử dụng loại cấu hình này khi sử dụng Hibernate với application server: Jboss, Web- Sphere...Thuộc tính connection.datasource phải có cùng giá trị với tên của JNDI DataSource trong cấu hình application server.

• Tạo định nghĩa ánh xạ

Các định nghĩa ánh xạ được gọi là mapping document, được sử dụng để cung cấp cho Hibernate các thông tin để lưu trữ các đối tượng đến CSDL quan hệ. Các file ánh xạ cung cấp các đặc tính như tạo lược đồ CSDL từ tập hợp các file ánh xạ. Các định nghĩa ánh xạ cho các đối tượng persistent có thể được lưu chung với nhau trong cùng một file. Phương pháp thích hợp hơn là định nghĩa cho mỗi đối tượng được lưu trong một file. Quy ước đặt tên cho các file ánh xạ là sử dụng tên của persistent class với phần mở rộng hbm.xml. Ví dụ: file ánh xạ cho lớp Event có tên là Event.hbm.xml.

1. 2. 100 CHƯƠNG 6. BÀI 6: CÔNG NGHỆ HIBERNATE

3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21.

File ánh xạ bắt đầu bằng hibernate-mapping element. Thuộc tính package thiết lập package mặc định cho lớp. Thuộc tính set, bạn cần cung cấp tên của lớp persistent khác như: Speaker và Attendee. Thẻ class bắt đầu định nghĩa ánh xạ cho lớp persistent xác định, thuộc tính table là tên của quan hệ (relational) được sử dụng để lưu các đối tượng. Element mô tả khóa chính của persistent class - tự động được phát sinh. Thuộc tính name định nghĩa các thuộc tính của persistent class sẽ được sử dụng để lưu giá trị của khóa chính. Element được sử dụng để xác định tên của lớp phát sinh khóa chính cho record mới khi lưu nó. Ở đây chúng ta sử dụng lớp native. Sau đây là danh sách các generator phổ biến được sử dụng trong Hibernate: - increment - phát sinh id (loại long, short hoặc int) là duy nhất chỉ khi không có tiến trình khác chèn dữ liệu vào cùng bảng. - identity - nó hỗ trợ cột id trong DB2, MySQL, MS SQL Server, Sybase và HypersonicSQL. Id được trả về có loại long, short hoặc int. - sequence - phát sinh sequence sử dụng một sequence trong DB2, PostgreSQL, Oracle, SAP DB, McKoi hoặc Interbase. Id được trả về có loại long, short hoặc int. - hilo - Bộ phát sinh hilo sử dụng thuật toán hilo để phát sinh id. - native - Nó sẽ chọn id, sequence hoặc hilo phụ thuộc vào khả năng CSDL phía dưới.Thuộc tính unsaved- value mô tả giá trị của thuộc tính id cho các thể hiện transient của lớp đó. Chương 7

Bài 7: Công nghệ Ajax

7.1 Công nghệ Ajax1 7.1.1 Quá trình phát triển công nghệ Web - Nguyên nhân xuất hiện công nghệ AJAX. Trước khi tìm hiểu về Ajax, chúng ta cùng xem xét quá trình phát triển các công nghệ Web, nguyên nhân và hoàn cảnh xuất hiện công nghệ Ajax.

7.1.1.1 Quá trình phát triển các công nghệ trong ứng dụng Web Ban đầu, các trang Web là tĩnh; người dùng gửi yêu cầu một tài nguyên nào đó, và server sẽ trả về tài nguyên đó. Các trang Web không có gì hơn là một văn bản được định dạng và phân tán. Đối với các trình duyệt, thì các trang Web tĩnh không phải là các vấn đề khó khăn, và trang Web lúc đầu chỉ để thông tin về các sự kiện, địa chỉ, hay lịch làm việc qua Internet mà thôi, chưa có sự tương tác qua các trang Web. Năm 1990, Tim Berners-Lee, tại CERN, đã sáng chế ra HTML (Hyper Text Markup Language), ngôn ngữ đánh dấu siêu văn bản. HTML rất đơn giản và dễ dùng, và nó trở thành một ngôn ngữ rất phổ biến và cơ bản. Tuy nhiên, không lâu sau đó, nhu cầu về các trang Web động, có sự tương tác ngày một tăng, chính vì thế sự ra đời các công nghệ Web động là một điều tất yếu. Sau đây là một số công nghệ Web động cơ bản:

7.1.1.1.1 CGI Giải pháp đầu tiên để làm các trang Web động là Common Gateway Interface (CGI). CGI cho phép tạo các chương trình chạy khi người dùng gửi các yêu cầu. Giả sử khi cần hiển thị các các mục để bán trên Web site – với một CGI script ta có thể truy nhập cơ sở dữ liệu sản phẩm và hiển thị kết quả. Sử dụng các form HTML đơn giản và các CGI script, có thể tạo các “cửa hàng” ảo cho phép bán sản phẩm cho khách hàng qua một trình duyệt. CGI script có thể được viết bằng một số ngôn ngữ từ Perl cho đến Visual Basic. Tuy nhiên, CGI không phải là cách an toàn cho các trang Web động. Với CGI, người khác có thể chạy chương trình trên hệ thống. Vì thế có thể chạy các chương trình không mong muốn gây tổn hại hệ thống. Nhưng dù vậy, cho đến hôm nay thì CGI vẫn còn được sử dụng.

7.1.1.1.2 Applet Tháng 5/1995, John Gage của hãng Sun và Andressen (nay thuộc Netscape Communications Corporation) đã công bố một ngôn ngữ lập trình mới có tên Java. Netscape Navigator đã hỗ trợ ngôn ngữ mới này, và một con đường mới cho các trang Web động được mở ra, kỷ nguyên của applet bắt đầu.

1This content is available online at .

101 102 CHƯƠNG 7. BÀI 7: CÔNG NGHỆ AJAX

Applet cho phép các nhà phát triển viết các ứng dụng nhỏ nhúng vào trang Web. Khi người dùng sử dụng một trình duyệt hỗ trợ Java, họ có thể chạy các applet trong trình duyệt trên nền máy ảo Java Virtual Machine (JVM). Dù rằng applet làm được nhiều điều song nó cũng có một số nhược điểm: thường bị chặn bởi việc đọc và ghi các file hệ thống, không thể tải các thư viện, hoặc đôi khi không thể thực thi trên phía client. Bù lại những hạn chế trên, applet được chạy trên một mô hình bảo mật kiểu sandbox bảo vệ người dùng khỏi các đoạn mã nguy hiểm. Có những lúc applet được sử dụng rất nhiều, nhưng nó cũng có những vấn đề nảy sinh: đó là sự phụ thuộc vào máy ảo Java JVM, các applet chỉ thực thi khi có môi trường thích hợp được cài đặt phía client, hơn nữa tốc độ của các applet là tương đối chậm vì thế applet không phải là giải pháp tối ưu cho Web động.

7.1.1.1.3 JavaScript Cùng thời gian này, Netscape đã tạo ra một ngôn ngữ kịch bản gọi là JavaScript. JavaScript được thiết kế để việc phát triển dễ dàng hơn cho các nhà thiết kế Web và các lập trình viên không thành thạo Java. (Microsoft cũng có một ngôn ngữ kịch bản gọi là VBScript). JavaScript ngay lập tức trở thành một phương pháp hiệu quả để tạo ra các trang Web động.Việc người ta coi các trang như là một đối tượng đã làm nảy sinh một khái niệm mới gọi là Document Object Model (DOM). Lúc đầu thì JavaScript và DOM có một sự kết hợp chặt chẽ nhưng sau đó chúng được phân tách. DOM hoàn toàn là cách biểu diễn hướng đối tượng của trang Web và nó có thể được sửa đổi với các ngôn ngữ kịch bản bất kỳ như JavaScript hay VBScript. Tổ chức World Wide Web Consortium (W3C) đã chuẩn hóa DOM, trong khi European Computer Man- ufacturers Association (ECMA) phê duyệt JavaScript dưới dạng đặc tả ECMAScript.

7.1.1.1.4 JSP/Servlet, ASP và PHP Cùng với Java, Sun đồng thời đưa ra một công nghệ mới gọi là servlet. Các đoạn mã Java sẽ không chạy phía client như với applet; chúng sẽ được chạy trên một ứng dụng phía server. Servlet cũng đồng thời phục vụ các CGI script. Servlet là một bước tiến lớn, nó đưa ra một thư viện hàm API trên Java và một thư viện hoàn chỉnh để thao tác trên giao thức HTTP.JavaServer Page (JSP) là một công nghệ lập trình Web của Sun, cùng với nó là một công nghệ khác của Microsoft - Active Server Pages (ASP), JSP là công nghệ đòi hỏi một trình chủ hiểu được Java. Microsoft đã nghiên cứu các nhược điểm của servlet và tạo ra ASP dễ dàng hơn để thiết kế các trang web động. Microsoft thêm các bộ công cụ rất mạnh và sự tích hợp rất hoàn hảo với các Web server. JSP và ASP có những nét tương đương vì chúng đều được thiết kế để phân tách qua trình xử lí khỏi quá trình biểu diễn. Có sự khác biệt về kỹ thuật, song cả hai đều cho phép các nhà thiết kế Web tập trung vào cách bố trí (layout) trong khi các nhà phát triển phần mềm thì tập trung vào các kỹ thuật lập trình logic.Tất nhiên Microsoft và Sun không độc quyền ở các giải pháp phía server. Còn có các công nghệ khác, trong đó phải kể đến là PHP (Hypertext Preprocessor) cho tới Cold Fusion. Các công nghệ

7.1.1.1.5 Flash Năm 1996, FutureWave đã đưa ra sản phẩm FutureSplash Animator. Sau đó FutureWave thuộc sở hữu của Macromedia, và công ty này đưa ra sản phẩm Flash. Flash cho phép các nhà thiết kế tạo các ứng dụng hoạt họa và linh động. Flash không đòi hỏi các kỹ năng lập trình cao cấp và rất dễ học. Cũng giống như các nhiều giải pháp khác Flash yêu cầu phần mềm phía client. Chẳng hạn như gói Shockwave Player plug-in có thể được tích hợp trong một số hệ điều hành hay trình duyệt.

7.1.1.1.6 DHTML Khi Microsoft và Netscape đưa ra các version 4 của các trình duyệt của họ, thì các nhà phát triển Web có một lựa chọn mới: Dynamic HTML (DHTML). DHTML không phải là một chuẩn của W3C; nó giống một bộ công cụ thương mại hơn. Trong thực tế nó là một tập hợp gồm HTML, Cascading Style Sheets (CSS), JavaScript, và DOM. Tập hợp các công nghệ trên cho phép các nhà pháp triển sửa đổi nội dung và cấu trúc của một trang Web một cách nhanh chóng. Tuy nhiên, DHTML yêu cầu sự hỗ trợ từ các trình duyệt. Mặc 103 dù cả Internet Explorer và Netscape hỗ trợ DHTML, nhưng các thể hiện của chúng là khác nhau, các nhà phát triển cần phải biết được loại trình duyệt nào mà phía client dùng. DHTML thật sự là một bước tiến mới, nhưng nó vẫn cần một sự qui chuẩn để phát triển. Hiện nay DHTML vẫn đang trên con đường phát triển mạnh.

7.1.1.1.7 XML Kể từ khi ra đời vào giữa năm 1990, eXtensible Markup Language (XML) của W3C dẫn xuất của SGML đã trở nên rất phổ biến. XML có mặt ở khắp nơi, Microsoft Office 12 cũng sẽ hỗ trợ định dạng file XML. Ngày nay chúng ta có rất nhiều dạng dẫn xuất của XML cho các ứng dụng Web (tất nhiên là có cả XHTML): XUL của Mozilla; XAMJ, một sản phẩm mã nguồn mở trên nền Java; MXML từ Macromedia; và XAML của Microsoft.

7.1.1.2 Công nghệ Web thế hệ thứ hai – Web 2.0 Được xem là một cuộc cách mạng trên thế giới mạng, thế hệ web mới có những thay đổi quan trọng không chỉ ở nền tảng công nghệ mà còn cả ở cách thức sử dụng - hình thành nên môi trường cộng đồng, ở đó mọi người cùng tham gia đóng góp cho xã hội "ảo" chứ không chỉ "duyệt và xem". Web 2.0 là gì? Làm sao phân biệt đâu là Web 1.0 đâu là Web 2.0? Thuật ngữ "Web 2.0" đang trở nên thịnh hành. Thực chất, Web 2.0 có nghĩa là sử dụng web đúng với bản chất và khả năng của nó. Mục tiêu đầu tiên của những người tiên phong xây dựng Internet là nhằm kết nối các nhà nghiên cứu và các máy tính của họ với nhau để có thể chia sẻ thông tin hiệu quả. Khi bổ sung World Wide Web (năm 1990), Tim Berners-Lee cũng nhằm mục tiêu tạo phương tiện cho phép người dùng tự do đưa thông tin lên Internet và dễ dàng chia sẻ với mọi người (trình duyệt web đầu tiên do Berners-Lee viết bao gồm cả công cụ soạn thảo trang web). Tuy nhiên, sau đó web đã phát triển theo hướng hơi khác mục tiêu ban đầu. Tuy có một số ngoại lệ nhưng thế giới Web 1.0 (thế hệ web trước Web 2.0) chủ yếu gồm các website "đóng" của các hãng thông tấn hay các công ty nhằm mục đích tiếp cận độc giả hay khách hàng hiệu quả hơn. Nó là phương tiện phát tin hơn là phương tiện chia sẻ thông tin. Chỉ đến gần đây, với sự xuất hiện của nhiều kỹ thuật mới như blog (hay weblog), wiki... web mới trở nên có tính cộng đồng (và cộng tác) hơn và trở nên gần hơn với sự kỳ vọng và khả năng thực sự của nó. Khái niệm WEB 2.0 đầu tiên được Dale Dougherty, phó chủ tịch của O’Reilly Media, đưa ra tại hội thảo Web 2.0 lần thứ nhất do O’Reilly Media và MediaLive International tổ chức vào tháng 10/2004. Dougherty không đưa ra định nghĩa mà chỉ dùng các ví dụ so sánh phân biệt Web 1.0 và Web 2.0: "DoubleClick là Web 1.0; AdSense là Web 2.0. Ofoto là Web 1.0; Flickr là Web 2.0. Britannica Online là Web 1.0; Wikipedia là Web 2.0. v.v...". Sau đó Tim O’Reilly, chủ tịch kiêm giám đốc điều hành O’Reilly Media, đã đúc kết lại 7 đặc tính của Web 2.0: 1. Web có vai trò nền tảng, có thể chạy mọi ứng dụng 2. Tập hợp trí tuệ cộng đồng 3. Dữ liệu có vai trò then chốt 4. Phần mềm được cung cấp ở dạng dịch vụ web và được cập nhật không ngừng 5. Phát triển ứng dụng dễ dàng và nhanh chóng 6. Phần mềm có thể chạy trên nhiều thiết bị 7. Giao diện ứng dụng phong phú Thoạt đầu, Web 2.0 được chú trọng tới yếu tố công nghệ, nhấn mạnh tới vai trò nền tảng ứng dụng. Nhưng đến hội thảo Web 2.0 lần 2 tổ chức vào tháng 10/2005, Web 2.0 được nhấn mạnh đến tính chất sâu xa hơn – yếu tố cộng đồng. Thực tế, ứng dụng trên web là thành phần rất quan trọng của Web 2.0. Hàng loạt công nghệ mới được phát triển nhằm làm cho ứng dụng trên web mạnh hơn, nhanh hơn và dễ sử dụng hơn, được xem là nền tảng của Web 2.0. Kiến trúc công nghệ của Web 2.0 hiện vẫn đang phát triển nhưng cơ bản bao gồm: phần mềm máy chủ, cơ chế cung cấp nội dung, giao thức truyền thông, trình duyệt và ứng dụng. 104 CHƯƠNG 7. BÀI 7: CÔNG NGHỆ AJAX

Cung cấp nội dung Bước phát triển đầu tiên và quan trọng nhất hướng đến Web 2.0 đó là cơ chế cung cấp nội dung, sử dụng các giao thức chuẩn hoá để cho phép người dùng sử dụng thông tin theo cách của mình (nghĩa là có khả năng tùy biến thông tin). Có nhiều giao thức được phát triển để cung cấp nội dung như RSS, RDF và Atom, tất cả đều dựa trên XML. Ngoài ra còn có các giao thức đặc biệt như FOAF và XFN dùng để mở rộng tính năng của website hay cho phép người dùng tương tác. Dịch vụ WEB Các giao thức truyền thông 2 chiều là một trong những thành phần then chốt của kiến trúc Web 2.0. Có hai loại giao thức chính là REST và SOAP. REST (Representation State Transfer) là dạng yêu cầu dịch vụ web mà máy khách truyền đi trạng thái của tất cả giao dịch; còn SOAP (Simple Object Access Protocol) thì phụ thuộc máy chủ trong việc duy trì thông tin trạng thái. Với cả hai loại, dịch vụ web đều được gọi qua API. Ngôn ngữ chung của dịch vụ web là XML, nhưng có thể có ngoại lệ. Một ví dụ điển hình của giao thức truyền thông thế hệ mới là Object Properties Broadcasting Protocol do Chris Dockree phát triển. Giao thức này cho phép các đối tượng ảo (tồn tại trên web) tự biết chúng "là gì và có thể làm gì”, nhờ vậy có thể tự liên lạc với nhau khi cần. Phần mềm máy chủ Web 2.0 được xây dựng trên kiến trúc web thế hệ trước nhưng chú trọng hơn đến phần mềm làm việc ở background. Cơ chế cung cấp nội dung chỉ khác phương thức cấp phát nội dung động (của Web 1.0) về danh nghĩa, tuy nhiên dịch vụ web yêu cầu tiến trình làm việc và dữ liệu chặt chẽ hơn. Các giải pháp phát triển theo hướng Web 2.0 hiện nay có thể phân làm hai loại: hoặc xây dựng hầu hết tính năng trên một nền tảng máy chủ duy nhất; hoặc xây dựng ứng dụng "gắn thêm" cho máy chủ web, có sử dụng giao tiếp API. AJAX là gì ? Sau đây là định nghĩa của Garrett về Ajax: AJAX là tập hợp của nhiều công nghệ với thế mạnh của riêng mình để tạo thành một sức mạnh mới. AJAX bao gồm: * Thể hiện web theo tiêu chuẩn XHTML và CSS, các chuẩn của W3C, được Firefox (Mozilla), Safari (Apple), Opera, Netscape 8.0 (nhân Firefox) hỗ trợ rất tốt. * Nâng cao tính năng động và phản hồi bằng DOM (Document Object Model); một chuẩn của W3C * Trao đổi và xử lý dữ liệu bằng XML và XSLT; cũng là một chuẩn của W3C * Truy cập dữ liệu theo kiểu bất đồng bộ (asynchronous) bằng XMLHttpRequest * Và tất cả các công nghệ trên được liên kết lại với nhau bằng JavaScript.

7.1.1.3 Các vấn đề nảy sinh và sự ra đời của AJAX Trước khi tìm hiểu tại sao Ajax lại được xem là "cứu tinh" của các ứng dụng Web, hãy thử phân tích những giới hạn của các ứng dụng web hiện tại khiến nó chưa thể thay thế cho các phần mềm phía client truyền thống. Chỉ cách đây vài năm, khi mà các dịch vụ web bùng nổ, người ta đã nghĩ đến một lúc nào đó tất cả các ứng dụng mà ta sử dụng sẽ là các ứng dụng Web thay vì các phần mềm chạy độc lập trên các máy tính đơn lẻ. Quả thật, với sự phát triển chóng mặt của mạng Internet cùng với những ưu điểm của các ứng dụng Web (truy cập tại mọi nơi, không cần nâng cấp,...), tương lai của các phần mềm chắc chắn sẽ gắn chặt với các ứng dụng Web, nếu không muốn nói là có thể sẽ bị thay thế. Tuy nhiên, cho đến giờ, giấc mơ đó vẫn chưa thành sự thật và người ta bắt đầu nghĩ rằng, có lẽ nó sẽ không bao giờ trở thành sự thật. Tại sao vậy? Bởi vì một trong những giới hạn quan trọng của các ứng dụng Web hiện tại là cách thức nó tương tác với người dùng. Khác với các phần mềm chạy độc lập ở máy khách có những khả năng dường như vô tận trong cách thức tương tác với người dùng, các ứng dụng Web bị giới hạn bởi chính nguyên lý hoạt động của nó: tất cả các giao dịch phải thực hiện thông qua phương thức giao dịch HTTP (HyperText Transport Protocol - Giao thức truyền tải qua các siêu liên kết). Để hiểu tại sao tính chất này lại trở thành một rào cản của các ứng dụng web, hãy phân tích cách thức hoạt động của các dịch vụ web hiện tại xử lý một tác vụ đơn giản như xóa email trong YahooMail. Ta đang duyệt qua hòm thư “Inbox” của Yahoo!Mail. Khi chọn một số email và nhấn nút Delete để xóa chúng 105

(chuyển vào thùng rác). Yahoo!Mail trước hết sẽ lấy danh sách các email được chọn (quá trình này chạy trên máy local), sau đó gửi danh sách này cùng với mã lệnh qua một siêu liên kết đến server của Yahoo, yêu cầu server thực hiện tác vụ xóa đối với các email đó và gửi lại trang web Yahoo!Mail với nội dung mới, rồi cập nhật để trình duyệt hiển thị. Việc gửi nhận yêu cầu này mất một khoảng thời gian trễ, nếu ta sử dụng ADSL thì thời gian này cũng không quá lâu, còn nếu dùng dịch vụ dial-up thì thời gian chờ đợi là rất lớn. Ta cũng sẽ phải trải qua một quá trình tương tự đối với các tác vụ khác, ví dụ như chuyển từ thư mục “Inbox”(hòm thư đến) sang “Sent” (hòm thư đi). Ta sẽ không bao giờ phải trải qua việc chờ đợi trên khi sử dụng các phần mềm chạy trên máy tính đơn lẻ: không bao giờ thấy phần mềm một khi đã được mở ra lại phải “vô hiệu” trong vài giây để cập nhật dù chỉ là một tác vụ đơn giản nhất, và ngay cả khi phần mềm cần thời gian xử lý một tác vụ nào đó thì ta vẫn thấy nó vẫn tương tác với người dùng. Nếu xét về khía cạnh khả năng ứng dụng trong các tác vụ hàng ngày thì hạn chế trên của các ứng dụng web là không thể chấp nhận được. Tất nhiên, bên cạnh rào cản về cách thức tương tác, các ứng dụng Web còn vấp phải nhiều giới hạn khác (ví dụ như bản thân việc phải hoạt động dựa trên các trình duyệt đã là một rào cản quan trọng) nhưng một khi chưa giải quyết được vấn đề trên thì các ứng dụng web sẽ không bao giờ có thể thay thể cho các phần mềm độc lập. Ajax ra đời là một giải pháp cho các ứng dụng Web hiện nay, và như ta nói, nó là một trong số các công nghệ Web thế hệ thứ hai.

7.1.2 Các thế mạnh của Ajax. Ajax là viết tắt của Asynchronous JavaScript And XML – công nghệ kết hợp hai tính năng mạnh của JavaScript được các nhà phát triển đánh giá rất cao:* Gửi yêu cầu (request) đến server * Phân tách và làm việc với XML Các ứng dụng Ajax xoay quanh một tính năng có tên là XMLHttpRequest. Ở các ứng dụng web truyền thống, khi người dùng có một cần thay đổi dữ liệu trên trang Web, yêu cầu thay đổi được gửi về server dưới dạng HTTP request (hay còn gọi postback), server sẽ xử lý yêu cầu này và gửi trả response chứa các thông tin dưới dạng HTML và CSS, trang HTML này sẽ thay thế trang cũ. Qui trình này được mô tả là nhấp-chờ và tải lại (click-wait-and-refresh): ví dụ người dùng sau khi nhấn một nút “Submit” trên trang web phải chờ cho đến khi server xử lý xong mới có thể tiếp tục công việc. 106 CHƯƠNG 7. BÀI 7: CÔNG NGHỆ AJAX

Figure 7.1: Mô hình tương tác trong một ứng dụng Web truyền thống

Ajax cho phép tạo ra một Ajax Engine nằm giữa giao tiếp này. Khi đó, các yêu cầu gửi resquest và nhận response do Ajax Engine thực hiện. Thay vì trả dữ liệu dưới dạng HTML và CSS trực tiếp cho trình duyệt, web server có thể gửi trả dữ liệu dạng XML và Ajax Engine sẽ tiếp nhận, phân tách và chuyển hóa thành XHTML + CSS cho trình duyệt hiển thị. Việc này được thực hiện trên client nên giảm tải rất nhiều cho server, đồng thời người sử dụng cảm thấy kết quả xử lý được hiển thị tức thì mà không cần nạp lại trang. Mặt khác, sự kết hợp của các công nghệ web như CSS và XHTML làm cho việc trình bày giao diện trang web tốt hơn nhiều và giảm đáng kể dung lượng trang phải nạp. Đây là những lợi ích hết sức thiết thực mà Ajax đem lại. 107

Figure 7.2: So sánh hai mô hình ứng dụng Web: truyền thống và sử dụng Ajax 108 CHƯƠNG 7. BÀI 7: CÔNG NGHỆ AJAX

Figure 7.3: Mô hình tương tác trong một ứng dụng Web dùng Ajax

Rõ ràng điểm khác biệt là thay vì phải tải cả trang web thì với AJAX ta chỉ cần tải về phần của trang Web muốn thay đổi. Điều này giúp cho ứng dụng web của phản hồi nhanh hơn, thông minh hơn. Ngoài ra, điểm đặc biệt quan trọng trong công nghệ Ajax nằm ở chỗ Asynchronous - bất đồng bộ - tức là gửi yêu cầu của mình tới server và tiếp tục thực thi tác vụ hiện tại mà không cần chờ trả lời. Khi nào server xử lý xong yêu cầu của, nó sẽ báo hiệu và ta có thể đón để thể hiện những thay đổi cần thiết.

7.1.3 Các công nghệ trong AJAX 7.1.3.1 Giới thiệu – CSS. JAX là một tập hợp các công nghệ bổ sung lẫn nhau. JavaScript có vai trò chất keo kết dính các ứng dụng lại với nhau. Giao diện người dùng được tạo và tái nạp bằng cách dùng JavaScript để điều khiển Document Object Model, tạo và tổ chức biểu diễn dữ liệu cho người dùng, đồng thời xử lí các tương tác trên chuột và bàn phím. Cascading Style Sheets (CSS) cung cấp một sự nhất quán trên cảm quan “look and feel” cho ứng dụng và khả năng thao tác mạnh mẽ với DOM. Đối tượng XMLHttpRequest (hay một cơ chế tương đương nào đó) được dùng để liên lạc một cách bất đồng bộ với server, đảm bảo việc gửi yêu cầu người dùng và tái nạp dữ liệu trong khi người dùng vẫn làm việc. Cascading Style Sheet – tạm dịch là bảng kiểu xếp chồng - là một phần không thể thiếu trong thiết kế Web, nó được dùng rất nhiều trong các ứng dụng Web truyền thống cũng như trong Ajax. Một stylesheet đưa ra cách kiểm soát các loại định dạng trực quan, nó có thể được áp dụng cho các thành phần riêng lẻ trên các trang. Hơn nữa, cho các thành phần định dạng trực quan như màu sắc, lề, hình nền, tính trong suốt, kích cỡ, stylesheet có thể xác định cách mà các phần tử được bố trí quan hệ với các phần tử khác và tương tác với người dùng, cho phép các hiệu ứng khá mạnh mẽ. Trong ứng dụng Web truyền thống, stylesheet cung cấp một cách hiệu quả để xác định cách thể hiện vị 109 trí và có thể được dùng lại trong nhiều trang web khác nữa.Với AJAX, stylesheet cung cấp một “kho chứa” các giao diện xác định trước có thể áp dụng cho các phần tử động với độ dài các đoạn mã nguồn là nhỏ nhất. CSS định dạng một trang web theo ba cách: 1. Sử dụng trực tiếp kèm với các thẻ HTML (Inline Style Sheet) 2. Định nghĩa trong một trang web (Internal Style Sheet). 3. Định nghĩa thành một file CSS riêng (External Style Sheet). Trang web của chúng ta sẽ tham chiếu đến file CSS này. Một quy tắc định dạng và bố trí gồm có hai phần: thành phần lựa chọn - selector và phần khai báo - style declaration. Selector đặc tả các phần tử được định dạng và bố trí, và style declaration khai báo các thuộc tính định dạng sẽ được áp dụng. Giả sử muốn tạo ra các dòng text trong level-1 heading trong tài liệu (đó là đoạn nằm trong thẻ H1) có màu đỏ. Có thể khai báo thuộc tính CSS như sau h1 {color: red} Các ưu điểm của CSS trong thiết kế weba. CSS giúp tiết kiệm được rất nhiều thời gian và công sức cho việc thiết kế web. Style trong phiên bản HTML 4.0 qui định cách thức thể hiện các thẻ. Style thường được lưu trong các file nằm ngoài trang web. Chúng giúp thay đổi cách thức định dạng và cách bố trí các trang web chỉ bằng cách thay đổi riêng file CSS. b. CSS cho phép điều khiển cách định dạng và cách bố trí của cùng lúc nhiều trang web với chỉ duy nhất một lần thay đổi tại một vị trí. c. Có thể định nghĩa nhiều style vào một thẻ HTML . CSS cho phép đưa các thông tin định nghĩa thẻ thông qua nhiều con đường khác nhau. Style có thể được qui định ở trong chỉ một thẻ HTML, được qui định trong một trang web hoặc ở trong một file CSS bên ngoài.d. Thứ tự áp dụng các định dạng Như trên đã nói, có thể sử dụng nhiều cách khác nhau để làm CSS. Điều gì sẽ xảy ra nếu áp dụng nhiều cách định dạng cho một thẻ HTML? Theo một cách chung nhất ra có thể nói các style sẽ được "xếp tầng" (cascade). Việc xếp tầng này tuân theo thứ tự ưu tiên giảm dần như sau:* Inline Style (Style được qui định trong một thẻ HTML cụ thể)* Internal Style (Style được qui định trong phần của một trang HTML)* External Style (style được qui định trong file CSS ngoài)* Browser Default (thiết lập mặc định của trình duyệt)

7.1.3.2 Cú pháp & thuộc tính CSS Style. 7.1.3.2.1 Cú pháp cơ bản của CSS Cú pháp của CSS gồm ba thành phấn:* Thành phần lựa chọn (thường là một thẻ HTML) (Selector)* Thuộc tính (Property)* Giá trị (Value)Thể hiện của cú pháp CSS Selector { Property1: Value1; Property2: Value2; } Selector có thể là các thẻ/nhóm thẻ HTML, các lớp khai báo, hay bằng định danh duy nhất của phần tử. Với các thẻ có sẵn trong HTML thì có thể khai báo ko có dấu chấm "." trước Selector. VD: HR {...} Các Selector tự đặt tên thì thêm dấu chấm "." trước tên Selector đó .navigator {...} Nếu các selector này dùng trong tag thì không cần kèm theo dấu chấm .... Nếu ở các thẻ html mà bạn sử dụng id thay cho việc dùng class:đặt class: .... đặt id: 110 CHƯƠNG 7. BÀI 7: CÔNG NGHỆ AJAX

.... Thì ở style trước selector bạn hãy thêm dấu #: #navigator {...} Khi chèn các đoạn mã CSS vào trang web, trình duyệt sẽ hiển thị trang web theo cách CSS đã qui định cho nó, có ba cách để chèn CSS vào trang web. External Style Sheet (sử dụng file CSS được định nghĩa thành trong file riêng) Mỗi trang web sử dụng file CSS ngoài này đều phải sử dụng thẻ . Thẻ được đặt bên trong thẻ . Internal Style Sheet (định nghĩa các style sheet ngay trong trang web)Trong trường hợp mỗi trang web của sử dụng các định dạng khác nhau, dùng Internal Style Sheet. Để định nghĩa Internal Style Sheet, sử dụng thẻ Internal Style Sheet(style được qui định ngay trong mỗi thẻ HTML) Đây là phương pháp kém hiệu quả nhất, không nên sử dụng phương pháp này vì đã làm mất các ưu điểm của CSS.

This is a paragraph

7.1.3.2.2 Các thuộc tính của CSS Style Mỗi phần tử trong trang HTML có thể được qui định theo nhiều kiểu. Một phần text của một phần tử có thể được quy định theo các thuộc tính color, font size, độ đậm của phông, và kiểu chữ sử dụng. Có rất nhiều tùy chọn được áp dụng cho thuộc tính trên. Ví dụ để qui định cho một paragraph: .robotic{ font-size: 14pt; font-family: courier new, courier, monospace; font-weight: bold; color: gray; }

7.1.3.3 DOM - Tìm kiếm & Tạo DOM Node. 7.1.3.3.1 Tìm kiếm một DOM Node Yêu cầu đầu tiên để làm việc trên DOM với JavaScript là đi tìm kiếm một phần tử để thay đổi. Trước hết cần bắt đầu tham chiếu qua nút gốc - root node, nút này thể hiện qua biến toàn cục document. Mỗi nút trong DOM là một nút con (hoặc nút con cấp hai, ba...) của document, nhưng cứ đi dần vào cây DOM, sẽ thấy một tài liệu phức tạp được biểu diễn bởi DOM, và việc tìm kiếm là rất khó khăn. Vì thế có các cách sau để tìm kiếm một nút nhanh chóng hơn. Mỗi phần tử HTML có một thuộc tính ID, ví dụ như:

hay

Mỗi một nút DOM có thể có một ID gán cho nó, và ID này có thể được dùng để tham chiếu tới nút qua hàm : 111

var hello=document.getElementById(’hello’); Trong một số trường hợp, cần duyệt qua cấu trúc cây từng bước một, mỗi nút DOM có một nút cha và nhiều nút con. Chúng có thể được truy cập bởi các thuộc tính parentNode và childNodes, thuộc tính parentNode trả về một đối tượng DOM node khác, trong khi childNodes trả về một mảng javascript: var children=empty.childNodes; for (var i=0;i

7.1.3.3.2 Tạo DOME NOTE Trong nhiều trường hợp cần tạo các nút mới và thêm nó vào tài liệu. JavaScript cung cấp một số phương thức để làm điều đó. Các phương thức chuẩn để tạo nút mới là document.createElement() và document.createTextNode(), phương thức createElement() có thể được dùng để tạo ra bất kỳ phần tử HTML nào, tham số là kiểu của loại thẻ HTML; var childEl=document.createElement("div"); createTextNode() tạo một nút thể hiện qua một đoạn text, thường được tìm thấy trong các thẻ về heading, div, paragraph, và list item. var txtNode=document.createTextNode("some text"); Chuẩn DOM coi các text node tách rời khỏi biểu diễn HTML. Chúng không có các stye để áp đặt cho trực tiếp và vì thế chúng yêu cầu ít bộ nhớ hơn. Một nút khi được tạo ra phải được gắn vào tài liệu trước khi hiển thị trên trình duyệt, phương thức appendChild() được dùng để thực hiện điều này el.appendChild(childEl); Ba phương thức createElement(), createTextNode(), và appendChild() cho phép thực hiện hầu hết các thao tác để thêm một nút vào tài liệu.Bổ sung thêm 1 ý là document.getElementById rất hay được sử dụng, do đó để nhanh chóng, người ta sử dụng shortcut $(id) để thay thế cho việc phải viết đầy đủ docu- ment.getElementById(id). Tạo shortcut này rất đơn giản: function $(id) { return document.getElementById(id);}

7.1.3.3.3 Thêm style vào tài liệu DOM cũng cung cấp các phương thức để chỉnh sửa style của các phần tử và tạo định dạng lại cho cấu trúc đã được định nghĩa trong stylesheet.Mỗi phần tử trong trang web có thể có nhiều giao diện trực quan có thể được áp đặt qua DOM, như vị trí, chiều dài và rộng, mằu sắc, canh lề và đường viền. Các trình duyệt ngày nay đều cung cấp các ràng buộc JavaScript cho phép thay đổi giao diện mức thấp và áp đặt các định dạng một cách nhất quán và dễ dàng với các lớp CSS. Thuộc tính className Ví dụ đoạn code sau sẽ áp đặt các quy tắc biểu diễn của lớp declared cho một nút: hello.className=’declared’; với hello tham chiếu tới một nút DOM.Thuộc tính styleVí dụ, đoạn mã sau bổ sung các thuộc tính style cho nút empty: empty.style.border="solid green 2px"; empty.style.width="200px";

7.1.3.3.4 Sử dụng thuộc tính innnerHTML Các phần tử DOM của các trình duyệt web đều hỗ trợ một thuộc tính gọi là innerHTML, cho phép các nội dung kiểu string tùy ý được gán cho các phần tử theo thuộc tính này, như trong đoạn mã sau function addListItemUsingInnerHTML(el,text){ el.innerHTML+="

"+text+"
";} 112 CHƯƠNG 7. BÀI 7: CÔNG NGHỆ AJAX

Trên đây ta vừa xét một cách sơ lược về JavaScript, CSS, và DOM. Chúng được tập hợp trong một công nghệ gọi là Dynamic HTML (DHTML), và có thể thấy Ajax sử dụng rất nhiều kỹ thuật DHTML. Như vậy, các bạn đã nắm được 2 công nghệ dùng trong AJAX: CSS và DOM. Chương 8

Bài 8: Mã nguồn mở

8.1 Mã nguồn mở1 8.1.1 Mở đầu Phầnmề mmáytính,phầnmềmtựdo,phầnmề mnguồnmở, phátminh- sáng chế,bảnquyề n,tổngchiphí sởhữuphầnmề m... vẫn là những thuật ngữ còn khá mới trong lịch sử phát triển cuả CNTT Việt nam. Thử hỏi một vài chuyên gia, bạn sẽ nhận được những lời giải thích khác nhau, tuỳ thuộc vào kinh nghiệm, sự hiểu biết và quan niệm cá nhân mỗi người ... theo kiểu “thấy bói xemvoi”. Để hiểu rõ các khái niệm trên, cách tốt nhất là ta hãy xem những gì mà cộng đồng phát triển và những nhà phân phối các phần mềm nguồn mở đang làm, so sánh công việc của họ với hoạt động kinh doanh của các công ty thương mại, công ty độc quyền trong lĩnh vực phát triển và mua bán quyền sử dụng phần mềm. Đặc trưng quan trọng nhất của phong trào phần mềm nguồn mở là việc phát triển và sử dụng các phần mềm nguồn mở mang tính tựdo, mởvà cộngđồ ng. Ban đầu, phần mềm nguồn mở chỉ là một phương thức trao đổi tri thức trong cộng đồng nhà phát triển, nhưng nay đã lớn mạnh và trở thành một trào lưu lan toả ra khắp thế giới, trở thành “điể mnóng” thu hút hầu hết các công ty phần mềm hàng đầu thế giới, từ IBM, Oracle, HP, cho đến Microsoft. Phầnmề mnguồnmở đang được sử dụng rộng rãi, ngay cả trong một số lĩnh vực quan trọng và nhạy cảm như tàichí nh,ngânhàng,anninh-quốcphòng,mạng- viễ nthôngvà nhất là trong khu vực chínhphủ. Có thể so sánh hiện tượng phầnmềmnguồnmởcủa những năm 2000 với sự bùng nổ của mạngInternetvà World-widewebnửa cuối những năm 90 thế kỷ trước. Xu thế thươngmạihoátrong phần mềm nguồn mở cũng là một sáng tạo mới cuả phong trào nguồn mở và là điều không thể đảo ngược, một khi các công ty lớn đã bắt đầu vào cuộc.

8.1.2 Tư tưởng chủ đạo và ảnh hưởng cuả phong trào nguồn mở Các chuyên gia tư vấn thường nói về lợií chtàichính, sựổnđịnhvàantoàn khi sử dụng phần mềm nguồn mở, nhưng cũng còn có nhiều lý do khác biện minh cho việc hoạch định chính sách quốc gia về phát triển và ứng dụng phần mềm nguồn mở trong đó quan trọng nhất là tư tưởng chủ đạo cuả phong trào phần mềm nguồn mở. “Phầnmề mnguồnmởlànhữngchươngtrìnhmáytí nhđượccungcấpcùng vớimãnguồn vàbảnquyề nsử dụngmãnguồn,chophép ngườisửdụngcóthể tựdo càiđặt,chỉnhsửavàphânphốilạichúngmàkhôngphảitrảchiphí bảnquyề nsở hữutrí tuệ cho cộng đồ ngcác tácgiả”. Tư tưởng trên tuy khá đơn giản nhưng lại có ảnh hưởng rất to lớn và sâu sắc đến tính kinhtế và tính năngđộngtrong sự phát triển cuả ngành côngnghiệ pphần mềmmáytínhhiện nay. Phần mềm nguồn mở, nhờ vào bản chất mở và quyền cho phép sử dụng mã nguồn, đã và đang làm thay đổi xu hướng độc quyền trong mô hình phát triển và kinh doanh phần mềm sở hữu riêng. Các mã nguồn phần mềm một khi được công bố

1This content is available online at .

113 114 CHƯƠNG 8. BÀI 8: MÃ NGUỒN MỞ và có thể chia sẻ rộng rãi, sẽ trở thành nguồn tài sản cộng đồng rất có giá trị cho mọi quốc gia, mọi doanh nghiệp và cá nhân. Hơn thế nữa, mô hình phát triển và kinh doanh phần mềm nguồn mở, với tư tưởng chia sẻ trithứcrộng lớn trên toàn thế giới, thật sự đã và đang đem lại những lợi ích vô cùng to lớn, là cơ hội có một không hai cho mọi quốc gia, mọi dân tộc đang phát triển như Việt nam ta có thể nhanh chóng thu hẹp khoảng cách số, để tiến kịp và hội nhập với thế giới.

8.1.3 Hài hoà phần mềm nguồn mở và phần mềm sở hữu riêng Ngành công nghiệ pphầnmề mcho đến gần đây vẫn coi mãnguồncủa phần mềm là tài sản sởhữuriê ngcuả các công ty, chứa đựng những bí mậtcôngnghệ và nguồngốcphátsinhlợinhuậntrongkinhdoanh. Khách hàng sử dụng các sản phẩm phần mềm sởhữuriê ngkhông thể mua mã nguồn cuả phần mềm, họ chỉ được mua quyề nsửdụngphần mềm với các điều kiện hạn chế và được kiểm soát chặt chẽ bởi pháp luật bảo hộ quyền sở hữu trí tuệ. Các phần mềm sở hữu riêng, hay nói đúng hơn các phần mềm có mã nguồn sở hữu riêng, không cho phép người dùng tự do thay đổi, chỉnh sửa, sử dụng các công cụ kỹnghệ ngược(reverse-ingeneering) để viết lại mã nguồn, cho dù họ có nhu cầu và có đủ khả năng để làm điều này. Việc chỉnh sửa, nâng cấp các phần mềm sở hữu riêng do đó chỉ có thể được thực hiện bởi chính nhà sản xuất, với chi phí đôi khi khá cao cho công việc này. Không thể phủ nhận mô hình kinh doanh vì lợi nhuận là động lực to lớn, giúp phát triển nhiều lĩnh vực sản xuất, dịch vụ, nâng cao năng xuất lao động, tạo nên sức cạnh tranh và sức sống cho các sản phẩm, trong đó có cả các sản phẩm trí tuệ. Tuy nhiên bên cạnh những ưu điểm cuả cơ chế thị trường, vẫn còn những vấn đề, những mặt trái cuả cơ chế thị trường mà chính chúng ta, một dân tộc đã trải qua nhiều biến động và thử thách qua các cuộc chiến tranh giải phóng dân tộc, giành độc lập mới có thể cảm nhận một cách sâu sắc nhất. Đó là chân lý “không có gì quý hơn độc lập và tự do”. Trong một cuộc Hội thảo khoa học gần đây ở thành phố Hồ Chí Minh, một học giả nước ngoài đã phát biểu với chúng tôi một nhận xét rất đáng suy nghĩ như sau: “Tôi rất cảm phục Việt nam đã dũng cảm dương cao ngọn cờ đấu tranh giành độc lập dân tộc trong quá khứ. Với một tinh thần và quyết tâm cao như vậy, tôi tin tưởng các bạn sẽ có những đóng góp tích cực cho tư tưởng và phong trào phần mềm nguồn mở ...” Những vấn đề nào đáng để cho chúng ta suy nghĩ khi tìm hiểu và so sánh phần mềm nguồn mở và phần mềm sở hữu riêng ? Các sản phẩm phần mềm sở hữu riêng về bản chất không cho phép chia sẻ. Các công ty đối thủ có sản phẩm cạnh tranh sẽ không có lựa chọn nào khác là phải “phátminhlạicáibánhxe”, để triển khai được những chức năng mà sản phẩm cạnh tranh khác đang có. Đôi khi công việc này được làm với dụng ý ràng buộc khách hàng với sản phẩm và nhà cung cấp, đòi hỏi họ phải trả thêm các chi phí, đôi khi khá cao. Trong nhiều trường hợp, khách hàng không còn có lựa chọn nào khác hơn việc phải chấp nhận những điều kiện bất lợi, bởi vì chi phí để sáng tạo lại sản phẩm có thể là rất lớn. Mô hình phát triển phần mềm sở hữu riêng chạy theo thị hiếu, thị trường và vì lợi nhuận như hiện nay đã khuyến khích nhiều công ty phần mềm, kể cả những công ty lớn như Microsoft, đưa ra các sản phẩm chưa hoàn thiện, còn có nhiều lỗi và kém về bảo mật. Sự thiếu vắng cuả các đối thủ cạnh tranh còn cho phép các công ty độc quyền xem nhẹ quyền lợi của khách hàng. Kiến trúc đóng của các phần mềm sở hữu riêng cũng là vấn đề đáng lưu ý, bởi vì phần lớn các lỗi trong phần mềm thường xuất phát từ kiến trúc kém hoàn thiện, chỉ do một nhóm kỹ sư của một công ty phát triển dù cho họ có thể là những người rất giỏi về kỹ thuật. Đây là một trong các nguyên nhân đẫn đến tình trạng khủnghoảngvề phần mềm hiện nay trên thế giới. Theo thống kê của tạp chí “NhàquảnlýCNTT” (CIO), trong năm 2001, các công ty thương mại lớn đã mất đi 78tỷ USD chỉ vì đã “lỡ” mua hay đầu tư vào những phần mềm bị lỗi, phần mềm chưa hoàn thiện và phần mềm không thể khai thác, sử dụng được theo đúng nhu cầu. Con số này còn lớn hơn tổng lợi nhuận của nhóm 500 công ty hàng đầu thế giới nằm trong danh sách Fortune 500, với tổng lợi nhuận hàng năm khoảng 60tỷ USD. Năm 2002, ngân sách liên bang Mỹ dành cho CNTT lên đến 59tỷ USD, tuy nhiên nhiều chuyên gia cho rằng có khoảng 80% trong số này đã bị tiêu tốn một cách phí phạm, trong đó có phần đáng kể là lỗi của phần mềm, lỗi về bảo mật, do sự phá hoạt của virus và chi phí để trang bị thêm các công cụ phần mềm bảo mật, phòng chống virus, v.v... 115

Tại Việt nam, tuy chưa có con số thống kê nào về hiệu quả sử dụng phần mềm, nhưng với như cầu sử dụng ngày càng nhiều phần mềm, trong đó đa số là các phần mềm sở hữu riêng, việc phải tôn trọng bản quyền phần mềm khi tham gia các định chế thương mại quốc tế sẽ dẫn đến tình trạng lãng phí tương tự.

8.1.4 Phần mềm và quyền sở hữu trí tuệ Một quan niệm sai lầm và phổ biến là phần mềm nguồn mở giống như “của chùa”, không có liên quan gì đến quyền sở hữu trí tuệ. Trong thực tế, các phần mềm máy tính, giống như mọi sản phẩm trí tuệ khác, luôn phát sinh quyền tác giả và được pháp luật bảo vệ. Tuy nhiên, tác giả của phần mềm nguồn mở cho phép mọi người tự do sử dụng sản phẩm của họ chỉ với một số hạn chế về bản quyền. Điều này có nghĩa là tác giả (hay đồng tác giả) của những phần mềm nguồn mở có toàn quyền đối với sản phẩm trí tuệ của họ, như quyền chuyển giao, mua bán, đăng ký phát minh, sáng chế, thay đổi điều kiện giấy phép về bản quyền. Khá nhiều công ty thương mại sau một thời gian phát triển sản phẩm theo mô hình nguồn mở đã chuyển qua kinh doanh sản phẩm nguồn mở bằng cách bán quyề nsửdụngmãnhịphâncủa phần mềm (binary software licence) kèm theo dịch vụ hỗ trợ, trong khi vẫn cung cấp mãnguồn theo một số giấy phép bản quyền phần mềm. a) Giấy phép GNU/GPL (General Public License): cho phép người dùng tự do sao chép, phân phối, thay đổi chương trình. Các hạn chế về bản quyền chỉ phát sinh khi người dùng chuyển giao sản phẩm cho người dùng khác. Cụ thể là: Việc phân phối sản phẩm theo giấy phép GPL phải kèm theo mã nguồn. Mọi thay đổi liên quan đến sản phẩm GPL cũng phải tuân thủ giấy phép GPL. Nhà phân phối không có quyền áp dụng các hạn chế trái với giấy phép GPL đối với người sử dụng. Người sử dụng san phẩm GPL cũng có những quyền sao chép, phân phối, chỉnh sửa phần mềm như người phân phôi. Giấy phép GPL ảnh hưởng tới khoảng 75% số dự án phần mềm nguồn mở, nó đảm bảo các sản phẩm nguồn mở không thể bị hạn chế khi chuyển giao hay trở thành các sản phẩm sở hữu riêng. b) Giấy phép kiểu BSD (Berkeley System Distribution): cho phép người sử dụng có nhiều quyền tự do đối với sản phẩm, ngoài một số ràng buộc: · Phải tôn trọng mã nguồn, tác giả và quyền tác giả cuả mã nguồn phần mềm. · Không cho phép ràng buộc các thiệt hại vì sử dụng phần mềm BSD (nếu có) với tác giả mã nguồn hay người cấp quyền. Với các điều kiện cuả giấy phép kiểu BSD, các sản phẩm phần mềm sở hữu riêng có thể sử dụng mã nguồn cuả phần mềm BSD. Ngay cả công ty Microsoft cũng đã sử dụng một số mã nguồn BSD trong sản phẩm thương mại cuả mình. Nhiều công ty bán phần mềm thương mại có kèm theo những phần mềm kiểu BSD như hệ điều hành FreeBSD, NetBSD, OpenBSD, Apache web server, Xfree86 Window System, Sendmail, .... Khác với GPL, giấy phép BSD không yêu cầu phải phân phối lại mã nguồn (đã sửa đổi) kèm theo sản phẩm thương mại và tất nhiên cũng không cho phép phân phối lại các sản phẩm này. Trên đây là thí dụ cuả hai trong số trên 50 giấy phép bản quyền liên quan đến phần mềm nguồn mở, và cũng chỉ có một hoặc hai giấy phép trong đó hạn chế việc thương mại hoá các sản phẩm nguồn mở. Có khá nhiều giấy phép nguồn mở khuyến khích việc thương mại hoá sản phẩm, nhiều giấy phép do chính các công ty phần mềm lớn như Sun, IBM, Apple cung cấp. Trong xu hướng cạnh tranh cuả thị trường sản phẩm sở hữu trí tuệ nói chung và phần mềm máy tính nói riêng, các đối thủ cạnh tranh thường áp dụng những chiến thuật kinh doanh để giành lợi thế về mình, đôi khi phát sinh những trường hợp kiện tụng liên quan đến bản quyền, kể cả bản quyền sở hữu trí tuệ liên quan đến phần mềm nguồn mở. Do đó vai trò định hướng và điều tiết của chính phủ trong lĩnh vực này là rất quan trọng, nhất là trong phạm vi quốc gia và lãnh thổ để bảo vệ và khuyến khích phát triển nền công nghiệp phần mềm nội địa.

8.1.5 Các động lực để phát triển phần mềm nguồn mở Vậy những động lực nào cần thiết cho pháttriể nphần mềm nguồn mở dùng cho ứngdụngnói riêng, và cho sự phát triển cuả cả ngành côngnghiệ pphầnmề m nói chung ? Liệu điều này có mâuthuẫnvới các quan niệm 116 CHƯƠNG 8. BÀI 8: MÃ NGUỒN MỞ và giá trị thực tiễn hiện nay về mô hình phát triển phần mềm sở hữu riêng đang tồn tại trên thế giới và ở Việt nam hay không ? Ngày nay, đã và đang có nhiều chính phủ cuả nhiều quốc gia cổ vũ và dành ưu tiên để phát triển và ứng dụng phần mềm nguồn mở, thông qua các chính sách về mua sắm sản phẩm, đầu tư phát triển và sử dụng các công nghệ mở. Nhưng nếu chỉ coi việc sửdụngphầnmề mnguồnmởnhư một giải pháp thay thế phần mềm sở hữu riêng và để tránh tình trạng độc quyền nâng giá, thì cơ chế thị trường sẽ là yếu tố điều tiết giúp trào lưu “phầnmềmnguồnmở” phát triển và chính phủ Việt nam có lẽ cũng không có nhiều lý do để ưu tư về hiện trạng hiện nay. Mộtđấtnướcmớibắt đầ upháttriể nCôngnghệ thôngtin,vớinộilựccònkháhạnchế nhưViệtnam khôngthể bỏquacơhộiđitiê nphongtrongpháttriểnphầnmề mnguồnmởvàứng dụngphầnmềmnguồnmởsẽgiúpmanglạilợií chthựcsự! Đây mới chính là thách thứccuả một dân tộc luôn khát khao tìm cho mình con đường đi tắt, đón đầu, đuổi kịp và vượt một số quốc gia khác trong khu vực và trên thế giới ! Sau đây là 10lý do ảnh hưởng đến việc hoạch định mục tiêu và định hướng chính sách quốc gia trong phát triển và ứng dụng phần mềm nguồn mở, giúp mang lại những giá trị địch thực cho nền công nghệ thông tin Việt nam. Các lý d o m a n g tí n h qu ốc gia ( k hông thể chậm trễ hơn ) : 1. Bảo đảm an ninh quốc gia. 2. Giúp phát triển tiềm lực CNTT trong nước. 3. Tiết giảm chi phí nhập khẩu phần mềm. 4. Cải thiện tình trạng vi phạm bản quyền phần mềm. 5. Cơ hội phát triển các sản phẩm nội địa và bản địa hoá. Các lý d o m a n g tí n h k i n h doa n h ( c ó đ i ề u ki ệ n và cần sự c huẩn b ị ): 1. Tiết giảm tổng chi phí sở hữu phần mềm. (khôngphải mọi lúcmọi nơi) 2. An toàn và bảo mật (còn tuỳthuộc vàotrình độ tiế p nhận công nghệ ) 3. Tránh sự phụ thuộc vào nhà cung cấp (đặcbiệttừ nướcngoài) Các lý d o m a n g t ín h x ã hội ( c ần sự t uy ê n truyề n , nâ n g c ao n hận t h ứ c ): 1. Giúp phổ cập các sản phẩm cuả công nghệ thông tin – truyền thông. 2. Giúp giáo dục ý thức công dân tôn trọng quyền sở hữu trí tuệ.

8.1.5.1 Bảo đảm an ninh quốc gia: Các sản phẩm phần mềm sở hữu riêng chỉ được phân phối với mã nhị phân, như các “hộp đen”, không cho phép chính phủ kiểm soát hoạt động bên trong cuả phần mềm. Việc phần phối mã nhị phân không kèm theo mã nguồn tuy có giúp bảo vệ bản quyền sở hữu trí tuệ của nhà sản xuất, nhưng cũng là lý do để người sử dụng hoài nghi về tính trung thực và những cam kết của họ trong thực tế. Liệu có “cổng hậu” nào được cố ý cài đặt bên trong các phần mềm sở hữu riêng hay không ? Dù cho có cam kết gì thì câu trả lời sẽ không bao giờ làm hài lòng chính phủ, vì thực tế, việc lợi dụng các “cổng hậu” do virus tạo ra trong một số sản phẩm (của Microsoft) đã kịp gây ra một số hậu quả ...

8.1.5.2 Giúp phát triển tiềm lực CNTT trong nước: Các nước mới bắt đầu phát triển CNTT như Việt nam luôn gặp phải vấn đề thiếu hụt về tiềm lực tài chính, nhân lực và công nghệ. Việc ưu tiên phát triển phần mềm nguồn mở không phải để giúp nền công nghiệp phần mềm hầu như chưa tồn tại cuả ta có sức cạnh tranh quốc tế, mà chính là để tạo ra cú hích ban đầu, giúp hình thành và phát triển công nghệ thông tin - truyền thông trong nước tới một mức độ đủ mạnh, đủ để ta làm chủ công nghệ, đủ điều kiện tiếp nhận lợi ích thực sự mà lĩnh vực công nghệ cao này đem lại cho đất nước. Yếu tố quan trọng cuả mô hình kinh doanh phần mềm nguồn mở là các công ty nội địa sẽ thu được lợi nhuận từ việc bán dịch vụ triển khai và hỗ trợ, chứ không phải từ bán sản phẩm, điều này sẽ giúp kích thích sự định hướng cuả các công ty vào nguồn mở. Có ba lý do chính để chứng minh cho luận điểm này: 1. Phầnmề mnguồnmởlàmgiảmkhoảngcáchxuấtphátbanđầu:Với bản chất mở và cho phép người sử dụng dễ dàng chỉnh sửa, thay đổi và qua đó học hỏi được công nghệ, các trường đại học và các công ty sử dụng nguồn mở sẽ dễ dàng tiến hành nghiên cứu, nắm bắt công nghệ, nâng cao trình độ nhân lực. Phần mềm sở 117 hữu riêng bản thân nó không thể cung cấp sự hấp dẫn này vì lý do bí mật thương mại, vì những hạn chế pháp lý về bản quyền, mức độ đầu tư, tiếp thị và thương mại hoá lớn khiến cho các công ty nội địa không thể tiếp cận công nghệ hay cạnh tranh. 2. Phầnmề mnguồnmởlàmôitrườnglýtưởngchođàotạovànghiêncứu:Tính mở và tính cộng đồng cuả nguồn mở là đảm bảo tốt cho việc tạo lập môi trường này. Các công cụ phát triển ứng dụng phong phú, các tài liệu công nghệ có thể tự do tải về từ mạng Internet, các kho mã nguồn do cộng đồng nguồn mở trên thế giới phát triển và cung cấp miễn phí là những tài sản to lớn, trị giá nghìn, hàng triệu đô la, hoàn toàn có thể thay thế các sản phẩm thương mại mà ta không phải bỏ tiền để mua. 3. Phần mềm nguồn mở là nguồn xây dựng các hệ thống mở và các chuẩn mở: Mỗi quốc gia, mỗi tổ chức khi lưu trữ, xử lý và trao đổi thông tin rất cần các chuẩn mực chung. Nếu phải sử dụng phần mềm sở hữu riêng để là chuẩn xử lý và lưu trữ dữ liệu thì quả là bất cập. Trên thực tế, Việt nam và một số quốc gia khác đã không sử dụng phiên bản địa phương hoá và cách thức xử lý ngôn ngữ bản địa cuả hệ điều hành cuả Microsoft. Chúng ta cũng đã trải qua kinh nghiệm không mấy tốt lành, khi bắt buộc phải thay đổi chuẩn quốc gia TCVN-3 sang TCVN- 6909, chỉ vì một số mã định dạng tiếng Việt (như ký tự ư) không thể hiển thị được trong các phiên bản tiếp theo cuả trình duyệt Internet Explorer trên hệ điều hành Microsoft.

8.1.5.3 Tiết giảm chi phí nhập khẩu phần mềm Một phần rất lớn lợi nhuận cuả nền công nghiệp phần mềm nằm tại một vài quốc gia và một vài công ty lớn: các hệ điều hành máy tính thương mại cuả IBM, HP, Sun Microsystems, Microsoft, các phần mềm ứng dụng kinh doanh và cơ sở dữ liệu cuả Oracle, SAP, PeopleSoft, Microsoft ..., các phần mềm phục vụ kỹ thuật cuả Adobe, Intergraph, Autodesk.... Phần đông các quốc gia đang phát triển phải mua các sản phẩm phần mềm cuả các quốc gia phát triển với chi phí khá cao, là gánh năng đáng kể cho nền kinh tế còn non yếu. Phần mềm nguồn mở, nếu được ứng dụng tốt, sẽ là giải pháp thay thế khá hiệu quả, hoặc cho dù không làm giảm đáng kế chi phí thì quốc gia đó cũng không phải bỏ nhiều ngoại tệ để nhập khẩu phần mềm: Mô hình kinh doanh phần mềm nguồn mở chủ yếu dựa trên dịch vụ, chứ không phải sản phẩm, sẽ giúp giải quyết vấn đề lao động trong nước, giúp các công ty nội địa tăng trưởng và nhà nước có thể tăng thu các khoản thuế từ dịch vụ (hiện nay, thuế xuất nhập khẩu phần mềm của Việt nam là 0%, thuế dịch vụ từ 5 - 10 %).

8.1.5.4 Cải thiện tình trạng vi phạm bản quyền phần mềm Vi phạm bản quyền phần mềm là vấn đề cuả khá nhiều quốc gia. Hiệp hội kinh doanh phần mềm quốc tế ước tính thiệt hại cuả ngành phần mềm năm 2002 từ vi phạm bản quyền lên tới 13.08 tỷ USD. Việt nam hiện có tỷ lệ vi phạm bản quyền phần mềm cao nhất thế giới, năm 2003 khoảng 95%. Đây là một cản trở lớn đối với chúng ta khi gia nhập Tổ chức Thương mại Quốc tế (WTO) và các định chế thương mại và tài chính khác. Các hiệp định song phương và đa phương mà Việt nam ký kết cũng nêu rõ các điều kiện liên quan đến việc bảo vệ quyền sở hữu trí tuệ. Sự kiện gần đây, các cơ quan chức năng cuả ta đã tiến hành xử phạt một số công ty bán máy tính cài đặt những phần mềm không có bản quyền là một bước đi bắt buộc. Tình trạng này nếu không có giải pháp khác phục sẽ là cản trở to lớn đến sự phát triển cuả bản thân ngành CNTT và đặc biệt ngành công nghiệp phần mềm nội địa. Phần mềm nguồn mở là một giải pháp hữu hiệu trong cuộc chiến chống lại tình trạng vi phạm bản quyền, nhờ vào chi phí khá thấp, điều kiện sử dụng rộng rãi về quyền sở hữu trí tuệ. Chúng ta hy vọng Việt nam sẽ có những bước tiến bộ đáng kể để cải thiện tình trạng vi phạm bản quyền phần mềm bằng cách mạnh dạn chuyển qua sử dụng phần mềm nguồn mở, trước mắt là trong các trưòng đại học, viện nghiên cứu, các cơ quan chính quyền, doanh nghiệp vừa và nhỏ.

8.1.5.5 Cơ hội phát triển các sản phẩm nội địa và bản địa hoá

Ở các quốc gia mà tiếng Anh không phải là phổ biến như Việt nam, rào cản ngôn ngữ là một điều đáng kể khiến cộng đồng dân cư không thể dễ dàng sử dụng máy tính và hưởng thụ trọn vẹn các thành quả mà 118 CHƯƠNG 8. BÀI 8: MÃ NGUỒN MỞ

CNTT và truyền thông mang lại. Vì lợi nhuận, không phải nhà cung cấp sản phẩm phần mềm nào cũng lưu tâm đầu tư phiên bản địa phương hoá cuả mình, điều này càng tạo thêm rào cản ứng dụng CNTT. Bản địa hoá là một trong các lĩnh vực mà phần mềm nguồn mở có ưu thế lớn. Người sử dụng phần mềm nguồn mở hoàn toàn có thể phát triển phiên bản địa phương hoá, với chi phí không phải là quá lớn. Thực tế thời gian qua, chỉ với nội lực cuả mình, nhiều công ty và nhiều nhóm phát triển phần mềm nguồn mở Việt nam đã tiến hành Việt hoá thành công nhiều bản Linux distro, góp phần phổ cập hệ điều hành nguồn mở này cho đông đảo công đồng. Cần chú ý rằng chương trình phổ cập tin học cho thanh niên Việt nam là một cơ hội lớn để chúng ta phát triển các phiên bản địa phương hoá (tiếng Việt) cuả các ứng dụng văn phòng, trình duyệt, thư điện tử, các sản phẩm phần mềm nguồn mở khác cho thanh niên nông thôn, vùng sâu vùng xa với trình độ ngoại ngữ khá hạn chế có thể tiếp cận được những thành tựu cuả CNTT và hưởng lợi từ những hoạt động này.

8.1.5.6 Tiết giảm tổng chi phí sở hữu phần mềm Việc sử dụng các phần mềm nguồn mở mà không phải trả chi phí bản quyền phần mềm, chỉ trả tiền cho các dịch vụ cài đặt, cấu hình, chỉnh sửa và đào tạo rõ ràng là một điều hấp dẫn lớn. Trên thực tế nhiều công ty khi chuyển qua sử dụng phần mềm nguồn mở đã thông báo những khoản tiết kiệm lớn: Intel tiết kiệm đến 200 triệu USD từ việc chuyển qua dùng GNU/Linux thay cho UNIX, Công ty Amazon tiết kiệm 17 triện USD khi sử dụng các máy chủ GNU/Linux. Đó chỉ là hai trong số hàng trăm các công ty lớn khác thông báo về sự tiết giảm tổng chi phí sở hữu khi chuyên qua phần mềm nguồn mở. Trong khu vực chính phủ, chỉ tính một thành phố nhỏ cuả Hoa kỳ (Largo) khi chuyên qua nguồn mở đã tiết giảm được 1 triệu USD/năm chi phí vận hành hệ thống IT, với hạ tầng IT sử dụng nguồn mở chỉ với 40% chi phí so với các hệ thống tương tự sử dụng phần mềm thưong mại. Chính phủ Thuỵ điển thông báo tiết kiệm đến 1 tỷ USD một năm, còn chính phủ Đan mạch cho biết khoản tiết kiệm vào khoảng 480 triệu đến 730 triện USD hàng năm. Tuy nhiên, không phải bao giờ chuyển qua nguồn mở cũng dễ chịu, nhất là khi thói quen con người lại gắn chặt với nếp suy nghĩ thực dụng và đôi khi bảo thủ.

8.1.5.7 An toàn và bảo mật thông tin Sẽ không có hệ thống máy tính nào là tuyệt đối an toàn, tuy nhiên những yếu tố như phương thức phát triển phần mềm, kiến trúc chương trình, những áp lực kinh doanh để chiếm lĩnh thị trường đôi khi ảnh hưởng khá lớn đến tính an toàn và bảo mật cuả hệ thống. Có thể liệt kê một vào yếu tổ cho thấy các hệ thống nguồn mở tương đối có nhiều ưu thế về bảo mật hơn, so với các hệ thống sở hữu riêng: · Thời gian khắc phục lỗi cuả một số phần mềm phát triển trên nền tảng nguồn mở nhanh hơn, tuy không phải mọi lúc mọi nơi. · Với nguồn mở và mô hình cộng đồng trong phát triển phần mềm nguồn mở, khả năng sinh lỗi cố tình hay vô tình sẽ giảm thiểu. · Các hacker hiện nay tập trung viết virus và tấn công các hệ điều hành thương mại như cuả Microsoft nhiều hơn vào các hệ điều hành nguồn mở. · Các công cụ an ninh và bảo mật trên nền nguồn mở là khá phong phú, ngược lại các công cụ tương tự cho các hệ điều hành thương mại khá đắt tiền.

8.1.5.8 Tránh sự phụ thuộc vào nhà cung cấp Sau một thời gian dài sử dụng sản phẩm cuả một công ty, người sử dụng có thể phát hiện ra rằng họ đã quá bị phụ thuộc vào các sản phẩm cuả công ty độc quyền, có thể dẫn tới tình trạng bị ép buộc phải nâng cấp phần mềm hay trang bị những tính năng mà họ không có nhu cầu sử dụng đến. Đã có một cuộc tranh luận liệu có nên triển khai phần mềm sở hữu riêng trong khu vực chính phủ hay không, vì điều này sẽ càng làm trầm trọng thêm tình trạng phụ thuộc tiếp tục vào những nhà cung cấp phần mềm sở hữu riêng. Một khi các chuẩn sở hữu riêng được thiết lập, thì người dùng cũng phải tuân theo các chuẩn đó. Khi mở rộng hệ thống, do yêu cầu về tính tương thích với chuẩn sở hữu riêng bắt buộc hệ thống phải có khuynh hướng ưu tiên đối với các nhà cung cấp phần mềm sở hữu riêng, từ đó xảy ra tình trạng bị phụ thuộc lâu dài. 119

8.1.5.9 Giúp phổ cập các sản phẩm cuả công nghệ thông tin – truyền thông Các tư tưởng mang tính tự do và cộng đồng của phần mềm nguồn mở luôn đi kèm theo các giá trị về mặt xã hội. Phần mềm, đặc biệt là phần mềm nguồn mở, tượng trưng cho tri thức con người về các quy luật, thủ tục và cách thức thao tác, xử lý dữ liệu. Trong hệ thống các giá trị mang tính xã hội ngày nay, tri thức giúp nâng cao năng xuất lao động, làm ra các sản phẩm có hiệu quả kinh tế cao luôn được nhà nước ưu tiên đầu tư để trở thành tài sản chung cuả quốc gia, cuả nhân loại, và sản phẩm trí tuệ này cần được chia sẻ một cách tự do và rộng rãi. Ý tưởng phổ biến các công cụ phát triển phần mềm theo hướng mở có đặc trưng đáng chú ý: việc khai thác hiệu quả các công cụ để tạo ra các sản phẩm có chất lượng, có tính cạnh tranh chỉ nên giới hạn bởi trình độ, kiến thức, kỹ năng và sức sáng tạo cuả nhà sản xuất, không nên bị ràng buộc bởi bản quyền sử dụng, giá cả chuyển giao công nghệ hoặc các áp đặt mang tính quyền lực cuả quốc gia hay công ty độc quyền. Yếu tố mang tính xã hội sâu sắc này trong các báo cáo gần đây, khi so sánh hai mô hình kinh doanh phần mềm nguồn mở và phần mềm sở hữu riêng, thường bị cố ý lờ đi, gây ra những ngộ nhận nơi người sử dụng.

8.1.5.10 Giúp giáo dục ý thức công dân tôn trọng quyền sở hữu trí tuệ Thông thường các hệ thống nguồn mở luôn sẵn sàng để cho bất cứ ai có nhu cầu có thể tìm hiểu và sử dụng, nên rất khó cho bất cứ công ty nào đòi hỏi quyền sở hữu riêng nhằm đạt được lợi thế cạnh tranh. Một công ty khi bỏ tiền để quảng cáo cho sản phẩm Linux sẽ mang lại lợi ích cho tất cả các công ty cung cấp các sản phẩm dựa trên Linux, bao gồm cả những đối thủ cạnh tranh. Do đó các nỗ lực tiếp thị, quảng bá, nâng cao nhận thức xã hội về phần mềm nguồn mở cần được nhà nước đầu tư và đẩy mạnh để phong trào nguồn mở mang tính cộng đồng. Thông qua hoạt động này, ý thức cộng đồng, ý thức công dân sẽ được nâng cao, nhất là những nhận thức đúng đắn và tôn trọng các giá trị cuả sản phẩm trí tuệ, cuả phần mềm và các lợi ích chung mà ứng dụng CNTT có thể mang lại cho xã hội. Lãnh đạo, các tổ chức và người dân sẽ có được định hướng rõ ràng hợn, mạnh dạn hơn trong các quyết định chọn mua sản phẩm phần mềm và dịch vụ kèm theo phù hợp với nhu cầu và khả năng cuả mình, giữa phần mềm thương mại và phần mềm nguồn mở, phần mềm trong nước sản xuất và phần mềm nhập khẩu. Đồng thời sẽ tránh được những hành vi thiếu ý thức và sự cố đáng tiếc như phát tán virus, ăn cắp mật khẩu và thông tin trên mạng cuả giới trẻ Việt nam. Đánh giá chung về các giá trị cuả phần mềm nguồn mở đã trình bày ở trên ta thấy chỉ có ba điểm mang ý nghĩa vì kinh doanh và lợi nhuận. Do đó khi quyết định lựa chọn phương án đầu tư phát triển hay mua sắm phần mềm, các nhà hoạch định chính sách cần có cái nhìn tổng thể hơn để tìm ra giá trị đích thực mà phần mềm nguồn mở có thể đem lại, nhất là những giá trị giúp phát triển bền vững ngành CNTT trong nước, hướng tới xuất khẩu phần mềm. Từ kinh nghiệm cuả một số quốc gia trong khu vực, chúng ta có thể tìm hiểu học tập một số mô hình sau về đào tạo nhân lực, tăng cường tiềm lực phát triển phần mềm nguồn mở: 1. Xây dựng các phòng máy tính chỉ trang bị phần mềm nguồn mở trong các cơ sở đào tạo, phổ cập tin học. Tiến tới đầu tư xây dựng những trung tâm tài năng về nguồn mở cấp thành phố, cấp quốc gia. 2. Thay đổi, điều chỉnh chương trình đào tạo về sử dụng máy tính nói riêng và công nghệ thông tin nói chung không dựa trên một môi trường cứng nhắc (hiện nay phần lớn chương trình phổ cập tin học, kể cả chương trình quốc gia đều được xây dựng dựa trên hệ điều hành và sản phẩm cuả Microsoft) 3. Mở rộng các hoạt động tuyên truyền xã hội, tổ chức các cuộc thi sản phẩm phần mềm nguồn mở. (cuộc thi Trí tuệ Việt nam năm 2004 đã có định hướng ưu tiên các sản phẩm nguồn mở hay sử dụng các thư viện nguồn mở) 4. Mở rộng các chương trình đào tạo và cấp chứng chỉ, kể cả chứng chỉ quốc tế theo định hướng nguồn mở. Khuyến khích các công ty đầu tư, xây dựng chương trình và triển khai các hoạt động đào tạo này. 5. Khuyến khích các dự án nghiên cứu phát triển phần mềm nguồn mở, ứng dụng nguồn mở trong các lĩnh vực nghiên cứu khác nhau như Sinh học, Vật lý, Hoá học, Môi trường, Y- dược, v.v... Các dự án nghiên cứu nhận kinh phí nhà nước khi mua sắm phần mềm ứng dụng cần ưu tiên lựa chọn phần mềm nguồn mở. Phần mềm nguồn mở không phải cây gậy thần giải quyết mọi vấn đề cuả quốc gia trong phát triển CNTT. Các lợi ích mà phần mềm nguồn mở mang lại tuy rõ nét, nhưng đòi hỏi phải có quyết tâm và sự phối hợp đồng bộ trong triển khai. 120 CHƯƠNG 8. BÀI 8: MÃ NGUỒN MỞ

Đó là thách thức lớn nhất và cũng là cơ hội lớn nhất cho chúng ta, một cơ hội đòi hỏi phải nỗ lực chạy đua với thời gian và tập trung tiềm lực cuả cả cộng đồng mới có thể trở thành hiện thực.

8.1.6 Một số dự án mã nguồn mở. 8.1.6.1 Giới thiệu về mã nguồn mở Joomla 8.1.6.1.1 Joomla là gì ? Joomla là một hệ quản trị nội dung mã nguồn mở. Joomla! được viết bằng ngôn ngữ PHP và kết nối tới cơ sở dữ liệu MySQL, cho phép người sử dụng có thể dễ dàng xuất bản các nội dung của họ lên Internet hoặc Intranet. Và do kết nối đến CSDL MySQL cho nên việc quản trị một website với Joomla trở nên rất dễ dàng. Joomla có các đặc tính cơ bản là: bộ đệm trang (page caching) để tăng tốc độ hiển thị, lập chỉ mục, đọc tin RSS (RSS feeds), trang dùng để in, bản tin nhanh, blog, diễn đàn, bình chọn, lịch biểu, tìm kiếm trong site và hỗ trợ đa ngôn ngữ. Với đặc tính dễ sử dụng của mình, cho dù bạn là một người lập trình web chuyên nghiệp, một người quản trị website hay chỉ đơn giản là một người mới làm quen với thiết kế web, bạn cũng có thể sử dụng Joomla để tạo 1 website cho mình. Và vì vậy, Joomla được sử dụng ở khắp mọi nơi trên thế giới, từ những website cá nhân cho tới những hệ thống website doanh nghiệp có tính phức tạp cao, cung cấp nhiều dịch vụ và ứng dụng. Joomla! có thể dễ dàng cài đặt, dễ dàng quản lý và có độ tin cậy cao. Và một đặc điểm hết sức nổi bật của Joomla là có mã nguồn mở, do đó việc sử dụng Joomla là hoàn toàn miễn phí cho tất cả mọi người trên thế giới. Ngoài ra, bạn có thể cùng nhau xây dựng và phát triển hệ thống này để cho nó ngày càng toàn diện hơn.

8.1.6.1.2 Vài nét về lịch sử của Joomla

Joomla là "sản phẩm anh em" với Mambo của tập đoàn Miro Software Solutions - Úc (hãng đang nắm giữ Mambo) với những người phát triển nòng cốt. Ban đầu công ty Miro đã phát triển Mambo theo dạng ứng dụng mã nguồn đóng. Đến tháng 4 năm 2001, công ty đã thông qua một chính sách bản quyền kép, nghĩa là phát hành Mambo theo cả giấy phép GPL. Đến ngày 17 tháng 8 năm 2005, do sự tranh chấp về mặt pháp lý cũng như mong muốn vào sự phát triển của Mambo dựa trên quỹ tài trợ và sự hỗ trợ của cộng đồng nên toàn bộ đội phát triển nòng cốt của Mambo đã rời khỏi dự án trong khi đang làm việc với phiên bản 4.5.3. Nhờ sự trợ giúp của Trung tâm Luật Tự do Phần mềm (Software Freedom Law Center - SFLC), 20 thành viên nòng cốt cũ của Mambo đã thành lập một tổ chức phi lợi nhuận khác lấy tên là Open Source Matters, để hỗ trợ về mặt tổ chức, pháp lý và kinh phí cho dự án mã nguồn mở còn chưa được đặt tên của họ. Ngay ngày hôm sau, 1000 người đã gia nhập diễn đàn OpenSourceMatters, hầu hết các bài viết cho diễn đàn đều khuyến khích và đồng tình với hành động của Nhóm Phát triển. Tin trên đã nhanh chóng được đăng tải trên các tạp chí newsforge.com, eweek.com và ZDnet.com. Trong một thông báo của Eddie (người đứng đầu dự án) 2 tuần sau đó, các nhóm đã được tổ chức lại và cộng đồng Joomla tiếp tục tăng trưởng. Tới ngày 1 tháng 9 năm 2005 tên mới của dự án đã được thông báo cho khoảng 3000 người theo dõi đội Phát triển và đến ngày 16 tháng 9 thì họ cho ra đời Joomla 1.0.

8.1.6.1.3 Các phiên bản hiện tại của Joomla Hiện Joomla! có 2 dòng phiên bản chính:• Joomla! 1.0.x: Phiên bản phát hành (ổn định) - Phiên bản phát hành đầu tiên: Joomla! 1.0.0 (15/09/2005). - Phiên bản phát hành mới nhất: Joomla! 1.0.13 (21/07/2007). • Joomla! 1.5.x: Phiên bản phát triển (chưa ổn định)o Phiên bản phát triển mới nhất: Joomla! 1.5 RC3 (ngày 6 tháng 10 năm 2007) 121

8.1.6.1.4 Kiến trúc Joomla gồm có 3 tầng hệ thống. Tầng dưới cùng là mức nền tảng, chứa các thư viện và các plugin (còn được biết với tên gọi mambot). Tầng thứ hai là mức ứng dụng và chứa lớp JApplication. Hiện tại tầng này gồm 3 lớp con: JInstallation, JAdministrator và JSite. Tầng thứ ba là mức mở rộng. Tại tầng này có các thành phần (component), mô đun (module) và giao diện (template) được thực thi và thể hiện.

8.1.6.1.5 Đối với người sử dụng cuối Việc cài đặt Joomla! khá dễ dàng và nhanh chóng, thậm chí cả đối với những lập trình viên nghiệp dư. Joomla có một cộng đồng người sử dụng và phát triển rất lớn và tăng trưởng không ngừng. Các thành viên và các lập trình viên rất nhiệt tình và sẵn sàng tư vấn, giúp đỡ khi người sử dụng gặp khó khăn. Joomla cung cấp giao diện web trực quan do vậy khá dễ dàng để thêm một nội dung mới hay một mục mới, quản lý các phòng ban, danh mục nghề nghiệp, ảnh các sản phẩm... và tạo không giới hạn số phần, mục, chuyên mục cũng như các nội dung của Website. Hiện tại ở Việt Nam chúng ta, cộng đồng Joomla đã và đang phát triển mạnh mẽ tại diễn đàn http://www.joomlaviet.org.

8.1.6.2 Cài đặt Joomla Bạn có thể cài đặt phiên bản Jomla 1.0.x hoặc 1.5 cho việc quản lý Website của mình. Tuy nhiên, phiên bản 1.5 đang trong giai đoạn xây dựng nên chưa hoàn thiện, trong khi đó phiên bản 1.0.13 là phiên bản hoàn thiện nhất của dòng 1.0.x, phiên bản này đã được xây dựng và phát triển nhiều module cũng như template cho bạn lựa chọn. Trong phạm vi bài viết này, người viết cũng sử dụng phiên bản Joomla 1.0.13.

8.1.6.2.1 Download Joomla và upload lên server Để download bộ source cài đặt Joomla, bạn có thể vào trang Joomlaviet.org, vinaora.com hoặc trực tiếp vào trang Joomlacode.org, sau đó chọn download từ các link có sẵn. Bộ source cài đặt này có dung lượng nhỏ (2.7MB - file .zip) do đó việc download rất nhanh chóng. Sau khi download xong bạn giải nén và lưu ý một điều là bạn phải xóa thuộc tính chỉ đọc (read only) của các tập tin và thư mục cài đặt. Nếu bạn không thực hiện điều này thì trong quá trình cài đặt của bạn sẽ bị thông báo lỗi do các thông số cài đặt không được cập nhật vào các file read only này. Bạn có thể dùng 1 công cụ FTP (file transfer protocol) để cho quá trình upload được nhanh hơn hoặc dùng công cụ upload mà host của bạn hỗ trợ (có thể upload file .zip và bung nén trực tiếp trên server sẽ nhanh hơn nếu host của bạn hỗ trợ điều này, tuy nhiên bạn sẽ gặp lỗi các file read only).

8.1.6.2.2 Cài đặt Joomla trên server Sau khi upload toàn bộ thư mục Joomla lên server. Bạn chỉ cần mở trình duyệt và gõ địa chỉ tên miền của website của mình, mọi bước cài đặt sẽ diễn ra theo trình tự được hướng dẫn. (Ở đây người viết dùng hostfree tại zymic.com để thử nghiệm. Bạn có thể dùng hostfree tại trang này với dung lượng và băng thông khá lớn). Bước 1: Joomla sẽ kiểm tra các thông số của host mà bạn đang sử dụng có phù hợp với những yêu cầu của Joomla hay không. Trong bước này, thông số nào mang màu đỏ là bạn cần điều chỉnh lại, hoặc báo với nhà cung cấp host để được điều chỉnh. Và một điều lưu ý nữa là khi chọn host để lưu trữ website Joomla bạn nên chọn máy chủ Linux với chế độ safe mode là off. Bước 2: Bạn được xem những quy định của giấy phép GNU/GPL Bước 3: Nhập các thông số của CSDL MySQL. (lưu ý host của bạn phải hỗ trợ CSDL MySQL) Bước 4: Thiết lập các thông số FTP cho site của bạn như tên host FTP, username, password để truy nhập FTP. Bước 5: Thiết lập cấu hình site Joomla của bạn như tên site, email của bạn và cài đặt những dữ liệu mẫu. 122 CHƯƠNG 8. BÀI 8: MÃ NGUỒN MỞ

Bước 6: Kết thúc - Ở bước này Joomla sẽ ghi các cấu hình của site vào file configuration.php. Nếu như quá trình ghi các thông tin cấu hình vào file này bị lỗi thì Joomla cho phép bạn copy đoạn mã cấu hình để bạn tạo một tập tin configuration.php và upload trở lên host. Lưu ý: tài khoản truy nhập hệ thống là admin; mật khẩu: mật khẩu mà bạn đã nhập ở bước 6. Đến đây bạn có thể vào website hoặc trang quản trị bằng cách ấn vào site hoặc admin. Lưu ý: sau khi cài đặt xong Joomla, bạn cần xóa thư mục Installation trên Host đi để hoàn tất quá trình cài đặt.

8.1.6.3 Các khái niệm, thuật ngữ trong Joomla Do kết nối với CSDL nên với một website bạn quản trị bằng Joomla bạn rất dễ dàng cập nhật thông tin trên nó và dễ dàng tương tác với người truy cập. Tuy nhiên có những khái niệm và thuật ngữ bạn cần nắm rõ trước khi quản trị với Joomla.

8.1.6.3.1 Một trong những khái niệm quan trọng khi quản trị site với Joomla là Section, Category và Content - Section: Có thể hiểu là các chuyên mục chính thuộc website của bạn muốn đề cập đến. - Category: Các danh mục con thuộc chuyên mục chính. - Content: Các bài viết thuộc danh mục con.

8.1.6.3.2 Module: Module là một trong 3 thành phần mở rộng chính của Joomla. Đó là một đoạn mã nhỏ thường được dùng để truy vấn các thông tin từ cơ sở dữ liệu và hiển thị các kết quả tìm được. Nó có thể được nạp vào một vị trí bất kỳ trên website (vị trí left, right, top, bottom... hoặc vị trí do người dùng định nghĩa); có thể hiện trên tất cả các trang của Website hay một số trang được ấn định. - Trong file index.php của site, các module được gọi ra bắt đầu bằng module, mỗi module được chứa trong 1 file php khác nhau và vị trí xuất hiện của module trong trang chính do bạn xử lý trong index.php. - Chúng ta có các module thông dụng: PHP Code: • Lastest News (mod_latestnews): Module hiển thị các tin mới nhất • Popu- lar News (mod_mostreads): Module hiển thị các bài được quan tâm nhiều nhất • Related Items (mod_related_items): Module hiển thị các bài viết liên quan • Random Im- age (mod_random_image): Module hiển thị các ảnh ngẫu nhiên • Search Module (mod_search): Mod- ule công cụ tìm kiếm • Login Module (mod_login): Module hiển thị form đăng nhập hệ thống • Stats Module (mod_stats): Module hiển thị các thông tin thống kê về hệ thống • Menu Module (mod_mainmenu): Module hiển thị các menu của website • Banners Mod- ule (mod_banners): Moudule hiển thị các banner quảng cáo Chương 9

Tài liệu tham khảo1

[1]. Ian Sommerville – Software Engineering 7th Ed- Addison wesley 2005 [2]. Leszek A, Bruc Lee Liong – Practical Software Engeneering a case study approach – Addison wesley 2005 – ISBN 0-321-20465-4 [3]. Juval Lo¨wy - Programming .NET Components, Second Edition, Copyright ©2005, 2003 O’Reilly Media, Inc. [4]. Jeffrey Hasan – Expert Service-Oriented Architecture in C#, 2004. [5]. James W. Cooper - Java Design Patterns A tutorial, Addison Wesley, 2000.

1This content is available online at .

123 124 Tham gia đóng góp

Tham gia đóng góp

Tài liệu: Đề cương: Các Ví Dụ Nâng Cao Công Nghệ Phần Mềm Biên soạn bởi: Khoa CNTT ĐHSP KT Hưng Yên URL: http://voer.edu.vn/content/col10330/1.1/ Giấy phép: http://creativecommons.org/licenses/by/3.0/

Module: "Lời mở đầu" Tác giả: Khoa CNTT ĐHSP KT Hưng Yên URL: http://voer.edu.vn/content/m18175/1.1/ Trang: 1 Bản quyền: Khoa CNTT ĐHSP KT Hưng Yên Giấy phép: http://creativecommons.org/licenses/by/3.0/

Module: "Giới thiệu và Định nghĩa" Tác giả: Khoa CNTT ĐHSP KT Hưng Yên URL: http://voer.edu.vn/content/m18693/1.1/ Trang: 3-4 Bản quyền: Khoa CNTT ĐHSP KT Hưng Yên Giấy phép: http://creativecommons.org/licenses/by/3.0/

Module: "Công cụ hợp lệ hoá dữ liệu trong Visual Basic" Tác giả: Khoa CNTT ĐHSP KT Hưng Yên URL: http://voer.edu.vn/content/m18832/1.1/ Trang: 4-8 Bản quyền: Khoa CNTT ĐHSP KT Hưng Yên Giấy phép: http://creativecommons.org/licenses/by/3.0/

Module: "Ngôn ngữ vấn tin cơ sở dữ liệu (Structure Query Language)" Tác giả: Khoa CNTT ĐHSP KT Hưng Yên URL: http://voer.edu.vn/content/m18836/1.1/ Trang: 8-10 Bản quyền: Khoa CNTT ĐHSP KT Hưng Yên Giấy phép: http://creativecommons.org/licenses/by/3.0/

Module: "Kết nối cơ sở dữ liệu sử dụng công nghệ ADO (ActiveX Data Objects)" Tác giả: Khoa CNTT ĐHSP KT Hưng Yên URL: http://voer.edu.vn/content/m18842/1.1/ Trang: 10-23 Bản quyền: Khoa CNTT ĐHSP KT Hưng Yên Giấy phép: http://creativecommons.org/licenses/by/3.0/

Module: "Truy xuất dữ liệu sử dụng công nghệ ADO" Tác giả: Khoa CNTT ĐHSP KT Hưng Yên URL: http://voer.edu.vn/content/m18848/1.1/ Trang: 23-37 Bản quyền: Khoa CNTT ĐHSP KT Hưng Yên Giấy phép: http://creativecommons.org/licenses/by/3.0/ Tham gia đóng góp 125

Module: "Giới thiệu" Tác giả: Khoa CNTT ĐHSP KT Hưng Yên URL: http://voer.edu.vn/content/m18855/1.1/ Trang: 39 Bản quyền: Khoa CNTT ĐHSP KT Hưng Yên Giấy phép: http://creativecommons.org/licenses/by/3.0/

Module: "Kiến trúc đa tầng" Tác giả: Khoa CNTT ĐHSP KT Hưng Yên URL: http://voer.edu.vn/content/m18857/1.1/ Trang: 39-41 Bản quyền: Khoa CNTT ĐHSP KT Hưng Yên Giấy phép: http://creativecommons.org/licenses/by/3.0/

Module: "Phát triển ứng dụng đa tầng" Tác giả: Khoa CNTT ĐHSP KT Hưng Yên URL: http://voer.edu.vn/content/m18870/1.1/ Trang: 41-45 Bản quyền: Khoa CNTT ĐHSP KT Hưng Yên Giấy phép: http://creativecommons.org/licenses/by/3.0/

Module: "Lập trình mạng" Tác giả: Khoa CNTT ĐHSP KT Hưng Yên URL: http://voer.edu.vn/content/m18875/1.2/ Trang: 47-57 Bản quyền: Khoa CNTT ĐHSP KT Hưng Yên Giấy phép: http://creativecommons.org/licenses/by/3.0/

Module: "Kiến trúc hướng dịch vụ (webservice)" Tác giả: Khoa CNTT ĐHSP KT Hưng Yên URL: http://voer.edu.vn/content/m18879/1.2/ Trang: 59-78 Bản quyền: Khoa CNTT ĐHSP KT Hưng Yên Giấy phép: http://creativecommons.org/licenses/by/3.0/

Module: "Thiết kế mẫu (Design Pattern)" Tác giả: Khoa CNTT ĐHSP KT Hưng Yên URL: http://voer.edu.vn/content/m18888/1.2/ Trang: 79-93 Bản quyền: Khoa CNTT ĐHSP KT Hưng Yên Giấy phép: http://creativecommons.org/licenses/by/3.0/

Module: "Công nghệ Hibernate" Tác giả: Khoa CNTT ĐHSP KT Hưng Yên URL: http://voer.edu.vn/content/m18913/1.2/ Trang: 95-100 Bản quyền: Khoa CNTT ĐHSP KT Hưng Yên Giấy phép: http://creativecommons.org/licenses/by/3.0/ 126 Tham gia đóng góp

Module: "Công nghệ Ajax" Tác giả: Khoa CNTT ĐHSP KT Hưng Yên URL: http://voer.edu.vn/content/m19515/1.3/ Trang: 101-112 Bản quyền: Khoa CNTT ĐHSP KT Hưng Yên Giấy phép: http://creativecommons.org/licenses/by/3.0/

Module: "Mã nguồn mở" Tác giả: Khoa CNTT ĐHSP KT Hưng Yên URL: http://voer.edu.vn/content/m19533/1.2/ Trang: 113-122 Bản quyền: Khoa CNTT ĐHSP KT Hưng Yên Giấy phép: http://creativecommons.org/licenses/by/3.0/

Module: "Tài liệu tham khảo" Tác giả: Khoa CNTT ĐHSP KT Hưng Yên URL: http://voer.edu.vn/content/m19517/1.1/ Trang: 123 Bản quyền: Khoa CNTT ĐHSP KT Hưng Yên Giấy phép: http://creativecommons.org/licenses/by/3.0/ Hoc lieu Mo Vietnam - Vietnam Open Educational Resources Học liệu mở Việt Nam là hỗ trợ việc quản lý, tạo, lưu trữ tài liệu giáo dục hiệu quả.